blear.classes.template
Version:
72 lines (57 loc) • 1.75 kB
JavaScript
/**
* 语法解析器
* @link https://github.com/aui/art-template
* @author ydr.me
* @create 2018-04-17 13:52
* @update 2018-04-17 13:52
*/
;
var array = require('blear.utils.array');
var TYPE_STRING = 'string';
var TYPE_EXPRESSION = 'expression';
var lineRE = /[\n\r]/;
module.exports = function (template, regular, statement) {
var snippets = [];
var flags = regular.ignoreCase ? 'ig' : 'g';
var pattern = regular.source + '|^$|[\\w\\W]';
var snippetRE = new RegExp(pattern, flags);
var matches = template.match(snippetRE);
var line = 0;
var start = 0;
var end = 0;
var begin = 0;
var pushSinppet = function (isExpression, value, expression) {
var snippet = {
index: snippets.length,
type: isExpression ? TYPE_EXPRESSION : TYPE_STRING,
file: null,
value: value,
expression: expression,
start: start,
end: end,
line: line,
begin: begin
};
snippets.push(snippet);
return snippet;
};
for (var step = 0; step < matches.length; step++) {
var value = matches[step];
var length = value.length;
var expressionMatches = value.match(regular);
end += value.length;
var snippet = pushSinppet(expressionMatches, value);
if (expressionMatches) {
snippet.expression = statement.apply(snippet, array.from(expressionMatches));
}
var lineLength = value.split(lineRE).length;
line += lineLength - 1;
start += length;
if (lineRE.test(value)) {
begin = 0;
} else {
begin += length;
}
}
return snippets;
};