marko/benchmark/vdom/codegen-create/codegen-react.js
2016-11-02 20:23:42 -06:00

71 lines
1.7 KiB
JavaScript

function indentStr(level) {
var str = '';
for (var i=0; i<level; i++) {
str += ' ';
}
return str;
}
module.exports = function(node) {
function codegenChildNodes(node, level) {
var curChild = node.firstChild;
if (!curChild) {
return 'null';
}
var code = '[\n';
var childLevel = level + 2;
while(curChild) {
code += indentStr(childLevel) + codegen(curChild, childLevel);
curChild = curChild.nextSibling;
if (curChild) {
code += ',\n';
} else {
code += '\n';
}
}
code += indentStr(level + 1) + ']';
return code;
}
function codegenEl(node, level) {
var attributesMap = null;
var attributes = node.attributes;
if (attributes.length) {
attributesMap = {};
for (var i=0; i<attributes.length; i++) {
var attr = attributes[i];
var attrName = attr.name;
var attrValue = attr.value;
if (attrName === 'class') {
attrName = 'className';
}
attributesMap[attrName] = attrValue;
}
}
return `React.createElement(${JSON.stringify(node.nodeName)}, ${JSON.stringify(attributesMap)}, ${codegenChildNodes(node, level)})`;
}
function codegen(node, level) {
if (node.nodeType === 1) {
return codegenEl(node, level);
} else if (node.nodeType === 3) {
return JSON.stringify(node.nodeValue);
}
}
return 'return ' + codegen(node, 0) + '\n';
};