You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
2.1 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.template = exports.compile = void 0;
const INPUT_VAR_NAME = "it";
const QUOTE_CHAR = '"';
const ESCAPE_CHAR = "\\";
/**
* Stringify a template into a function.
*/
function compile(value, displayName = "template") {
let result = QUOTE_CHAR;
for (let i = 0; i < value.length; i++) {
const char = value[i];
// Escape special characters due to quoting.
if (char === QUOTE_CHAR || char === ESCAPE_CHAR) {
result += ESCAPE_CHAR;
}
// Process template param.
if (char === "{" && value[i + 1] === "{") {
const start = i + 2;
let end = 0;
let withinString = "";
for (let j = start; j < value.length; j++) {
const char = value[j];
if (withinString) {
if (char === ESCAPE_CHAR)
j++;
else if (char === withinString)
withinString = "";
continue;
}
else if (char === "}" && value[j + 1] === "}") {
i = j + 1;
end = j;
break;
}
else if (char === '"' || char === "'" || char === "`") {
withinString = char;
}
}
if (!end)
throw new TypeError(`Template parameter not closed at ${i}`);
const param = value.slice(start, end).trim();
const sep = param[0] === "[" ? "" : ".";
result += `${QUOTE_CHAR} + (${INPUT_VAR_NAME}${sep}${param}) + ${QUOTE_CHAR}`;
continue;
}
result += char;
}
result += QUOTE_CHAR;
return `function ${displayName}(${INPUT_VAR_NAME}) { return ${result}; }`;
}
exports.compile = compile;
/**
* Fast and simple string templates.
*/
function template(value, displayName) {
const body = compile(value, displayName);
return new Function(`return (${body});`)();
}
exports.template = template;
//# sourceMappingURL=index.js.map