diff options
author | Minteck <contact@minteck.org> | 2022-06-04 08:51:01 +0200 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2022-06-04 08:51:01 +0200 |
commit | 383285ecd5292bf9a825e05904955b937de84cc9 (patch) | |
tree | 0a53b6f02c1604b078044567c03dc1b6c944c8c2 /node_modules/string-template/compile.js | |
download | equestriadb-383285ecd5292bf9a825e05904955b937de84cc9.tar.gz equestriadb-383285ecd5292bf9a825e05904955b937de84cc9.tar.bz2 equestriadb-383285ecd5292bf9a825e05904955b937de84cc9.zip |
Initial commit
Diffstat (limited to 'node_modules/string-template/compile.js')
-rw-r--r-- | node_modules/string-template/compile.js | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/node_modules/string-template/compile.js b/node_modules/string-template/compile.js new file mode 100644 index 0000000..18a48bf --- /dev/null +++ b/node_modules/string-template/compile.js @@ -0,0 +1,143 @@ +var template = require("./index") + +var whitespaceRegex = /["'\\\n\r\u2028\u2029]/g +var nargs = /\{[0-9a-zA-Z]+\}/g + +var replaceTemplate = +" var args\n" + +" var result\n" + +" if (arguments.length === 1 && typeof arguments[0] === \"object\") {\n" + +" args = arguments[0]\n" + +" } else {\n" + +" args = arguments" + +" }\n\n" + +" if (!args || !(\"hasOwnProperty\" in args)) {\n" + +" args = {}\n" + +" }\n\n" + +" return {0}" + +var literalTemplate = "\"{0}\"" +var argTemplate = "(result = args.hasOwnProperty(\"{0}\") ? " + + "args[\"{0}\"] : null, \n " + + "(result === null || result === undefined) ? \"\" : result)" + +module.exports = compile + +function compile(string, inline) { + var replacements = string.match(nargs) + var interleave = string.split(nargs) + var replace = [] + + for (var i = 0; i < interleave.length; i++) { + var current = interleave[i]; + var replacement = replacements[i]; + var escapeLeft = current.charAt(current.length - 1) + var escapeRight = (interleave[i + 1] || "").charAt(0) + + if (replacement) { + replacement = replacement.substring(1, replacement.length - 1) + } + + if (escapeLeft === "{" && escapeRight === "}") { + replace.push(current + replacement) + } else { + replace.push(current); + if (replacement) { + replace.push({ name: replacement }) + } + } + } + + var prev = [""] + + for (var j = 0; j < replace.length; j++) { + var curr = replace[j] + + if (String(curr) === curr) { + var top = prev[prev.length - 1] + + if (String(top) === top) { + prev[prev.length - 1] = top + curr + } else { + prev.push(curr) + } + } else { + prev.push(curr) + } + } + + replace = prev + + if (inline) { + for (var k = 0; k < replace.length; k++) { + var token = replace[k] + + if (String(token) === token) { + replace[k] = template(literalTemplate, escape(token)) + } else { + replace[k] = template(argTemplate, escape(token.name)) + } + } + + var replaceCode = replace.join(" +\n ") + var compiledSource = template(replaceTemplate, replaceCode) + return new Function(compiledSource) + } + + return function template() { + var args + + if (arguments.length === 1 && typeof arguments[0] === "object") { + args = arguments[0] + } else { + args = arguments + } + + if (!args || !("hasOwnProperty" in args)) { + args = {} + } + + var result = [] + + for (var i = 0; i < replace.length; i++) { + if (i % 2 === 0) { + result.push(replace[i]) + } else { + var argName = replace[i].name + var arg = args.hasOwnProperty(argName) ? args[argName] : null + if (arg !== null || arg !== undefined) { + result.push(arg) + } + } + } + + return result.join("") + } +} + +function escape(string) { + string = '' + string; + + return string.replace(whitespaceRegex, escapedWhitespace); +} + +function escapedWhitespace(character) { + // Escape all characters not included in SingleStringCharacters and + // DoubleStringCharacters on + // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 + switch (character) { + case '"': + case "'": + case '\\': + return '\\' + character + // Four possible LineTerminator characters need to be escaped: + case '\n': + return '\\n' + case '\r': + return '\\r' + case '\u2028': + return '\\u2028' + case '\u2029': + return '\\u2029' + } +} |