uparser
Version:
The uhtml template parser
44 lines (33 loc) • 1.42 kB
JavaScript
var uparser = (function (exports) {
'use strict';
var attr = /([^\s\\>"'=]+)\s*=\s*(['"]?)$/;
var empty = /^(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)$/i;
var node = /<[a-z][^>]+$/i;
var notNode = />[^<>]*$/;
var selfClosing = /<([a-z]+[a-z0-9:._-]*)([^>]*?)(\/>)/ig;
var trimEnd = /\s+$/;
var isNode = function isNode(template, i) {
return 0 < i-- && (node.test(template[i]) || !notNode.test(template[i]) && isNode(template, i));
};
var regular = function regular(original, name, extra) {
return empty.test(name) ? original : "<".concat(name).concat(extra.replace(trimEnd, ''), "></").concat(name, ">");
};
var index = (function (template, prefix, svg) {
var text = [];
var length = template.length;
var _loop = function _loop(i) {
var chunk = template[i - 1];
text.push(attr.test(chunk) && isNode(template, i) ? chunk.replace(attr, function (_, $1, $2) {
return "".concat(prefix).concat(i - 1, "=").concat($2 || '"').concat($1).concat($2 ? '' : '"');
}) : "".concat(chunk, "<!--").concat(prefix).concat(i - 1, "-->"));
};
for (var i = 1; i < length; i++) {
_loop(i);
}
text.push(template[length - 1]);
var output = text.join('').trim();
return svg ? output : output.replace(selfClosing, regular);
});
exports.default = index;
return exports;
}({}).default);