58 lines
1.3 KiB
JavaScript
58 lines
1.3 KiB
JavaScript
"use strict";
|
|
const tokenize = require("postcss/lib/tokenize");
|
|
|
|
function templateTokenize (input) {
|
|
let pos = input.quasis[0].start;
|
|
const quasis = input.quasis.filter(quasi => quasi.start !== quasi.end);
|
|
const tokenizer = tokenize.apply(this, arguments);
|
|
|
|
function tokenInExpressions (token, returned) {
|
|
const start = pos;
|
|
pos += token[1].length;
|
|
if (!quasis.some(quasi => start >= quasi.start && pos <= quasi.end) || (returned.length && token[0] === returned[0][0])) {
|
|
return true;
|
|
} else if (returned.length) {
|
|
back(token);
|
|
}
|
|
}
|
|
|
|
function back (token) {
|
|
pos -= token[1].length;
|
|
return tokenizer.back.apply(tokenizer, arguments);
|
|
}
|
|
|
|
function nextToken () {
|
|
const args = arguments;
|
|
const returned = [];
|
|
let token;
|
|
let line;
|
|
let column;
|
|
|
|
while (
|
|
(token = tokenizer.nextToken.apply(tokenizer, args)) &&
|
|
tokenInExpressions(token, returned)
|
|
) {
|
|
line = token[4] || token[2] || line;
|
|
column = token[5] || token[3] || column;
|
|
returned.push(token);
|
|
}
|
|
if (returned.length) {
|
|
token = [
|
|
returned[0][0],
|
|
returned.map(token => token[1]).join(""),
|
|
returned[0][2],
|
|
returned[0][3],
|
|
line,
|
|
column,
|
|
];
|
|
}
|
|
return token;
|
|
}
|
|
return Object.assign({}, tokenizer, {
|
|
back,
|
|
nextToken,
|
|
});
|
|
}
|
|
|
|
module.exports = templateTokenize;
|