From 123806634dd8c8dd67c11b488bee785659b463b9 Mon Sep 17 00:00:00 2001 From: Commander-lol <ljcapitanio@gmail.com> Date: Mon, 29 Jun 2015 03:11:28 +0100 Subject: [PATCH] Updated to Sideburns 1.1.X --- dist/tinyDOM-Sideburns.js | 2 +- dist/tinyDOM-Sideburns.min.js | 2 +- dist/tinyDOM-Sideburns.min.js.map | 2 +- src/sideburns.cut.js | 304 ++++++++++++++++++++++++------ 4 files changed, 248 insertions(+), 62 deletions(-) diff --git a/dist/tinyDOM-Sideburns.js b/dist/tinyDOM-Sideburns.js index 016dff9..5c7287a 100644 --- a/dist/tinyDOM-Sideburns.js +++ b/dist/tinyDOM-Sideburns.js @@ -1 +1 @@ -(function(window,undefined){var globalOptions={ignoreUndefined:!1,escape:"general",escapeSets:{xml:{"<":"<",">":">","&":"&",'"':"""},general:{'"':'\\"',"'":"\\'"}}},deepMergeJson=function(obja,objb){var prop;for(prop in objb)objb.hasOwnProperty(prop)&&(obja[prop]="object"==typeof obja[prop]&&"object"==typeof objb[prop]?deepMergeJson(obja[prop],objb[prop]):objb[prop]);return obja},setDeepProperty=function(ident,value,obj){var list,recurse=function(propList,value,obj){propList.length>1?recurse(propList,value,obj[list.shift()]):obj[propList[0]]=value};return list=ident.push||ident.map?ident:ident.split(".").map(function(e){return e.trim()}),recurse(list,value,obj),obj},getDeepProperty=function(ident,obj){var list,ret=null,recurse=function(propList,obj){var curident;if(propList.length>1){if(!obj.hasOwnProperty(propList[0]))throw curident=propList.reduce(function(a,b,i){return a+(i>0?".":"")+b}),new Error('Invalid proprty, missing expected data "'+curident+'" (IDENT: '+ident+") from data "+JSON.stringify(obj));recurse(propList,obj[list.shift()])}else{if(!obj.hasOwnProperty(propList[0]))throw new Error('Invalid proprty, missing expected data "'+propList[0]+'" (IDENT: '+ident+") from data "+JSON.stringify(obj));ret=obj[propList[0]]}};return list=ident.push||ident.map?ident:ident.split(".").map(function(e){return e.trim()}),recurse(list,obj),ret},resolveNamespace=function(ident,blockStack){var i,l=blockStack.length,ret="";for(i=0;l>i;i+=1)ret+=blockStack[i]+".";return ret+ident},safeDeepMergeJson=function(obja,objb){if("object"!=typeof obja)throw new TypeError("Cannot deep merge with an "+typeof obja+": [Param 1]");if("object"!=typeof objb)throw new TypeError("Cannot deep merge with an "+typeof objb+": [Param 2]");return deepMergeJson(deepMergeJson({},obja),objb)},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;return this.length=0,this.push=function(val){self[self.length]=val,self.length+=1},this.pop=function(){var ret=null;return self.length>0&&(ret=self[self.length-1],self[self.length-1]=null,self.length-=1),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};for(var i=this.length;i--;)if(compare(this[i],value))return!0;return!1},this},Node=function(type,val,modifiers){return this.ident=type||"N_NULL",this.val=val||null,this.content=modifiers||{},this},Token=function(ident,val,info){return this.ident=ident||"T_NULL",this.val=val||null,this.info=info||{},this},tokenise=function(src){var matcher,chunk,tok,tokens=[],i=0,match=null;for(matcher=function(){return null!==(match=captureTags.exec(chunk))};i<src.length;)chunk=src.substr(i),matcher()?(match.index>0&&tokens.push(new Token("STRING",match.input.substr(0,match.index))),tok=new Token("T_NULL",null,{close:!1,escape:!1,escapeType:null}),"#"===match[2]?(tok.ident="T_DIRECTIVE",tok.val={},tok.val[match[3]]=match[4]):("/"===match[2]&&(tok.info.close=!0),tok.ident="*"===match[5]?"T_LOOP":"&"===match[5]?"T_BLOCK":"T_DATA","undefined"!=typeof match[6]&&"!"===match[6].charAt(0)&&(tok.info.escape=!0,"undefined"!=typeof match[7]&&(tok.info.escapeType=match[7])),tok.val=match[8]),tokens.push(tok),i+=match.index+match[0].length):(tokens.push(new Token("STRING",chunk)),i+=chunk.length);return tokens.push(new Token("EOD")),tokens},collapseParse=function(tokens){for(var tokenList,j,targetToken,targetNode,i=0;i<tokens.length;)if(tokens[i].info&&tokens[i].info.close){for(tokenList=[],targetToken=tokens[i],j=i-1;tokens[j].ident!==targetToken.ident||tokens[j].val!==targetToken.val;)if(tokenList.push(tokens[j]),j-=1,0>j)throw new Error("Unmatched Closing Tag "+targetNode+" at index "+i);targetNode="T_LOOP"===targetToken.ident?new Node("N_LOOP",targetToken.val,tokenList.slice().reverse()):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":return dataVal=node.val,arr.loopTag&&node.val===arr.loopTag.slice(0,-1)&&(dataVal=arr.loopTag+"."+arr.i.toString()),output+getDeepProperty(dataVal,arr.data);case"N_LOOP":for(content="",innerArr=node.content,innerArr.data=arr.data,innerArr.loopTag=node.val,dataArr=getDeepProperty(node.val,arr.data),i=0;i<dataArr.length;i+=1)innerArr.i=i,content+=innerArr.reduce(unwindNode,"");return output+content;case"N_BLOCK":return innerArr=node.content,innerArr.data=getDeepProperty(node.val,arr.data),innerArr.loopTag=null,output+innerArr.reduce(unwindNode,"");default:return output}},render=function(src,data){var nodes=collapseParse(tokenise(src));return nodes.data=data,nodes.loopTag=null,nodes.i=null,nodes.reduce(unwindNode,"")};if(render.partial=function(src){return function(tokens,data){return tokens.data=data,tokens.loopTag=null,tokens.i=null,tokens.reduce(unwindNode,"")}.bind(null,collapseParse(tokenise(src)))},!window.mu)throw new Error("tinyDOM-Sideburns requires tinyDOM to be in use on the page");mu.templates={},mu.render=function(path,data,options){return mu.templates.hasOwnProperty(path)?mu.templates[path](data,options):render(path,data,options)},mu.fn.render=function(path,data,options){var rendered=mu.render(path,data,options),opts=options||{useHtml:!0};"undefined"==typeof opts.useHtml&&(opts.useHtml=!0),this.each(function(i,e){opts.useHtml?e.innerHTML=rendered: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)})});})(window); +(function(window,undefined){"use strict";var globalOptions={ignoreUndefined:!1,escape:"general",escapeSets:{xml:{"&":"&","<":"<",">":">",'"':""","'":"'"},general:{'"':'\\"',"'":"\\'"}}},deepMergeJson=function(obja,objb){var prop;for(prop in objb)objb.hasOwnProperty(prop)&&(obja[prop]="object"==typeof obja[prop]&&"object"==typeof objb[prop]?deepMergeJson(obja[prop],objb[prop]):objb[prop]);return obja},setDeepProperty=function(ident,value,obj,makepath){var list,recurse=function(propList,value,obj){var id;if(propList.length>1){if(id=list.shift(),!obj.hasOwnProperty(id)){if(!makepath)throw new Error("No internal property "+id+" at depth N - "+list.length);obj[id]={}}recurse(propList,value,obj[id])}else obj[propList[0]]=value};return list=ident.push||ident.map?ident:ident.split(".").map(function(e){return e.trim()}),recurse(list,value,obj),obj},getDeepProperty=function(ident,obj){var list,ret=null,recurse=function(propList,obj){var curident;if(propList.length>1){if(!obj.hasOwnProperty(propList[0]))throw curident=propList.reduce(function(a,b,i){return a+(i>0?".":"")+b}),new Error('Invalid proprty, missing expected data "'+curident+'" (IDENT: '+ident+") from data "+JSON.stringify(obj));recurse(propList,obj[list.shift()])}else{if(!obj.hasOwnProperty(propList[0]))throw new Error('Invalid proprty, missing expected data "'+propList[0]+'" (IDENT: '+ident+") from data "+JSON.stringify(obj));ret=obj[propList[0]]}};return list=ident.push||ident.map?ident:ident.split(".").map(function(e){return e.trim()}),recurse(list,obj),ret},getDeepPropertyOrUndef=function(ident,obj){var res;try{res=getDeepProperty(ident,obj)}catch(e){res=void 0}return res},safeDeepMergeJson=function(obja,objb){if("object"!=typeof obja)throw new TypeError("Cannot deep merge with an "+typeof obja+": [Param 1]");if("object"!=typeof objb)throw new TypeError("Cannot deep merge with an "+typeof objb+": [Param 2]");return deepMergeJson(deepMergeJson({},obja),objb)},escapeRegex=function(reg){return reg.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")},escapeData=function(datum,escapes){var prop;for(prop in escapes)escapes.hasOwnProperty(prop)&&(datum=String(datum).split(prop).join(escapes[prop]));return datum},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*(\]\])/,Node=function(type,val,content){return this.ident=type||"N_NULL",this.val=val||null,this.content=content||{},this},Token=function(ident,val,info){return this.ident=ident||"T_NULL",this.val=val||null,this.info=info||{},this},tokenise=function(src){var matcher,chunk,tok,tokens=[],i=0,match=null;for(matcher=function(){return null!==(match=captureTags.exec(chunk))};i<src.length;)if(chunk=src.substr(i),matcher()){if(match.index>0&&tokens.push(new Token("STRING",match.input.substr(0,match.index))),tok=new Token("T_NULL",null,{close:!1,escape:!1,escapeType:null}),"#"===match[2])tok.ident="T_DIRECTIVE",tok.val={key:match[3],value:match[4]};else{switch("/"===match[2]&&(tok.info.close=!0),match[5]){case"*":tok.ident="T_LOOP";break;case"&":tok.ident="T_BLOCK";break;case">":tok.ident="T_IMPORT";break;case"?":tok.ident="T_CONDITION";break;default:tok.ident="T_DATA"}"undefined"!=typeof match[6]&&"!"===match[6].charAt(0)&&(tok.info.escape=!0,"undefined"!=typeof match[7]&&(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;return tokens.push(new Token("EOD")),tokens},collapseParse=function(tokens){for(var tokenList,j,targetToken,targetNode,nodeName,i=0;i<tokens.length;)if(tokens[i].info&&tokens[i].info.close){for(tokenList=[],targetToken=tokens[i],j=i-1;tokens[j].ident!==targetToken.ident||tokens[j].val!==targetToken.val;)if(tokenList.push(tokens[j]),j-=1,0>j)throw new Error("Unmatched Closing Tag "+targetNode+" at index "+i);switch(targetToken.ident){case"T_LOOP":case"T_BLOCK":case"T_CONDITION":nodeName="N"+targetToken.ident.slice(1);break;default:throw new Error("Invalid block element "+targetToken.ident+" at index "+i)}targetNode=new Node(nodeName,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,datum,escapeType,ifresult,iff;switch(node.ident){case"STRING":return output+node.val;case"T_DIRECTIVE":return setDeepProperty(node.val.key,node.val.value,arr.opts,!0),output;case"T_DATA":return dataVal=node.val,arr.loopTag&&node.val===arr.loopTag.slice(0,-1)&&(dataVal=arr.loopTag+"."+arr.i.toString()),datum=getDeepProperty(dataVal,arr.data),node.info.escape&&(escapeType=node.info.escapeType?node.info.escapeType:arr.opts.escape,datum=escapeData(datum,arr.opts.escapeSets[escapeType])),output+datum;case"T_IMPORT":if(content=arr.includes[node.val],"undefined"!=typeof content&&null!==content)datum=content(arr.data,arr.opts);else{if(!arr.opts.ignoreUndefined)throw new Error("Cannot get include "+node.val);datum=""}return output+datum;case"N_LOOP":for(content="",innerArr=node.content,innerArr.data=arr.data,innerArr.loopTag=node.val,innerArr.includes=arr.includes,innerArr.opts=deepMergeJson({},arr.opts),dataArr=getDeepProperty(node.val,arr.data),i=0;i<dataArr.length;i+=1)innerArr.i=i,content+=innerArr.reduce(unwindNode,"");return output+content;case"N_BLOCK":return innerArr=node.content,innerArr.data=getDeepProperty(node.val,arr.data),innerArr.loopTag=null,innerArr.includes=arr.includes,innerArr.opts=deepMergeJson({},arr.opts),output+innerArr.reduce(unwindNode,"");case"N_CONDITION":return iff=getDeepPropertyOrUndef(node.val,arr.opts),iff?(innerArr=node.content,innerArr.data=arr.data,innerArr.loopTag=null,innerArr.includes=arr.includes,innerArr.opts=deepMergeJson({},arr.opts),ifresult=innerArr.reduce(unwindNode,"")):ifresult="",output+ifresult;default:return output}},render=function(src,data,options){var nodes=collapseParse(tokenise(src));return nodes.data=data,nodes.loopTag=null,nodes.i=null,nodes.includes=render.includes,nodes.opts=safeDeepMergeJson(globalOptions,options),nodes.reduce(unwindNode,"")};if(render.partial=function(src){return function(tokens,data,options){return tokens.data=data,tokens.loopTag=null,tokens.i=null,tokens.includes=render.includes,tokens.opts=safeDeepMergeJson(globalOptions,options),tokens.reduce(unwindNode,"")}.bind(null,collapseParse(tokenise(src)))},render.includes={},render.addInclude=function(name,template){this.includes[name]=template.split?render.partial(template):template},!window.mu)throw new Error("tinyDOM-Sideburns requires tinyDOM to be in use on the page");mu.templates={},mu.render=function(path,data,options){return mu.templates.hasOwnProperty(path)?mu.templates[path](data,options):render(path,data,options)},mu.fn.render=function(path,data,options){var rendered=mu.render(path,data,options),opts=options||{useHtml:!0};"undefined"==typeof opts.useHtml&&(opts.useHtml=!0),this.each(function(i,e){opts.useHtml?e.innerHTML=rendered: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)})});})(window); diff --git a/dist/tinyDOM-Sideburns.min.js b/dist/tinyDOM-Sideburns.min.js index 09c7286..8771890 100644 --- a/dist/tinyDOM-Sideburns.min.js +++ b/dist/tinyDOM-Sideburns.min.js @@ -1,2 +1,2 @@ -(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); +(function(window,undefined){"use strict";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,r){var a,o=function(e,n,t){var i;if(e.length>1){if(i=a.shift(),!t.hasOwnProperty(i)){if(!r)throw new Error("No internal property "+i+" at depth N - "+a.length);t[i]={}}o(e,n,t[i])}else t[e[0]]=n};return a=e.push||e.map?e:e.split(".").map(function(e){return e.trim()}),o(a,n,t),t},getDeepProperty=function(e,n){var t,r=null,a=function(n,o){var i;if(n.length>1){if(!o.hasOwnProperty(n[0]))throw i=n.reduce(function(e,n,t){return e+(t>0?".":"")+n}),new Error('Invalid proprty, missing expected data "'+i+'" (IDENT: '+e+") from data "+JSON.stringify(o));a(n,o[t.shift()])}else{if(!o.hasOwnProperty(n[0]))throw new Error('Invalid proprty, missing expected data "'+n[0]+'" (IDENT: '+e+") from data "+JSON.stringify(o));r=o[n[0]]}};return t=e.push||e.map?e:e.split(".").map(function(e){return e.trim()}),a(t,n),r},getDeepPropertyOrUndef=function(e,n){var t;try{t=getDeepProperty(e,n)}catch(r){t=void 0}return t},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)},escapeRegex=function(e){return e.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")},escapeData=function(e,n){var t;for(t in n)n.hasOwnProperty(t)&&(e=String(e).split(t).join(n[t]));return e},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*(\]\])/,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,a=[],o=0,i=null;for(n=function(){return null!==(i=captureTags.exec(t))};o<e.length;)if(t=e.substr(o),n()){if(i.index>0&&a.push(new Token("STRING",i.input.substr(0,i.index))),r=new Token("T_NULL",null,{close:!1,escape:!1,escapeType:null}),"#"===i[2])r.ident="T_DIRECTIVE",r.val={key:i[3],value:i[4]};else{switch("/"===i[2]&&(r.info.close=!0),i[5]){case"*":r.ident="T_LOOP";break;case"&":r.ident="T_BLOCK";break;case">":r.ident="T_IMPORT";break;case"?":r.ident="T_CONDITION";break;default:r.ident="T_DATA"}"undefined"!=typeof i[6]&&"!"===i[6].charAt(0)&&(r.info.escape=!0,"undefined"!=typeof i[7]&&(r.info.escapeType=i[7])),r.val=i[8]}a.push(r),o+=i.index+i[0].length}else a.push(new Token("STRING",t)),o+=t.length;return a.push(new Token("EOD")),a},collapseParse=function(e){for(var n,t,r,a,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 "+a+" at index "+i);switch(r.ident){case"T_LOOP":case"T_BLOCK":case"T_CONDITION":o="N"+r.ident.slice(1);break;default:throw new Error("Invalid block element "+r.ident+" at index "+i)}a=new Node(o,r.val,n.slice().reverse()),e.splice(t,i-t+1,a),i=0}else i+=1;return e},unwindNode=function(e,n,t,r){var a,o,i,s,u,l,p,d,c;switch(n.ident){case"STRING":return e+n.val;case"T_DIRECTIVE":return setDeepProperty(n.val.key,n.val.value,r.opts,!0),e;case"T_DATA":return u=n.val,r.loopTag&&n.val===r.loopTag.slice(0,-1)&&(u=r.loopTag+"."+r.i.toString()),l=getDeepProperty(u,r.data),n.info.escape&&(p=n.info.escapeType?n.info.escapeType:r.opts.escape,l=escapeData(l,r.opts.escapeSets[p])),e+l;case"T_IMPORT":if(i=r.includes[n.val],"undefined"!=typeof i&&null!==i)l=i(r.data,r.opts);else{if(!r.opts.ignoreUndefined)throw new Error("Cannot get include "+n.val);l=""}return e+l;case"N_LOOP":for(i="",a=n.content,a.data=r.data,a.loopTag=n.val,a.includes=r.includes,a.opts=deepMergeJson({},r.opts),o=getDeepProperty(n.val,r.data),s=0;s<o.length;s+=1)a.i=s,i+=a.reduce(unwindNode,"");return e+i;case"N_BLOCK":return a=n.content,a.data=getDeepProperty(n.val,r.data),a.loopTag=null,a.includes=r.includes,a.opts=deepMergeJson({},r.opts),e+a.reduce(unwindNode,"");case"N_CONDITION":return c=getDeepPropertyOrUndef(n.val,r.opts),c?(a=n.content,a.data=r.data,a.loopTag=null,a.includes=r.includes,a.opts=deepMergeJson({},r.opts),d=a.reduce(unwindNode,"")):d="",e+d;default:return e}},render=function(e,n,t){var r=collapseParse(tokenise(e));return r.data=n,r.loopTag=null,r.i=null,r.includes=render.includes,r.opts=safeDeepMergeJson(globalOptions,t),r.reduce(unwindNode,"")};if(render.partial=function(e){return function(e,n,t){return e.data=n,e.loopTag=null,e.i=null,e.includes=render.includes,e.opts=safeDeepMergeJson(globalOptions,t),e.reduce(unwindNode,"")}.bind(null,collapseParse(tokenise(e)))},render.includes={},render.addInclude=function(e,n){this.includes[e]=n.split?render.partial(n):n},!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),a=t||{useHtml:!0};"undefined"==typeof a.useHtml&&(a.useHtml=!0),this.each(function(e,n){a.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/dist/tinyDOM-Sideburns.min.js.map b/dist/tinyDOM-Sideburns.min.js.map index 09e8e81..f5060d7 100644 --- a/dist/tinyDOM-Sideburns.min.js.map +++ b/dist/tinyDOM-Sideburns.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/sideburns.cut.js","src/tdsb.src.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 +{"version":3,"sources":["src/sideburns.cut.js","src/tdsb.src.js"],"names":["globalOptions","ignoreUndefined","escape","escapeSets","xml","&","<",">","\"","'","general","deepMergeJson","obja","objb","prop","hasOwnProperty","setDeepProperty","ident","value","obj","makepath","list","recurse","propList","id","length","shift","Error","push","map","split","e","trim","getDeepProperty","ret","curident","reduce","a","b","i","JSON","stringify","getDeepPropertyOrUndef","res","undefined","safeDeepMergeJson","TypeError","escapeRegex","reg","replace","escapeData","datum","escapes","String","join","captureTags","Node","type","val","content","this","Token","info","tokenise","src","matcher","chunk","tok","tokens","match","exec","substr","index","input","close","escapeType","key","charAt","collapseParse","tokenList","j","targetToken","targetNode","nodeName","slice","reverse","splice","unwindNode","output","node","arr","innerArr","dataArr","dataVal","ifresult","iff","opts","loopTag","toString","data","includes","render","options","nodes","partial","bind","addInclude","name","template","window","mu","templates","path","fn","rendered","useHtml","each","innerHTML","textContent","ready","getAttribute"],"mappings":"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"} \ No newline at end of file diff --git a/src/sideburns.cut.js b/src/sideburns.cut.js index 0267860..6157145 100644 --- a/src/sideburns.cut.js +++ b/src/sideburns.cut.js @@ -1,13 +1,15 @@ - +/*jslint node: true */ +'use strict'; var globalOptions = { ignoreUndefined: false, escape: "general", escapeSets: { xml: { + "&": "&", "<": "<", ">": ">", - "&": "&", - "\"": """ + "\"": """, + "'": "'" }, general: { "\"": "\\\"", @@ -28,11 +30,20 @@ var globalOptions = { } return obja; }, - setDeepProperty = function (ident, value, obj) { + setDeepProperty = function (ident, value, obj, makepath) { var list, recurse = function (propList, value, obj) { + var id; if (propList.length > 1) { - recurse(propList, value, obj[list.shift()]); + id = list.shift(); + if (!obj.hasOwnProperty(id)) { + if (makepath) { + obj[id] = {}; + } else { + throw new Error("No internal property " + id + " at depth N - " + (list.length)); + } + } + recurse(propList, value, obj[id]); } else { obj[propList[0]] = value; } @@ -79,13 +90,46 @@ var globalOptions = { 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] + "."; + /** + * Uses getDeepProperty to retrieve a property from an + * object but emulates normal object value retrieval by + * returning undefined if a property doesn't exist instead + * of throwing an error + * @param {String} ident The full 'path' of the property + * to retrieve, where dots denote + * sub objects and the last portion + * is the property in the deepest level + * @param {Object} obj The [JSON] object that you are + * trying to retrieve a value from + * @returns {*} The data stored under the specified deep + * identifier, or undefined if the identifier + * does not resolve + */ + getDeepPropertyOrUndef = function (ident, obj) { + var res; + try { + res = getDeepProperty(ident, obj); + } catch (e) { + res = undefined; } - return ret + ident; + return res; }, + /** + * Perform a deep merge that will not modify either of the original objects. Also checks + * that both parameters are strictly objects. + * @param {Object} obja The object that forms the base of the return value. All + * properties in this object will be present in the return + * object, but may be overwritten with new values. The passed + * object instance will not be modified. + * @param {Object} objb The object that offers the values to be copied into the + * first object. All properties in this object will exist in the + * return object with the values specified. The return object may + * have other properties if they are defined in obja but not this + * parameter. + * @returns {Object} An object that contains all of the properties of obja and objb, with + * the values from objb taking precedence if the property is defined in + * both (The key set is {keys(obja) ∪ keys(objb)}). + */ safeDeepMergeJson = function (obja, objb) { if (typeof (obja) !== 'object') { throw new TypeError("Cannot deep merge with an " + typeof (obja) + ": [Param 1]"); @@ -96,6 +140,18 @@ var globalOptions = { return deepMergeJson(deepMergeJson({}, obja), objb); }, + escapeRegex = function (reg) { + return reg.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); + }, + escapeData = function (datum, escapes) { + var prop; + for (prop in escapes) { + if (escapes.hasOwnProperty(prop)) { + datum = String(datum).split(prop).join(escapes[prop]); + } + } + return datum; + }, /** * Using this Regex * This regular expression will match and split all valid tags for Sideburns, and provides @@ -120,53 +176,49 @@ var globalOptions = { * 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) { + 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*(\]\])/, + /** + * A Node represents a sub-group inside a Sideburns + * template and typically contains a list of other + * Nodes and Tokens + * @param {String} type A value that identifies the + * specific type of this Node + * @param {*} val The exact value this Node represents + * @param {Array} content A list of other nodes and tokens + * @returns {Node} The complete node, representing a sub-tree in a + * Sideburns template + */ + Node = function (type, val, content) { this.ident = type || "N_NULL"; this.val = val || null; - this.content = modifiers || {}; + this.content = content || {}; return this; }, + /** + * A Token represents an atomic unit in a Sideburns template + * @param {String} ident A value that identifies the specific + * type of this token + * @param {*} val The exact value that this token represents + * @param {Object} info Additional details that further describe this + * token + * @returns {Token} The complete token, representing an element in a + * Sideburns template + */ Token = function (ident, val, info) { this.ident = ident || "T_NULL"; this.val = val || null; this.info = info || {}; return this; }, + /** + * Takes a Sideburns template and splits it into constituant tokens. + * Output is guarenteed to consist of Tokens only, as the template is + * not collapsed at this stage. + * @param {String} src The sideburns template that will be split + * into tokens + * @returns {Array} A list of Tokens that represent all elements of the + * template + */ tokenise = function (src) { var tokens = [], last = 0, @@ -176,6 +228,8 @@ var globalOptions = { chunk, tok; + // Possibly hacky, matcher both sets match and returns whether it + // has been set to null matcher = function () { return ((match = captureTags.exec(chunk)) !== null); }; @@ -188,18 +242,29 @@ var globalOptions = { 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]; + tok.val = { + key: match[3], + value: match[4] + }; } else { if (match[2] === '/') { tok.info.close = true; } - if (match[5] === "*") { + switch (match[5]) { + case "*": tok.ident = "T_LOOP"; - } else if (match[5] === "&") { + break; + case "&": tok.ident = "T_BLOCK"; - } else { + break; + case ">": + tok.ident = "T_IMPORT"; + break; + case "?": + tok.ident = "T_CONDITION"; + break; + default: tok.ident = "T_DATA"; } @@ -221,12 +286,21 @@ var globalOptions = { tokens.push(new Token("EOD")); return tokens; }, + /** + * Takes an Array of tokens and collapses positional grouping tokens + * into Nodes + * @param {Array} tokens A tokenised template. Should consist entirely + * of Tokens. + * @returns {Array} A list of nodes and tokens that represent blocks and inline + * elements in the template respectively + */ collapseParse = function (tokens) { var tokenList, i = 0, j, targetToken, - targetNode; + targetNode, + nodeName; while (i < tokens.length) { if (tokens[i].info && tokens[i].info.close) { @@ -242,12 +316,18 @@ var globalOptions = { } } - 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()); + switch (targetToken.ident) { + case "T_LOOP": + case "T_BLOCK": + case "T_CONDITION": + nodeName = "N" + targetToken.ident.slice(1); + break; + default: + throw new Error("Invalid block element " + targetToken.ident + " at index " + i); } + targetNode = new Node(nodeName, targetToken.val, tokenList.slice().reverse()); + tokens.splice(j, (i - j) + 1, targetNode); i = 0; } else { @@ -257,12 +337,43 @@ var globalOptions = { return tokens; }, + /** + * This is an Array/Reduce function. + * Takes an element from the array and evaluates it in + * the data context that has been added to the array. + * Tokens will be evaluated in place, but Nodes will be + * "unwound"; this function is recursively applied to Nodes but + * contains no reference counting, so care should be taken to + * avoid (the unlikely scenario of) circular references + * @param {String} output The result of previously evaluated + * nodes. Essentially the 'running total' + * of the template so far. + * @param {Token|Node} node The element to be evaluated + * @param {Number} index The position in the current array. + * Laregely unused, but needed for access to + * arr parameter + * @param {Array} arr The array being reduced; should be enhanced with + * 'data', 'loopTag' and 'i' properties + * @param {Object} arr.data The data context used when evaluting data tokens + * @param {?String} arr.loopTag The tag of the current loop being evaluated. Will be null + * if no loop block is being evaluated + * @param {?Number} arr.i The position of the iteration through the current + * loop tag. This is distinct from index in that it refers + * to the position within a data array, not withing the reduce + * function. + * @returns {String} The result of evaluating the current node, appended to the + * previous output provided as the first parameter + */ unwindNode = function (output, node, index, arr) { - var innerArr, dataArr, content, i, dataVal; + var innerArr, dataArr, content, i, dataVal, datum, escapeType, ifresult, iff; switch (node.ident) { case "STRING": return output + node.val; + case "T_DIRECTIVE": + setDeepProperty(node.val.key, node.val.value, arr.opts, true); + return output; + case "T_DATA": dataVal = node.val; if (arr.loopTag) { @@ -270,14 +381,37 @@ var globalOptions = { dataVal = arr.loopTag + "." + (arr.i).toString(); } } - return output + getDeepProperty(dataVal, arr.data); + datum = getDeepProperty(dataVal, arr.data); + if (node.info.escape) { + if (node.info.escapeType) { + escapeType = node.info.escapeType; + } else { + escapeType = arr.opts.escape; + } + datum = escapeData(datum, arr.opts.escapeSets[escapeType]); + } + return output + datum; + case "T_IMPORT": + content = arr.includes[node.val]; + if (typeof content !== "undefined" && content !== null) { + datum = content(arr.data, arr.opts); + } else { + if (arr.opts.ignoreUndefined) { + datum = ""; + } else { + throw new Error("Cannot get include " + node.val); + } + } + return output + datum; case "N_LOOP": content = ""; innerArr = node.content; innerArr.data = arr.data; innerArr.loopTag = node.val; + innerArr.includes = arr.includes; + innerArr.opts = deepMergeJson({}, arr.opts); dataArr = getDeepProperty(node.val, arr.data); @@ -292,25 +426,77 @@ var globalOptions = { innerArr = node.content; innerArr.data = getDeepProperty(node.val, arr.data); innerArr.loopTag = null; + innerArr.includes = arr.includes; + innerArr.opts = deepMergeJson({}, arr.opts); return output + innerArr.reduce(unwindNode, ""); + case "N_CONDITION": + iff = getDeepPropertyOrUndef(node.val, arr.opts); + if (iff) { + innerArr = node.content; + innerArr.data = arr.data; + innerArr.loopTag = null; + innerArr.includes = arr.includes; + innerArr.opts = deepMergeJson({}, arr.opts); + + ifresult = innerArr.reduce(unwindNode, ""); + } else { + ifresult = ""; + } + + return output + ifresult; + default: return output; } }, + /** + * Links the various stages of the Sideburns compiler together + * and returns the end result + * @param {!String} src The Sideburns template to be rendered + * @param {!Object} data Contains all of the data that will be + * referenced inside the Sideburns template + * @param {?Object} options A set of options that will be merged with + * the global options, but can be overriden + * inside the template with directives + * @returns {String} The rendered template, with data inserted. All + * whitespace is currently left intact, but this may + * change in a future version. + */ render = function (src, data, options) { var nodes = collapseParse(tokenise(src)); nodes.data = data; nodes.loopTag = null; nodes.i = null; + nodes.includes = render.includes; + nodes.opts = safeDeepMergeJson(globalOptions, options); return nodes.reduce(unwindNode, ""); }; +/** + * Partially applies the rendering process, compiling a node list but not + * unwinding it, allowing pre-processing of large templates on initialisation + * and reducing the need to compile a template on every render. + * @param {String} src The Sideburns template to be rendered + * @returns {Function} A function that takes a data and options parameter, identical + * to those required by the basic render function. + */ render.partial = function (src) { return function (tokens, data, options) { tokens.data = data; tokens.loopTag = null; tokens.i = null; + tokens.includes = render.includes; + tokens.opts = safeDeepMergeJson(globalOptions, options); return tokens.reduce(unwindNode, ""); }.bind(null, collapseParse(tokenise(src))); }; + +render.includes = {}; +render.addInclude = function (name, template) { + if (template.split) { + this.includes[name] = render.partial(template); + } else { + this.includes[name] = template; + } +}; -- GitLab