marko/benchmark/vdom/codegen-create/codegen-marko-vdom.js
2020-02-24 16:48:25 -08:00

64 lines
1.3 KiB
JavaScript

function indentStr(level) {
var str = "";
for (var i = 0; i < level; i++) {
str += " ";
}
return str;
}
module.exports = function(node) {
var code = "";
function codegenEl(node, level) {
if (level === 0) {
code += "createElement";
} else {
code += ".e";
}
var attrsMap = {};
var attributes = node.attributes;
for (var i = 0; i < attributes.length; i++) {
var attr = attributes[i];
attrsMap[attr.name] = attr.value;
}
code += `(${JSON.stringify(node.nodeName)}, ${JSON.stringify(attrsMap)}, ${
node.childNodes.length
})\n`;
// codegenAttrs(node.attributes, level + 1);
var curChild = node.firstChild;
while (curChild) {
codegen(curChild, level + 1);
curChild = curChild.nextSibling;
}
}
function codegenText(node) {
code += `.t(${JSON.stringify(node.nodeValue)})\n`;
}
function codegen(node, level) {
code += indentStr(level);
if (node.nodeType === 1) {
codegenEl(node, level);
} else if (node.nodeType === 3) {
codegenText(node, level);
}
}
codegen(node, 0);
return "return " + code + "\n";
};
module.exports.generateInitCode = function() {
return `
var MarkoVDOM = window.MarkoVDOM;
var createElement = MarkoVDOM.createElement;
`;
};