"use strict";
var runtimeHtmlHelpers = require("../../../../runtime/html/helpers");
var attr = runtimeHtmlHelpers.a;
var escapeXmlAttr = runtimeHtmlHelpers.xa;
function isStringLiteral(node) {
return node.type === "Literal" && typeof node.value === "string";
}
function isNoEscapeXml(node) {
return node.type === "AttributePlaceholder" && node.escape === false;
}
function flattenAttrConcats(node) {
// return [node];
function flattenHelper(node) {
if (node.type === "BinaryExpression" && node.operator === "+") {
let left = flattenHelper(node.left);
let right = flattenHelper(node.right);
var isString = left.isString || right.isString;
if (isString) {
return {
isString: true,
concats: left.concats.concat(right.concats)
};
} else {
return {
isString: false,
concats: [node]
};
}
}
return {
isString:
isStringLiteral(node) || node.type === "AttributePlaceholder",
concats: [node]
};
}
var final = flattenHelper(node);
return final.concats;
}
function generateCodeForExpressionAttr(name, value, escape, codegen) {
var flattenedConcats = flattenAttrConcats(value);
var hasLiteral = false;
var builder = codegen.builder;
var finalNodes = [];
var context = codegen.context;
function addHtml(argument) {
finalNodes.push(builder.html(argument));
}
function addHtmlLiteral(value) {
finalNodes.push(builder.htmlLiteral(value));
}
for (let i = 0; i < flattenedConcats.length; i++) {
if (
flattenedConcats[i].type === "Literal" ||
flattenedConcats[i].type === "AttributePlaceholder"
) {
hasLiteral = true;
break;
}
}
if (hasLiteral) {
addHtmlLiteral(" " + name + '="');
for (let i = 0; i < flattenedConcats.length; i++) {
var part = flattenedConcats[i];
if (isStringLiteral(part)) {
part.value = escapeXmlAttr(part.value);
} else if (part.type !== "Literal") {
if (isNoEscapeXml(part)) {
part = codegen.builder.functionCall(context.helper("str"), [
part
]);
} else {
if (escape !== false) {
part = builder.functionCall(
context.helper("escapeXmlAttr"),
[part]
);
}
}
}
addHtml(part);
}
addHtmlLiteral('"');
} else {
if (name === "class") {
addHtml(
codegen.builder.functionCall(context.helper("classAttr"), [
value
])
);
} else if (name === "style") {
addHtml(
codegen.builder.functionCall(context.helper("styleAttr"), [
value
])
);
} else {
if (escape === false || isNoEscapeXml(value)) {
escape = false;
}
let attrArgs = [codegen.builder.literal(name), value];
if (escape === false) {
attrArgs.push(codegen.builder.literal(false));
}
addHtml(
codegen.builder.functionCall(context.helper("attr"), attrArgs)
);
}
}
return finalNodes;
}
module.exports = function generateCode(node, codegen) {
let name = node.name;
let value = node.value;
let argument = node.argument;
let escape = node.escape !== false;
var builder = codegen.builder;
if (!name) {
return null;
}
if (node.isLiteralValue()) {
let literalValue = value.value;
if (literalValue instanceof RegExp) {
literalValue = literalValue.source;
}
return builder.htmlLiteral(attr(name, literalValue));
} else if (value != null) {
if (value.type === "TemplateLiteral") {
value.nonstandard = false;
}
return generateCodeForExpressionAttr(name, value, escape, codegen);
} else if (argument) {
return [
builder.htmlLiteral(" " + name + "("),
builder.htmlLiteral(argument),
builder.htmlLiteral(")")
];
} else {
// Attribute with no value is a boolean attribute
return builder.htmlLiteral(" " + name);
}
};