aboutsummaryrefslogtreecommitdiff
path: root/node_modules/string-template/compile.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-06-04 08:51:01 +0200
committerMinteck <contact@minteck.org>2022-06-04 08:51:01 +0200
commit383285ecd5292bf9a825e05904955b937de84cc9 (patch)
tree0a53b6f02c1604b078044567c03dc1b6c944c8c2 /node_modules/string-template/compile.js
downloadequestriadb-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.js143
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'
+ }
+}