UNPKG

jtdal

Version:

Small template engine based on Zope TAL, using data attributes

1 lines 7.2 kB
"use strict";export default class t{static t=["condition","repeat","content","replace","attributes","omittag"];static i="(?:[\\w\\-\\/]*[\\w](?:[\\s]*\\|[\\s]*[\\w\\-\\/]*[\\w])*)";static o="STRING:(?:[^;](?:(?!<=;);)?)+";static l="MACRO:[a-zA-Z0-9-]+";static u="(?:(?:!)?[\\w\\-\\/]*[\\w](?:[\\s]*\\|[\\s]*[\\w\\-\\/]*[\\w])*)";static p="(?:"+t.o+"|(?:"+t.u+")(?:[\\s]*\\|[\\s]*"+t.o+")?)";static h="(?:"+t.l+"|"+t.o+"|"+t.u+"(?:[\\s]*\\|[\\s]*"+t.o+")?)";static m=new RegExp("<((?:\\w+:)?\\w+)(\\s+[^<>]+?)??\\s+\\bdata-tdal-(?:"+t.t.join("|")+")\\b=(['\"])(.*?)\\3(\\s+[^<>]+?)??\\s*(/)?>","i");static S=/\s((?:[\w-]+:)?[\w-]+)=(?:(['"])(.*?)\2|([^>\s'"]+))/gi;static _=new RegExp("(?:{("+t.i+")}|{\\?("+t.u+")}(.*?){\\/\\2})");static A=new RegExp("^[\\s]*("+t.p+")[\\s]*$");static v=new RegExp("^[\\s]*([\\w\\-]+?)[\\s]+("+t.i+")[\\s]*$");static R=new RegExp("^[\\s]*(?:(structure)[\\s]+)?("+t.h+")[\\s]*$");static N=new RegExp("[\\s]*(?:(?:([\\w\\-]+)(\\??)[\\s]+("+t.p+")[\\s]*)(?:;;[\\s]*|$))","g");static P=/\s*(data-tdal-[\w-]+)=(?:(['"])(.*?)\2|([^>\s'"]+))/gi;static T=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);k={};O;$;static C(e,s={}){let r,i='""';for(;null!=(r=t._.exec(e));)if(0<r.index&&(i+="+"+JSON.stringify(String(e.substring(0,r.index)))),e=e.substring(r.index+r[0].length),r[1])i+="+(a("+t.J(r[1],!1,s)+')&&("string"===typeof t[t[0]]||("number"===typeof t[t[0]]&&!isNaN(t[t[0]])))?t[t[0]]:"")';else if(r[2]){const e=t.J(r[2],!0,s);"true"===e?i+="+"+this.C(r[3],s):"false"!==e&&(i+="+(true==="+e+'?""+'+this.C(r[3],s)+':"")')}return 0<e.length&&(i+="+"+JSON.stringify(String(e))),i}static J(t,e=!1,s={}){let r="";if(t)t:{const i=t.split("|"),a=i.length;for(let t=0;t<a;++t){0!=t&&(r+="||");let a=i[t].replace(/^\s+/,"");if(a.startsWith("STRING:")){r+="("+this.C(a.substring(7))+")";break t}if(a.startsWith("MACRO:")){void 0!==s[a.substring(6)]?r+='("function"===typeof m["'+a.substring(6)+'"]?m["'+a.substring(6)+'"]():false)':r+="false";break t}{a=a.replace(/\s+$/,"");const t="!"===a[0],s=e||t,i=(t?a.substring(1):a).split("/");if(0<i.length&&0<i[0].length)switch(i[0]){case"FALSE":r+=t?"true":"false";break t;case"TRUE":r+=t?"false":"true";break t;case"REPEAT":3==i.length&&(r+=(s?(t?"!":"")+"b(":"")+'c(r,"'+i.join("/")+'")'+(s?")":""));break;case"GLOBAL":1<i.length&&0<i[1].length&&(r+=(s?(t?"!":"")+"b(":"")+'c(d,"'+i.slice(1).join("/")+'")'+(s?")":""));break;default:r+=s?(t?"!(":"")+'b(c(r,"'+i.join("/")+'"))||b(c(d,"'+i.join("/")+'"))'+(t?")":""):'([c(r,"'+i.join("/")+'"),c(d,"'+i.join("/")+'")].find((v)=>false!==v)??false)'}}}}else r="false";return r}constructor(t=!0,e=!0){this.O=t,this.$=e}j(e){let s,r="";const i="data-tdal-";for(;null!==(s=t.m.exec(e));){0<s.index&&(r+="+"+JSON.stringify(String(e.substring(0,s.index)))),e=e.substring(s.index+s[0].length);let a=!!s[6]||t.T.has(s[1].toLowerCase());const n=["",s[0],"","","","","",""],o={},l=s[0].matchAll(t.S);for(const t of l)o[t[1]]=t;if(n[1]=n[1].replaceAll(t.P,""),!a){const t=new RegExp("<(\\/)?"+s[1]+"[^<>]*(?<!\\/)>","gi");let r,i=[],o=1;for(;void 0===i[0]&&null!==(r=t.exec(e));)r[1]?o--:o++,0==o&&(i=[r.index,r[0].length]);void 0===i[0]?a=!0:(n[4]+=this.j(e.substring(0,i[0])),n[6]+=e.substring(i[0],i[0]+i[1]),e=e.substring(i[0]+i[1]))}{let e,s,r=i+t.t[0];if(o[r]&&t.A.exec(o[r][3])){if(s=t.J(o[r][3],!0,this.k),"false"===s)break;"true"!==s&&(n[0]+="+(true==="+s+'?""',n[7]=':"")'+n[7])}if(r=i+t.t[1],o[r]&&(e=t.v.exec(o[r][3]))){if(s=t.J(e[2],!1,this.k),"false"==s||'""'==s||"true"==s)break;n[0]+="+(",n[0]+="(t[0]+=3)&&",n[0]+="a("+s+",-3)&&",n[0]+="(",n[0]+="(Array.isArray(t[t[0]-3])&&(t[t[0]-2]=t[t[0]-3])&&(t[t[0]-3]=true))",n[0]+="||",n[0]+='("object"===typeof t[t[0]-3]&&null!==t[t[0]-3]&&(t[t[0]-2]=Object.keys(t[t[0]-3])))',n[0]+=")&&(t[t[0]-1]=t[t[0]-2].length)",n[0]+="?",n[0]+="t[t[0]-2].reduce(",n[0]+="(o,v,i)=>{",n[0]+='r["'+e[1]+'"]=(true===t[t[0]-3])?v:t[t[0]-3][v];',n[0]+="const n=i+1,l=t[t[0]-1];",n[0]+='r["REPEAT"]["'+e[1]+'"]={index:(true===t[t[0]-3])?i:v,number:n,length:l,even:0==(n%2),odd:1==(n%2),first:1==n,last:l==n};',n[0]+="return o",n[7]=';},""):"")+((t[0]-=3)&&(delete r["REPEAT"]["'+e[1]+'"])&&(delete r["'+e[1]+'"])?"":"")'+n[7]}if(r=i+t.t[2],o[r]&&(e=t.R.exec(o[r][3]))){if(s=t.J(e[2],!1,this.k),"false"==s)n[4]="";else if("true"!=s){let t=["",""];"structure"!=e[1]&&(t[0]="String(",t[1]=").replace(f,m=>s[m])"),n[3]+="+(a("+s+')&&("string"===typeof t[t[0]]||("number"===typeof t[t[0]]&&!isNaN(t[t[0]])))?'+t[0]+"t[t[0]]"+t[1]+':(true!==t[t[0]]?"":""',n[5]+="))"}}else if(r=i+t.t[3],o[r]&&(e=t.R.exec(o[r][3])))if(s=t.J(e[2],!1,this.k),"false"==s)n[1]="",n[4]="",n[6]="";else if("true"!=s){let t=["",""];"structure"!=e[1]&&(t[0]="String(",t[1]=").replace(f,m=>s[m])"),n[0]+="+(a("+s+')&&("string"===typeof t[t[0]]||("number"===typeof t[t[0]]&&!isNaN(t[t[0]])))?'+t[0]+"t[t[0]]"+t[1]+':(true!==t[t[0]]?"":""',n[7]="))"+n[7]}if(r=i+t.t[4],o[r]){const i=o[r][3].matchAll(t.N);for(e of i){const r="?"===e[2];s=t.J(e[3],r,this.k),"false"===s?void 0!==o[e[1]]&&(n[1]=n[1].replace(new RegExp("\\s*\\b"+e[1]+"\\b(?:=(['\"]).*?\\1)?(?=\\s|\\/?>)"),"")):"true"!==s&&(n[2]+=r?`+(${s}?" ${e[1]}":""`:`+(a(${s})&&((t[t[0]]&&"string"===typeof t[t[0]])||("number"===typeof t[t[0]]&&!isNaN(t[t[0]])))?" ${e[1]}=\\""+t[t[0]]+"\\"":( true !== t[t[0]]?"":"${e[1]}"`,void 0!==o[e[1]]&&(n[1]=n[1].replace(new RegExp("\\s*\\b"+e[1]+"\\b(?:=(['\"]).*?\\1)?(?=\\s|\\/?>)"),""),n[2]+=void 0!==o[e[1]][3]&&""!=o[e[1]][3]?'+"="+'+JSON.stringify(String(o[e[1]][2]+o[e[1]][3]+o[e[1]][2])):""),n[2]+=")",r||(n[2]+=")"))}}r=i+t.t[5],o[r]&&t.A.exec(o[r][3])&&(s=t.J(o[r][3],!0,this.k),"true"==s?(n[1]="",n[6]=""):"false"!=s&&(n[0]+="+("+s+'?"":""',n[3]=")"+n[3],n[5]+="+("+s+'?"":""',n[7]=")"+n[7]))}n[1]=n[1].replace(/\s*\/?>$/,""),!a||""==n[4]&&""==n[3]&&""==n[5]||(n[6]="</"+s[1]+">",a=!1),r+=n[0]+"+"+JSON.stringify(String(n[1]))+n[2]+(""!=n[1]?'+"'+(a?"/":"")+'>"':"")+n[3]+n[4]+n[5]+"+"+JSON.stringify(String(n[6]))+n[7]}return r+="+"+JSON.stringify(String(e)),r}MacroAdd(t,e){let s=!1;return t.match(/^[a-zA-Z0-9-]+$/)&&(s=!0,this.k[t]='""'+this.j(this.$?e.replace(/<!--.*?-->/gs,""):e),this.O&&(this.k[t]="("+this.k[t]+").trim()")),s}L(t){const e=["",""];let s=this.j(this.$?t.replaceAll(/<!--.*?-->/gs,""):t),r='const r={"REPEAT":{}}';r+=",t=[1]",r+=",m={"+Object.keys(this.k).map(t=>'"'+t+'":()=>'+this.k[t]).join(",")+"}",r+=',f=/[&<>"]/g',r+=',s={"&":"&amp;","<":"&lt;",">":"&gt;","\\"":"&quot;"}',r+=",a=(e,i=0)=>{",r+="t[t[0]+i]=e;",r+="return false!==t[t[0]+i]",r+="}",r+=",c=(a,b)=>{",r+='let z=!1,y=b.split("/"),x,w,l=y.length;',r+="if(l&&y[0].length)",r+="for(z=a,x=0;x<l&&1!==z;x++)",r+='z="object"===typeof z&&null!==z&&void 0!==(w="function"===typeof z[y[x]]?z[y[x]](d,r):z[y[x]])&&w;',r+="return z",r+="}",r+=",b=(v)=>{",r+='return v&&("object"===typeof v?0<Object.keys(v).length:(Array.isArray(v)?0<v.length:true))',r+="}",r+=";",this.O&&(e[0]="(",e[1]=").trim()"),r+="return "+e[0]+'""'+s+e[1],s="";do{s=r,r=r.replace(/(?<!\\)"\+"/g,"").replace('(true!==t[t[0]]?"":"")','""')}while(s!=r);return r}CompileToFunction(t){return new Function("d",this.L(t))}CompileToString(t){return"function(d){"+this.L(t)+"}"}}