You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.1 KiB
44 lines
1.1 KiB
"use strict";
|
|
|
|
const htmlparser = require("htmlparser2");
|
|
const jsTokens = require("js-tokens");
|
|
|
|
const OPEN_BRACE = "{".charCodeAt(0);
|
|
|
|
module.exports = class JsxLikeTokenizer extends htmlparser.Tokenizer {
|
|
stateBeforeAttributeValue(c) {
|
|
if (c === OPEN_BRACE) {
|
|
const startIndex = this.index;
|
|
const endIndex = getIndexOfExpressionEnd(this.buffer, startIndex + 1);
|
|
if (endIndex != null) {
|
|
this.sectionStart = startIndex;
|
|
this.index = endIndex + 1;
|
|
|
|
this.cbs.onattribdata(this.sectionStart, this.index);
|
|
this.sectionStart = -1;
|
|
this.cbs.onattribend(1 /* QuoteType.Unquoted */, this.index);
|
|
this.state = 8 /* BeforeAttributeName */;
|
|
this.stateBeforeAttributeName(this.buffer.charCodeAt(this.index));
|
|
return;
|
|
}
|
|
}
|
|
super.stateBeforeAttributeValue(c);
|
|
}
|
|
};
|
|
|
|
function getIndexOfExpressionEnd(source, startIndex) {
|
|
let index = startIndex;
|
|
let braceStack = 0;
|
|
for (const token of jsTokens(source.slice(startIndex))) {
|
|
if (token.value === "}") {
|
|
if (braceStack === 0) {
|
|
return index;
|
|
}
|
|
braceStack--;
|
|
} else if (token.value === "{") {
|
|
braceStack++;
|
|
}
|
|
index += token.value.length;
|
|
}
|
|
return null;
|
|
}
|
|
|