2
0
mirror of https://github.com/tenrok/BBob.git synced 2026-06-20 20:00:33 +03:00

fix(parser): tokenizer error with quotemark strings

This commit is contained in:
Nikolay Kostyurin
2018-07-11 23:37:51 +02:00
parent 3119314b07
commit 7f400506d4
6 changed files with 64 additions and 6 deletions
+2 -1
View File
@@ -4,7 +4,8 @@
"packages/*" "packages/*"
], ],
"publishConfig": { "publishConfig": {
"access": "public" "access": "public",
"registry": "https://registry.npmjs.org/"
}, },
"version": "independent" "version": "independent"
} }
+4
View File
@@ -24,5 +24,9 @@
"rollup-plugin-commonjs": "^9.1.3", "rollup-plugin-commonjs": "^9.1.3",
"rollup-plugin-node-resolve": "^3.3.0", "rollup-plugin-node-resolve": "^3.3.0",
"xbbcode-parser": "^0.1.2" "xbbcode-parser": "^0.1.2"
},
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org/"
} }
} }
+5 -1
View File
@@ -219,7 +219,11 @@ class Tokenizer {
!isPrevBackslash) { !isPrevBackslash) {
this.flushAttrNames(); this.flushAttrNames();
} else if (!this.inTag()) { } else if (!this.inTag()) {
this.wordToken[Token.VALUE_ID] += getChar(charCode); if (!this.wordToken) {
this.wordToken = this.createWordToken(getChar(charCode));
} else {
this.wordToken[Token.VALUE_ID] += getChar(charCode);
}
} }
this.nextCol(); this.nextCol();
+10 -4
View File
@@ -167,9 +167,15 @@ const handleTagEnd = (token) => {
if (lastNestedNode) { if (lastNestedNode) {
appendNode(lastNestedNode); appendNode(lastNestedNode);
} else { } else if (options.onError) {
// eslint-disable-next-line no-console const tag = getTokenValue(token);
console.warn(`Inconsistent tag '${getTokenValue(token)}' on line ${getTokenLine(token)} and column ${getTokenColumn(token)}`); const line = getTokenLine(token);
const column = getTokenColumn(token);
options.onError({
message: `Inconsistent tag '${tag}' on line ${line} and column ${column}`,
lineNumber: line,
columnNumber: column,
});
} }
} }
}; };
@@ -228,8 +234,8 @@ const parseToken = (token) => {
* @return {Array} * @return {Array}
*/ */
const parse = (input, opts = {}) => { const parse = (input, opts = {}) => {
tokenizer = createTokenizer(input, parseToken);
options = opts; options = opts;
tokenizer = createTokenizer(input, parseToken);
nodes = []; nodes = [];
nestedNodes = []; nestedNodes = [];
@@ -34,6 +34,25 @@ describe('Tokenizer', () => {
expectOutput(output, tokens); expectOutput(output, tokens);
}); });
test('tokenize string with quotemarks', () => {
const input = '"Someone Like You" by Adele';
const tokens = tokenize(input);
const output = [
[TYPE.WORD, '"Someone', '0', '0'],
[TYPE.SPACE, ' ', '8', '0'],
[TYPE.WORD, 'Like', '8', '0'],
[TYPE.SPACE, ' ', '13', '0'],
[TYPE.WORD, 'You"', '13', '0'],
[TYPE.SPACE, ' ', '18', '0'],
[TYPE.WORD, 'by', '18', '0'],
[TYPE.SPACE, ' ', '21', '0'],
[TYPE.WORD, 'Adele', '21', '0'],
];
expectOutput(output, tokens);
});
test('tokenize tag as param', () => { test('tokenize tag as param', () => {
const input = '[color="#ff0000"]Text[/color]'; const input = '[color="#ff0000"]Text[/color]';
const tokens = tokenize(input); const tokens = tokenize(input);
+24
View File
@@ -42,6 +42,30 @@ describe('Parser', () => {
]); ]);
}); });
test('parse inconsistent tags', () => {
const ast = parse('[h1 name=value]Foo [Bar] /h1]');
expect(ast).toBeInstanceOf(Array);
expect(ast).toEqual(
[
{
attrs: {},
tag: 'h1',
content: []
},
'Foo',
' ',
{
tag: 'Bar',
attrs: {},
content: []
},
' ',
'/h1',
]
);
});
test('parse tag with value param', () => { test('parse tag with value param', () => {
const ast = parse('[url=https://github.com/jilizart/bbob]BBob[/url]'); const ast = parse('[url=https://github.com/jilizart/bbob]BBob[/url]');