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:
+2
-1
@@ -4,7 +4,8 @@
|
|||||||
"packages/*"
|
"packages/*"
|
||||||
],
|
],
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public",
|
||||||
|
"registry": "https://registry.npmjs.org/"
|
||||||
},
|
},
|
||||||
"version": "independent"
|
"version": "independent"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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]');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user