From f027291b3bdfb38abb796744f65930bc35a867c3 Mon Sep 17 00:00:00 2001 From: Commander-lol <ljcapitanio@gmail.com> Date: Fri, 26 Jun 2015 05:56:09 +0100 Subject: [PATCH] Embedded Sideburns, reorganised file structure to reflect that --- .jscompiler.json | 11 ++ src/sideburns.cut.js | 316 ++++++++++++++++++++++++++++++++++ src/tinyDOM-Sideburns.js | 37 ++++ test/sb.js | 325 ----------------------------------- test/test.html | 4 +- tinyDOM-Sideburns.js | 43 ----- tinyDOM-Sideburns.min.js | 2 +- tinyDOM-Sideburns.min.js.map | 2 +- 8 files changed, 368 insertions(+), 372 deletions(-) create mode 100644 .jscompiler.json create mode 100644 src/sideburns.cut.js create mode 100644 src/tinyDOM-Sideburns.js delete mode 100644 test/sb.js delete mode 100644 tinyDOM-Sideburns.js diff --git a/.jscompiler.json b/.jscompiler.json new file mode 100644 index 0000000..033db86 --- /dev/null +++ b/.jscompiler.json @@ -0,0 +1,11 @@ +{ + "outputs": [ + { + "inputs": ["src/sideburns.cut.js", "src/tinyDOM-Sideburns.js"], + "output": "tinyDOM-Sideburns.min.js", + "generateMap": true, + "mangle": true, + "isolate": true + } + ] +} diff --git a/src/sideburns.cut.js b/src/sideburns.cut.js new file mode 100644 index 0000000..0267860 --- /dev/null +++ b/src/sideburns.cut.js @@ -0,0 +1,316 @@ + +var globalOptions = { + ignoreUndefined: false, + escape: "general", + escapeSets: { + xml: { + "<": "<", + ">": ">", + "&": "&", + "\"": """ + }, + general: { + "\"": "\\\"", + "\'": "\\\'" + } + } + }, + deepMergeJson = function (obja, objb) { + var prop; + for (prop in objb) { + if (objb.hasOwnProperty(prop)) { + if (typeof (obja[prop]) === 'object' && typeof (objb[prop]) === 'object') { + obja[prop] = deepMergeJson(obja[prop], objb[prop]); + } else { + obja[prop] = objb[prop]; + } + } + } + return obja; + }, + setDeepProperty = function (ident, value, obj) { + var list, + recurse = function (propList, value, obj) { + if (propList.length > 1) { + recurse(propList, value, obj[list.shift()]); + } else { + obj[propList[0]] = value; + } + }; + + if (!ident.push && !ident.map) { + list = ident.split(".").map(function (e) {return e.trim(); }); + } else { + list = ident; + } + + recurse(list, value, obj); + return obj; + }, + getDeepProperty = function (ident, obj) { + var ret = null, + list, + recurse = function (propList, obj) { + var curident; + if (propList.length > 1) { + if (obj.hasOwnProperty(propList[0])) { + recurse(propList, obj[list.shift()]); + } else { + curident = propList.reduce(function (a, b, i) { + return a + (i > 0 ? "." : "") + b; + }); + throw new Error("Invalid proprty, missing expected data \"" + curident + "\" (IDENT: " + ident + ") from data " + JSON.stringify(obj)); + } + } else { + if (obj.hasOwnProperty(propList[0])) { + ret = obj[propList[0]]; + } else { + throw new Error("Invalid proprty, missing expected data \"" + propList[0] + "\" (IDENT: " + ident + ") from data " + JSON.stringify(obj)); + } + } + }; + + if (!ident.push && !ident.map) { + list = ident.split(".").map(function (e) {return e.trim(); }); + } else { + list = ident; + } + + recurse(list, obj); + return ret; + }, + resolveNamespace = function (ident, blockStack) { + var l = blockStack.length, i, ret = ""; + for (i = 0; i < l; i += 1) { + ret += blockStack[i] + "."; + } + return ret + ident; + }, + safeDeepMergeJson = function (obja, objb) { + if (typeof (obja) !== 'object') { + throw new TypeError("Cannot deep merge with an " + typeof (obja) + ": [Param 1]"); + } + if (typeof (objb) !== 'object') { + throw new TypeError("Cannot deep merge with an " + typeof (objb) + ": [Param 2]"); + } + + return deepMergeJson(deepMergeJson({}, obja), objb); + }, + /** + * Using this Regex + * This regular expression will match and split all valid tags for Sideburns, and provides + * all data needed to appropriately lex each tag + * + * Result indexes (from re.exec()): + * [0] The whole tag that has been matched + * [1, 9] These are the opening and closing double square brackets, respectively. Always present + * [2] The Tag modifier. This will either be '/' for a closing tag, '#' for a pre-process directive + * or undefined for all other tags. Processing should branch here depending on whether or not this + * token is a hash ('#'). Indexes for one branch will be undefined in case of the other branch. + * + * == In case of Directive == + * [3] The identifier of the directive to set. Always present + * [4] The value to set the directive. Always present + * + * == In case of other tag == + * [5] The Block modifier. Will be '*' for arrays, '&' for context and undefined for simple tags + * [6] The Data modifier. Will be '!' for an escape with the global set, '!([7])' for an escape with a + * specified set or undefined for unescaped data + * [7] If a set has been specified, this will be the name of the set on its own, seperate from the data + * modifier. It will otherwise be undefined + * [8] The identifier for the data or block that the tag represents. Always present + **/ + captureTags = /(\[\[)(\#|\/)?\s*(?:([a-zA-Z]+[a-zA-Z0-9]*)\s*\:\s*([a-zA-Z]+[a-zA-Z0-9]*)|([\*\&]?)\s*((?:\!(?:\(([a-zA-Z]+[a-zA-Z0-9]*)\))?)?)\s*([a-zA-Z](?:[a-zA-Z0-9]*(?:\.(?=[a-zA-Z]))?)+))\s*(\]\])/, + Stack = function () { + var self = this; + this.length = 0; + this.push = function (val) { + self[self.length] = val; + self.length += 1; + }; + this.pop = function (val) { + var ret = null; + if (self.length > 0) { + ret = self[self.length - 1]; + self[self.length - 1] = null; + self.length -= 1; + } + return ret; + }; + + this.peek = function () { + return this.length > 0 ? self[self.length - 1] : null; + }; + this.contains = function (value, compare) { + compare = compare || function (a, b) { + return a === b; + }; + var i = this.length; + while (i--) { + if (compare(this[i], value)) { + return true; + } + } + return false; + }; + return this; + }, + Node = function (type, val, modifiers) { + this.ident = type || "N_NULL"; + this.val = val || null; + this.content = modifiers || {}; + return this; + }, + Token = function (ident, val, info) { + this.ident = ident || "T_NULL"; + this.val = val || null; + this.info = info || {}; + return this; + }, + tokenise = function (src) { + var tokens = [], + last = 0, + i = 0, + match = null, + matcher, + chunk, + tok; + + matcher = function () { + return ((match = captureTags.exec(chunk)) !== null); + }; + while (i < src.length) { + chunk = src.substr(i); + if (matcher()) { + if (match.index > 0) { + tokens.push(new Token("STRING", match.input.substr(0, match.index))); + } + tok = new Token("T_NULL", null, {close: false, escape: false, escapeType: null}); + if (match[2] === '#') { + tok.ident = "T_DIRECTIVE"; + tok.val = {}; + tok.val[match[3]] = match[4]; + } else { + if (match[2] === '/') { + tok.info.close = true; + } + + if (match[5] === "*") { + tok.ident = "T_LOOP"; + } else if (match[5] === "&") { + tok.ident = "T_BLOCK"; + } else { + tok.ident = "T_DATA"; + } + + if (typeof (match[6]) !== 'undefined' && match[6].charAt(0) === "!") { + tok.info.escape = true; + if (typeof (match[7]) !== 'undefined') { + tok.info.escapeType = match[7]; + } + } + tok.val = match[8]; + } + tokens.push(tok); + i += match.index + match[0].length; + } else { + tokens.push(new Token("STRING", chunk)); + i += chunk.length; + } + } + tokens.push(new Token("EOD")); + return tokens; + }, + collapseParse = function (tokens) { + var tokenList, + i = 0, + j, + targetToken, + targetNode; + + while (i < tokens.length) { + if (tokens[i].info && tokens[i].info.close) { + tokenList = []; + targetToken = tokens[i]; + j = i - 1; + + while (!(tokens[j].ident === targetToken.ident && tokens[j].val === targetToken.val)) { + tokenList.push(tokens[j]); + j -= 1; + if (j < 0) { + throw new Error("Unmatched Closing Tag " + targetNode + " at index " + i); + } + } + + if (targetToken.ident === "T_LOOP") { + targetNode = new Node("N_LOOP", targetToken.val, tokenList.slice().reverse()); + } else { + targetNode = new Node("N_BLOCK", targetToken.val, tokenList.slice().reverse()); + } + + tokens.splice(j, (i - j) + 1, targetNode); + i = 0; + } else { + i += 1; + } + } + return tokens; + + }, + unwindNode = function (output, node, index, arr) { + var innerArr, dataArr, content, i, dataVal; + switch (node.ident) { + case "STRING": + return output + node.val; + + case "T_DATA": + dataVal = node.val; + if (arr.loopTag) { + if (node.val === arr.loopTag.slice(0, -1)) { + dataVal = arr.loopTag + "." + (arr.i).toString(); + } + } + return output + getDeepProperty(dataVal, arr.data); + + case "N_LOOP": + content = ""; + + innerArr = node.content; + innerArr.data = arr.data; + innerArr.loopTag = node.val; + + dataArr = getDeepProperty(node.val, arr.data); + + for (i = 0; i < dataArr.length; i += 1) { + innerArr.i = i; + content += innerArr.reduce(unwindNode, ""); + } + + return output + content; + + case "N_BLOCK": + innerArr = node.content; + innerArr.data = getDeepProperty(node.val, arr.data); + innerArr.loopTag = null; + return output + innerArr.reduce(unwindNode, ""); + + default: + return output; + } + }, + render = function (src, data, options) { + var nodes = collapseParse(tokenise(src)); + nodes.data = data; + nodes.loopTag = null; + nodes.i = null; + return nodes.reduce(unwindNode, ""); + }; + +render.partial = function (src) { + return function (tokens, data, options) { + tokens.data = data; + tokens.loopTag = null; + tokens.i = null; + return tokens.reduce(unwindNode, ""); + }.bind(null, collapseParse(tokenise(src))); +}; diff --git a/src/tinyDOM-Sideburns.js b/src/tinyDOM-Sideburns.js new file mode 100644 index 0000000..8c0c55d --- /dev/null +++ b/src/tinyDOM-Sideburns.js @@ -0,0 +1,37 @@ +if (!window.mu) { + throw new Error("tinyDOM-Sideburns requires tinyDOM to be in use on the page"); +} + +mu.templates = {}; + +mu.render = function (path, data, options) { + if (mu.templates.hasOwnProperty(path)) { + return mu.templates[path](data, options); + } else { + return render(path, data, options); + } +}; + + +mu.fn.render = function (path, data, options) { + var rendered = mu.render(path, data, options), + opts = options || {useHtml: true}; + if (typeof opts.useHtml === "undefined") { + opts.useHtml = true; + } + + this.each(function (i, e) { + if (opts.useHtml) { + e.innerHTML = rendered; + } else { + e.textContent = rendered; + } + }); +}; + +mu.ready(function () { + mu("[type='x-template/sideburns']").each(function (i, e) { + var name = e.getAttribute("data-name"); + mu.templates[name] = render.partial(e.textContent); + }); +}); diff --git a/test/sb.js b/test/sb.js deleted file mode 100644 index 7d9406c..0000000 --- a/test/sb.js +++ /dev/null @@ -1,325 +0,0 @@ -/*jslint node: true */ -(function () { - 'use strict'; - var globalOptions = { - ignoreUndefined: false, - escape: "general", - escapeSets: { - xml: { - "<": "<", - ">": ">", - "&": "&", - "\"": """ - }, - general: { - "\"": "\\\"", - "\'": "\\\'" - } - } - }, - deepMergeJson = function (obja, objb) { - var prop; - for (prop in objb) { - if (objb.hasOwnProperty(prop)) { - if (typeof (obja[prop]) === 'object' && typeof (objb[prop]) === 'object') { - obja[prop] = deepMergeJson(obja[prop], objb[prop]); - } else { - obja[prop] = objb[prop]; - } - } - } - return obja; - }, - setDeepProperty = function (ident, value, obj) { - var list, - recurse = function (propList, value, obj) { - if (propList.length > 1) { - recurse(propList, value, obj[list.shift()]); - } else { - obj[propList[0]] = value; - } - }; - - if (!ident.push && !ident.map) { - list = ident.split(".").map(function (e) {return e.trim(); }); - } else { - list = ident; - } - - recurse(list, value, obj); - return obj; - }, - getDeepProperty = function (ident, obj) { - var ret = null, - list, - recurse = function (propList, obj) { - var curident; - if (propList.length > 1) { - if (obj.hasOwnProperty(propList[0])) { - recurse(propList, obj[list.shift()]); - } else { - curident = propList.reduce(function (a, b, i) { - return a + (i > 0 ? "." : "") + b; - }); - throw new Error("Invalid proprty, missing expected data \"" + curident + "\" (IDENT: " + ident + ") from data " + JSON.stringify(obj)); - } - } else { - if (obj.hasOwnProperty(propList[0])) { - ret = obj[propList[0]]; - } else { - throw new Error("Invalid proprty, missing expected data \"" + propList[0] + "\" (IDENT: " + ident + ") from data " + JSON.stringify(obj)); - } - } - }; - - if (!ident.push && !ident.map) { - list = ident.split(".").map(function (e) {return e.trim(); }); - } else { - list = ident; - } - - recurse(list, obj); - return ret; - }, - resolveNamespace = function (ident, blockStack) { - var l = blockStack.length, i, ret = ""; - for (i = 0; i < l; i += 1) { - ret += blockStack[i] + "."; - } - return ret + ident; - }, - safeDeepMergeJson = function (obja, objb) { - if (typeof (obja) !== 'object') { - throw new TypeError("Cannot deep merge with an " + typeof (obja) + ": [Param 1]"); - } - if (typeof (objb) !== 'object') { - throw new TypeError("Cannot deep merge with an " + typeof (objb) + ": [Param 2]"); - } - - return deepMergeJson(deepMergeJson({}, obja), objb); - }, - /** - * Using this Regex - * This regular expression will match and split all valid tags for Sideburns, and provides - * all data needed to appropriately lex each tag - * - * Result indexes (from re.exec()): - * [0] The whole tag that has been matched - * [1, 9] These are the opening and closing double square brackets, respectively. Always present - * [2] The Tag modifier. This will either be '/' for a closing tag, '#' for a pre-process directive - * or undefined for all other tags. Processing should branch here depending on whether or not this - * token is a hash ('#'). Indexes for one branch will be undefined in case of the other branch. - * - * == In case of Directive == - * [3] The identifier of the directive to set. Always present - * [4] The value to set the directive. Always present - * - * == In case of other tag == - * [5] The Block modifier. Will be '*' for arrays, '&' for context and undefined for simple tags - * [6] The Data modifier. Will be '!' for an escape with the global set, '!([7])' for an escape with a - * specified set or undefined for unescaped data - * [7] If a set has been specified, this will be the name of the set on its own, seperate from the data - * modifier. It will otherwise be undefined - * [8] The identifier for the data or block that the tag represents. Always present - **/ - captureTags = /(\[\[)(\#|\/)?\s*(?:([a-zA-Z]+[a-zA-Z0-9]*)\s*\:\s*([a-zA-Z]+[a-zA-Z0-9]*)|([\*\&]?)\s*((?:\!(?:\(([a-zA-Z]+[a-zA-Z0-9]*)\))?)?)\s*([a-zA-Z](?:[a-zA-Z0-9]*(?:\.(?=[a-zA-Z]))?)+))\s*(\]\])/, - Stack = function () { - var self = this; - this.length = 0; - this.push = function (val) { - self[self.length] = val; - self.length += 1; - }; - this.pop = function (val) { - var ret = null; - if (self.length > 0) { - ret = self[self.length - 1]; - self[self.length - 1] = null; - self.length -= 1; - } - return ret; - }; - - this.peek = function () { - return this.length > 0 ? self[self.length - 1] : null; - }; - this.contains = function (value, compare) { - compare = compare || function (a, b) { - return a === b; - }; - var i = this.length; - while (i--) { - if (compare(this[i], value)) { - return true; - } - } - return false; - }; - return this; - }, - Node = function (type, val, modifiers) { - this.ident = type || "N_NULL"; - this.val = val || null; - this.content = modifiers || {}; - return this; - }, - Token = function (ident, val, info) { - this.ident = ident || "T_NULL"; - this.val = val || null; - this.info = info || {}; - return this; - }, - tokenise = function (src) { - var tokens = [], - last = 0, - i = 0, - match = null, - matcher, - chunk, - tok; - - matcher = function () { - return ((match = captureTags.exec(chunk)) !== null); - }; - while (i < src.length) { - chunk = src.substr(i); - if (matcher()) { - if (match.index > 0) { - tokens.push(new Token("STRING", match.input.substr(0, match.index))); - } - tok = new Token("T_NULL", null, {close: false, escape: false, escapeType: null}); - if (match[2] === '#') { - tok.ident = "T_DIRECTIVE"; - tok.val = {}; - tok.val[match[3]] = match[4]; - } else { - if (match[2] === '/') { - tok.info.close = true; - } - - if (match[5] === "*") { - tok.ident = "T_LOOP"; - } else if (match[5] === "&") { - tok.ident = "T_BLOCK"; - } else { - tok.ident = "T_DATA"; - } - - if (typeof (match[6]) !== 'undefined' && match[6].charAt(0) === "!") { - tok.info.escape = true; - if (typeof (match[7]) !== 'undefined') { - tok.info.escapeType = match[7]; - } - } - tok.val = match[8]; - } - tokens.push(tok); - i += match.index + match[0].length; - } else { - tokens.push(new Token("STRING", chunk)); - i += chunk.length; - } - } - tokens.push(new Token("EOD")); - return tokens; - }, - collapseParse = function (tokens) { - var tokenList, - i = 0, - j, - targetToken, - targetNode; - - while (i < tokens.length) { - if (tokens[i].info && tokens[i].info.close) { - tokenList = []; - targetToken = tokens[i]; - j = i - 1; - - while (!(tokens[j].ident === targetToken.ident && tokens[j].val === targetToken.val)) { - tokenList.push(tokens[j]); - j -= 1; - if (j < 0) { - throw new Error("Unmatched Closing Tag " + targetNode + " at index " + i); - } - } - - if (targetToken.ident === "T_LOOP") { - targetNode = new Node("N_LOOP", targetToken.val, tokenList.slice().reverse()); - } else { - targetNode = new Node("N_BLOCK", targetToken.val, tokenList.slice().reverse()); - } - - tokens.splice(j, (i - j) + 1, targetNode); - i = 0; - } else { - i += 1; - } - } - return tokens; - - }, - unwindNode = function (output, node, index, arr) { - var innerArr, dataArr, content, i, dataVal; - switch (node.ident) { - case "STRING": - return output + node.val; - - case "T_DATA": - dataVal = node.val; - if (arr.loopTag) { - if (node.val === arr.loopTag.slice(0, -1)) { - dataVal = arr.loopTag + "." + (arr.i).toString(); - } - } - return output + getDeepProperty(dataVal, arr.data); - - case "N_LOOP": - content = ""; - - innerArr = node.content; - innerArr.data = arr.data; - innerArr.loopTag = node.val; - - dataArr = getDeepProperty(node.val, arr.data); - - for (i = 0; i < dataArr.length; i += 1) { - innerArr.i = i; - content += innerArr.reduce(unwindNode, ""); - } - - return output + content; - - case "N_BLOCK": - innerArr = node.content; - innerArr.data = getDeepProperty(node.val, arr.data); - innerArr.loopTag = null; - return output + innerArr.reduce(unwindNode, ""); - - default: - return output; - } - }, - render = function (src, data, options) { - var nodes = collapseParse(tokenise(src)); - nodes.data = data; - nodes.loopTag = null; - nodes.i = null; - return nodes.reduce(unwindNode, ""); - }; - - render.partial = function (src) { - return function (tokens, data, options) { - tokens.data = data; - tokens.loopTag = null; - tokens.i = null; - return tokens.reduce(unwindNode, ""); - }.bind(null, collapseParse(tokenise(src))); - }; - - if (typeof module !== "undefined" && module.exports) { - module.exports = render; - } else { - window.sideburns = render; - } -}()); diff --git a/test/test.html b/test/test.html index 85df0e9..f119ba6 100644 --- a/test/test.html +++ b/test/test.html @@ -6,8 +6,8 @@ <meta charset="utf-8"> <title>SB test</title> <script src="td.js"></script> - <script src="sb.js"></script> - <script src="../tinyDOM-Sideburns.js"></script> +<!-- <script src="sb.js"></script>--> + <script src="../tinyDOM-Sideburns.min.js"></script> </head> <body> diff --git a/tinyDOM-Sideburns.js b/tinyDOM-Sideburns.js deleted file mode 100644 index dd9190a..0000000 --- a/tinyDOM-Sideburns.js +++ /dev/null @@ -1,43 +0,0 @@ -/*globals console, mu */ -(function () { - "use strict"; - - if (!window.mu) { - throw new Error("tinyDOM-Sideburns requires tinyDOM to be in use on the page"); - } - - mu.templates = {}; - - mu.render = function (path, data, options) { - if (mu.templates.hasOwnProperty(path)) { - return mu.templates[path](data, options); - } else { - return window.sideburns(path, data, options); - } - }; - - - mu.fn.render = function (path, data, options) { - var rendered = mu.render(path, data, options), - opts = options || {useHtml: true}; - if (typeof opts.useHtml === "undefined") { - opts.useHtml = true; - } - - this.each(function (i, e) { - if (opts.useHtml) { - e.innerHTML = rendered; - } else { - e.textContent = rendered; - } - }); - }; - - mu.ready(function () { - mu("[type='x-template/sideburns']").each(function (i, e) { - var name = e.getAttribute("data-name"); - mu.templates[name] = window.sideburns.partial(e.textContent); - }); - }); - -}()); diff --git a/tinyDOM-Sideburns.min.js b/tinyDOM-Sideburns.min.js index 4f76e67..09c7286 100644 --- a/tinyDOM-Sideburns.min.js +++ b/tinyDOM-Sideburns.min.js @@ -1,2 +1,2 @@ -!function(){"use strict";if(!window.mu)throw new Error("tinyDOM-Sideburns requires tinyDOM to be in use on the page");mu.templates={},mu.render=function(e,t,n){return mu.templates.hasOwnProperty(e)?mu.templates[e](t,n):window.sideburns(e,t,n)},mu.fn.render=function(e,t,n){var r=mu.render(e,t,n),u=n||{useHtml:!0};"undefined"==typeof u.useHtml&&(u.useHtml=!0),this.each(function(e,t){u.useHtml?t.innerHTML=r:t.textContent=r})},mu.ready(function(){mu("[type='x-template/sideburns']").each(function(e,t){var n=t.getAttribute("data-name");mu.templates[n]=window.sideburns.partial(t.textContent)})})}(); +(function(window,undefined){var globalOptions={ignoreUndefined:!1,escape:"general",escapeSets:{xml:{"<":"<",">":">","&":"&",'"':"""},general:{'"':'\\"',"'":"\\'"}}},deepMergeJson=function(e,n){var t;for(t in n)n.hasOwnProperty(t)&&(e[t]="object"==typeof e[t]&&"object"==typeof n[t]?deepMergeJson(e[t],n[t]):n[t]);return e},setDeepProperty=function(e,n,t){var r,o=function(e,n,t){e.length>1?o(e,n,t[r.shift()]):t[e[0]]=n};return r=e.push||e.map?e:e.split(".").map(function(e){return e.trim()}),o(r,n,t),t},getDeepProperty=function(e,n){var t,r=null,o=function(n,i){var a;if(n.length>1){if(!i.hasOwnProperty(n[0]))throw a=n.reduce(function(e,n,t){return e+(t>0?".":"")+n}),new Error('Invalid proprty, missing expected data "'+a+'" (IDENT: '+e+") from data "+JSON.stringify(i));o(n,i[t.shift()])}else{if(!i.hasOwnProperty(n[0]))throw new Error('Invalid proprty, missing expected data "'+n[0]+'" (IDENT: '+e+") from data "+JSON.stringify(i));r=i[n[0]]}};return t=e.push||e.map?e:e.split(".").map(function(e){return e.trim()}),o(t,n),r},resolveNamespace=function(e,n){var t,r=n.length,o="";for(t=0;r>t;t+=1)o+=n[t]+".";return o+e},safeDeepMergeJson=function(e,n){if("object"!=typeof e)throw new TypeError("Cannot deep merge with an "+typeof e+": [Param 1]");if("object"!=typeof n)throw new TypeError("Cannot deep merge with an "+typeof n+": [Param 2]");return deepMergeJson(deepMergeJson({},e),n)},captureTags=/(\[\[)(\#|\/)?\s*(?:([a-zA-Z]+[a-zA-Z0-9]*)\s*\:\s*([a-zA-Z]+[a-zA-Z0-9]*)|([\*\&]?)\s*((?:\!(?:\(([a-zA-Z]+[a-zA-Z0-9]*)\))?)?)\s*([a-zA-Z](?:[a-zA-Z0-9]*(?:\.(?=[a-zA-Z]))?)+))\s*(\]\])/,Stack=function(){var e=this;return this.length=0,this.push=function(n){e[e.length]=n,e.length+=1},this.pop=function(){var n=null;return e.length>0&&(n=e[e.length-1],e[e.length-1]=null,e.length-=1),n},this.peek=function(){return this.length>0?e[e.length-1]:null},this.contains=function(e,n){n=n||function(e,n){return e===n};for(var t=this.length;t--;)if(n(this[t],e))return!0;return!1},this},Node=function(e,n,t){return this.ident=e||"N_NULL",this.val=n||null,this.content=t||{},this},Token=function(e,n,t){return this.ident=e||"T_NULL",this.val=n||null,this.info=t||{},this},tokenise=function(e){var n,t,r,o=[],i=0,a=null;for(n=function(){return null!==(a=captureTags.exec(t))};i<e.length;)t=e.substr(i),n()?(a.index>0&&o.push(new Token("STRING",a.input.substr(0,a.index))),r=new Token("T_NULL",null,{close:!1,escape:!1,escapeType:null}),"#"===a[2]?(r.ident="T_DIRECTIVE",r.val={},r.val[a[3]]=a[4]):("/"===a[2]&&(r.info.close=!0),r.ident="*"===a[5]?"T_LOOP":"&"===a[5]?"T_BLOCK":"T_DATA","undefined"!=typeof a[6]&&"!"===a[6].charAt(0)&&(r.info.escape=!0,"undefined"!=typeof a[7]&&(r.info.escapeType=a[7])),r.val=a[8]),o.push(r),i+=a.index+a[0].length):(o.push(new Token("STRING",t)),i+=t.length);return o.push(new Token("EOD")),o},collapseParse=function(e){for(var n,t,r,o,i=0;i<e.length;)if(e[i].info&&e[i].info.close){for(n=[],r=e[i],t=i-1;e[t].ident!==r.ident||e[t].val!==r.val;)if(n.push(e[t]),t-=1,0>t)throw new Error("Unmatched Closing Tag "+o+" at index "+i);o="T_LOOP"===r.ident?new Node("N_LOOP",r.val,n.slice().reverse()):new Node("N_BLOCK",r.val,n.slice().reverse()),e.splice(t,i-t+1,o),i=0}else i+=1;return e},unwindNode=function(e,n,t,r){var o,i,a,u,s;switch(n.ident){case"STRING":return e+n.val;case"T_DATA":return s=n.val,r.loopTag&&n.val===r.loopTag.slice(0,-1)&&(s=r.loopTag+"."+r.i.toString()),e+getDeepProperty(s,r.data);case"N_LOOP":for(a="",o=n.content,o.data=r.data,o.loopTag=n.val,i=getDeepProperty(n.val,r.data),u=0;u<i.length;u+=1)o.i=u,a+=o.reduce(unwindNode,"");return e+a;case"N_BLOCK":return o=n.content,o.data=getDeepProperty(n.val,r.data),o.loopTag=null,e+o.reduce(unwindNode,"");default:return e}},render=function(e,n){var t=collapseParse(tokenise(e));return t.data=n,t.loopTag=null,t.i=null,t.reduce(unwindNode,"")};if(render.partial=function(e){return function(e,n){return e.data=n,e.loopTag=null,e.i=null,e.reduce(unwindNode,"")}.bind(null,collapseParse(tokenise(e)))},!window.mu)throw new Error("tinyDOM-Sideburns requires tinyDOM to be in use on the page");mu.templates={},mu.render=function(e,n,t){return mu.templates.hasOwnProperty(e)?mu.templates[e](n,t):render(e,n,t)},mu.fn.render=function(e,n,t){var r=mu.render(e,n,t),o=t||{useHtml:!0};"undefined"==typeof o.useHtml&&(o.useHtml=!0),this.each(function(e,n){o.useHtml?n.innerHTML=r:n.textContent=r})},mu.ready(function(){mu("[type='x-template/sideburns']").each(function(e,n){var t=n.getAttribute("data-name");mu.templates[t]=render.partial(n.textContent)})});})(window); //# sourceMappingURL=tinyDOM-Sideburns.min.js.map diff --git a/tinyDOM-Sideburns.min.js.map b/tinyDOM-Sideburns.min.js.map index 3282fcb..b880d64 100644 --- a/tinyDOM-Sideburns.min.js.map +++ b/tinyDOM-Sideburns.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["tinyDOM-Sideburns.js"],"names":["window","mu","Error","templates","render","path","data","options","hasOwnProperty","sideburns","fn","rendered","opts","useHtml","this","each","i","e","innerHTML","textContent","ready","name","getAttribute","partial"],"mappings":"CACC,WACG,YAEA,KAAKA,OAAOC,GACR,KAAM,IAAIC,OAAM,8DAGpBD,IAAGE,aAEHF,GAAGG,OAAS,SAAUC,EAAMC,EAAMC,GAC9B,MAAIN,IAAGE,UAAUK,eAAeH,GACrBJ,GAAGE,UAAUE,GAAMC,EAAMC,GAEzBP,OAAOS,UAAUJ,EAAMC,EAAMC,IAK5CN,GAAGS,GAAGN,OAAS,SAAUC,EAAMC,EAAMC,GACjC,GAAII,GAAWV,GAAGG,OAAOC,EAAMC,EAAMC,GACjCK,EAAOL,IAAYM,SAAS,EACJ,oBAAjBD,GAAKC,UACZD,EAAKC,SAAU,GAGnBC,KAAKC,KAAK,SAAUC,EAAGC,GACfL,EAAKC,QACLI,EAAEC,UAAYP,EAEdM,EAAEE,YAAcR,KAK5BV,GAAGmB,MAAM,WACLnB,GAAG,iCAAiCc,KAAK,SAAUC,EAAGC,GAClD,GAAII,GAAOJ,EAAEK,aAAa,YAC1BrB,IAAGE,UAAUkB,GAAQrB,OAAOS,UAAUc,QAAQN,EAAEE"} \ No newline at end of file +{"version":3,"sources":["src/sideburns.cut.js","src/tinyDOM-Sideburns.js"],"names":["globalOptions","ignoreUndefined","escape","escapeSets","xml","<",">","&","\"","general","'","deepMergeJson","obja","objb","prop","hasOwnProperty","setDeepProperty","ident","value","obj","list","recurse","propList","length","shift","push","map","split","e","trim","getDeepProperty","ret","curident","reduce","a","b","i","Error","JSON","stringify","resolveNamespace","blockStack","l","safeDeepMergeJson","TypeError","captureTags","Stack","self","this","val","pop","peek","contains","compare","Node","type","modifiers","content","Token","info","tokenise","src","matcher","chunk","tok","tokens","match","exec","substr","index","input","close","escapeType","charAt","collapseParse","tokenList","j","targetToken","targetNode","slice","reverse","splice","unwindNode","output","node","arr","innerArr","dataArr","dataVal","loopTag","toString","data","render","nodes","partial","bind","window","mu","templates","path","options","fn","rendered","opts","useHtml","each","innerHTML","textContent","ready","name","getAttribute"],"mappings":"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"} \ No newline at end of file -- GitLab