earlgrey-runtime
Version:
Runtime for the Earl Grey programming language.
99 lines (79 loc) • 2.35 kB
JavaScript
var _util = require("../util");
var convertHTML = _util.convertHTML;
var normalize = _util.normalize;
function toDOM(tag, classes, attrs, children, raw) {
if (tag === null) {
if (children instanceof Node)
return children;
else
return document.createTextNode(String(children));
}
if (tag == "top") tag = "";
if (!tag && (equal(classes, []) && equal(attrs, {}))) {
if (children.length == 1)
return children[0];
else {
var node = document.createElement("div");
children.forEach(function (x) {
node.appendChild(x);
});
return node;
}
}
tag = tag || "div";
if (attrs.namespace)
var node = document.createElementNS(attrs.namespace, tag);
else
var node = document.createElement(tag);
if (attrs.id)
node.id = attrs.id;
if (classes.length > 0)
node.className = classes.join(" ");
if (raw) {
node.innerHTML = raw;
}
items(attrs).forEach(function (kv) {
if (kv[0].startsWith("on"))
node[kv[0]] = kv[1];
else if (kv[1] === true)
node.setAttribute(kv[0], "");
else if (kv[1] !== false)
node.setAttribute(kv[0], kv[1]);
});
children.forEach(function (c) {
node.appendChild(c);
});
return node;
}
function DOM(enode, converter) {
if (!converter)
converter = toDOM;
var res = convertHTML(enode, converter);
if (Array.isArray(res))
res = converter("top", [], {}, res, null);
return res;
}
function DOMNode(tags, props, children) {
if (!Array.isArray(children))
children = [children];
return toDOM.apply(null, normalize(tags, props, children));
}
function percentMacro(expr) {
var DOMNode = this.deps.DOMNode;
return ["multi",
["send", ["symbol", "="],
["data",
["send", ["symbol", "let"], ["symbol", "ENode"]],
DOMNode]],
["send",
["symbol", "%"],
["data", expr[1], expr[2]]]]
}
percentMacro.__deps = {DOMNode: "ENode"};
percentMacro.__path = __filename;
module.exports = DOM;
DOM.DOM = DOM;
DOM.toDOM = toDOM;
DOM.ENode = DOMNode;
DOM["%"] = percentMacro;
DOM.normalize = normalize;