|
|
|
|
@@ -808,18 +808,32 @@
|
|
|
|
|
return renderDOM(fn.body, local);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** True when the array expr is a render-only form (HTML tag, <>, raw!, ~comp). */
|
|
|
|
|
function _isRenderExpr(v) {
|
|
|
|
|
if (!Array.isArray(v) || !v.length) return false;
|
|
|
|
|
var h = v[0];
|
|
|
|
|
if (!isSym(h)) return false;
|
|
|
|
|
var n = h.name;
|
|
|
|
|
return !!(HTML_TAGS[n] || SVG_TAGS[n] || n === "<>" || n === "raw!" || n.charAt(0) === "~");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function renderComponentDOM(comp, args, env) {
|
|
|
|
|
var kwargs = {}, children = [];
|
|
|
|
|
var i = 0;
|
|
|
|
|
while (i < args.length) {
|
|
|
|
|
if (isKw(args[i]) && i + 1 < args.length) {
|
|
|
|
|
// Keep kwarg values as AST — renderDOM will handle them when the
|
|
|
|
|
// component body references the param symbol. Simple literals are
|
|
|
|
|
// eval'd so strings/numbers resolve immediately.
|
|
|
|
|
// Evaluate kwarg values eagerly in the caller's env so expressions
|
|
|
|
|
// like (get t "src") resolve while lambda params are still bound.
|
|
|
|
|
// Render-only forms (HTML tags, <>, ~comp) go through renderDOM instead.
|
|
|
|
|
var v = args[i + 1];
|
|
|
|
|
kwargs[args[i].name] = (typeof v === "string" || typeof v === "number" ||
|
|
|
|
|
typeof v === "boolean" || isNil(v) || isKw(v))
|
|
|
|
|
? v : (isSym(v) ? sxEval(v, env) : v);
|
|
|
|
|
if (typeof v === "string" || typeof v === "number" ||
|
|
|
|
|
typeof v === "boolean" || isNil(v)) {
|
|
|
|
|
kwargs[args[i].name] = v;
|
|
|
|
|
} else if (_isRenderExpr(v)) {
|
|
|
|
|
kwargs[args[i].name] = renderDOM(v, env);
|
|
|
|
|
} else {
|
|
|
|
|
kwargs[args[i].name] = sxEval(v, env);
|
|
|
|
|
}
|
|
|
|
|
i += 2;
|
|
|
|
|
} else {
|
|
|
|
|
children.push(args[i]);
|
|
|
|
|
|