数通智联化工云平台
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.

45 lines
1.1 KiB

2 years ago
"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;
}