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
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
|