summaryrefslogtreecommitdiff
path: root/src/node_modules/string-template/compile.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2021-12-21 16:52:28 +0100
committerMinteck <contact@minteck.org>2021-12-21 16:52:28 +0100
commit46e43f4bde4a35785b4997b81e86cd19f046b69b (patch)
treec53c2f826f777f9d6b2d249dab556feb72a6c3a6 /src/node_modules/string-template/compile.js
downloadlangdetect-46e43f4bde4a35785b4997b81e86cd19f046b69b.tar.gz
langdetect-46e43f4bde4a35785b4997b81e86cd19f046b69b.tar.bz2
langdetect-46e43f4bde4a35785b4997b81e86cd19f046b69b.zip
Commit
Diffstat (limited to 'src/node_modules/string-template/compile.js')
-rw-r--r--src/node_modules/string-template/compile.js142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/node_modules/string-template/compile.js b/src/node_modules/string-template/compile.js
new file mode 100644
index 0000000..9ae058a
--- /dev/null
+++ b/src/node_modules/string-template/compile.js
@@ -0,0 +1,142 @@
+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'
+ }
+}