/** * * Xpresion * Simple eXpression parser engine with variables and custom functions support for PHP, Python, Node.js and Browser * @version: 1.0.1 * * https://github.com/foo123/Xpresion * **/ !function(t,n,i){"use strict";"undefined"!=typeof Components&&"object"==typeof Components.classes&&"object"==typeof Components.classesByID&&Components.utils&&"function"==typeof Components.utils.import?(t.$deps=t.$deps||{})&&(t.EXPORTED_SYMBOLS=[n])&&(t[n]=t.$deps[n]=i.call(t)):"object"==typeof module&&module.exports?(module.$deps=module.$deps||{})&&(module.exports=module.$deps[n]=i.call(t)):"undefined"!=typeof System&&"function"==typeof System.register&&"function"==typeof System.import?System.register(n,[],function(e){e(n,i.call(t))}):"function"==typeof define&&define.amd&&"function"==typeof require&&"function"==typeof require.specified&&require.specified(n)?define(n,["module"],function(n){return i.moduleUri=n.uri,i.call(t)}):n in t||(t[n]=i.call(t)||1)&&"function"==typeof define&&define.amd&&define(function(){return t[n]})}("undefined"!=typeof self?self:this,"Xpresion",function(t){"use strict";var n,i="prototype",e=Object[i].hasOwnProperty,l=Object[i].toString,r=JSON.stringify,o=Object.keys,u=Object.create,s=Math.floor,a=Math.round,p=Math.abs,h=Math.max,f={meridian:{am:"am",pm:"pm",AM:"AM",PM:"PM"},ordinal:{ord:{1:"st",2:"nd",3:"rd"},nth:"th"},timezone:["UTC","EST","MDT"],timezone_short:["UTC","EST","MDT"],day:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],day_short:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],month:["January","February","March","April","May","June","July","August","September","October","November","December"],month_short:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},c="charAt",y=/^\s+|\s+$/g,d=String[i].trim?function(t){return t.trim()}:function(t){return t.replace(y,"")},g=!1;function _(t,n){return t&&e.call(t,n)?1:0}function v(t,n,i,e){var l=String(t);if(i=i||"0",e)for(;l.lengthn.start)for(h=n.start,f=-1===n.end?y-1:Math.min(n.end,y-1),c=h;c<=f;c++)g+=P(t,n.tpl,i,e,c,r,o);else p||n.start!==n.end||(g=P(t,n.tpl,i,e,null,r,o));return g}function R(t,n,i,e,l,r,o){var u,s,a,p,h="";if(n.stpl&&(_(i,n.stpl)||_(D.subGlobal,n.stpl)||_(e,n.stpl)||_(e,"*")||_(D.fnGlobal,n.stpl)||_(D.fnGlobal,"*")))if(u=E(t,n.key,[String(n.name)],n.loc?null:o),_(i,n.stpl)||_(D.subGlobal,n.stpl))null==l||0===l&&n.start===n.end&&n.opt||!T(u)||(u=l0?new Array(l+1).join(i||" ")+e:e}function A(){return s((new Date).getTime()/1e3)}function C(t,n){if(!arguments.length)return"";var i,l,r,o,u,h,c=f,y={},d=(u=n instanceof Date?new Date(n):"number"==typeof n?new Date(1e3*n):new Date).getTimezoneOffset(),g=p(d),_=u.getMonth();for(y.G=u.getHours(),y.j=u.getDate(),h=y.j%10,y.n=_+1,y.Y=u.getFullYear(),y.w=u.getDay(),y.N=y.w||7,y.d=M(y.j,2,"0"),y.D=c.day_short[y.w],y.l=c.day[y.w],y.S=c.ordinal.ord[y.j]?c.ordinal.ord[y.j]:c.ordinal.ord[h]?c.ordinal.ord[h]:c.ordinal.nth,y.z=a((new Date(y.Y,_,y.j)-new Date(y.Y,0,1))/864e5),y.W=M(1+a((new Date(y.Y,_,y.j-y.N+3)-new Date(y.Y,0,4))/864e5/7),2,"0"),y.F=c.month[_],y.m=M(y.n,2,"0"),y.M=c.month_short[_],y.t=new Date(y.Y,_+1,0).getDate(),y.L=y.Y%4==0&y.Y%100!=0|y.Y%400==0,y.o=y.Y+(11===_&&y.W<9?1:0===_&&y.W>9?-1:0),y.y=y.Y.toString().slice(-2),y.a=y.G>11?c.meridian.pm:c.meridian.am,y.A=y.G>11?c.meridian.PM:c.meridian.AM,y.B=M(s((3600*u.getUTCHours()+60*u.getUTCMinutes()+u.getUTCSeconds()+3600)/86.4)%1e3,3,"0"),y.g=y.G%12||12,y.h=M(y.g,2,"0"),y.H=M(y.G,2,"0"),y.i=M(u.getMinutes(),2,"0"),y.s=M(u.getSeconds(),2,"0"),y.u=M(1e3*u.getMilliseconds(),6,"0"),y.e="",y.I=new Date(y.Y,0)-Date.UTC(y.Y,0)!=new Date(y.Y,6)-Date.UTC(y.Y,6)?1:0,y.O=(d>0?"-":"+")+M(100*s(g/60)+g%60,4,"0"),y.P=y.O.substr(0,3)+":"+y.O.substr(3,2),y.T="UTC",y.Z=60*-d,y.U=u/1e3|0,y.c=[y.Y,"-",y.m,"-",y.d,"\\",y.T,y.H,":",y.i,":",y.s,y.P].join(""),y.r=[y.D,", ",y.d," ",y.M," ",y.Y," ",y.H,":",y.i,":",y.s," ",y.O].join(""),i="",r=0,o=t.length;r","[","]"],D.fnGlobal={},D.subGlobal={},D.guid=m,D.multisplit=function(t,n,i){var e,l,r,o,u,s,a,p,h,f,y,g,v,T,S,E,x,R,P,D,w,N,F,M,A,C,k=n[0],j=n[1],I=n[2],Y=n[3],U=k.length,G=j.length,V=I.length,L=Y.length,z="#"+Y,K=null,X=0,B=0,q=0,J=0,H=t.length,W=[k,U,j,G],Z=[I,V,Y,L],Q=[null,0,null,0,null,0,null,0];for(i=!0===i,P={type:1,name:null,key:null,stpl:null,dval:null,opt:0,neg:0,algn:0,loc:0,start:0,end:0},w=h=new $({type:0,val:"",algn:""}),N=null,D=null,S={},x=null,E={},R=null,W[1]l&&4>r;)W[l+1]l;)Q[g]=W[l],Q[g+1]=W[l+1],l+=2,g+=2;for(;4>r;)Q[g]=Z[r],Q[g+1]=Z[r+1],r+=2,g+=2;for(a=null,y="",g=0;g1?(l=(l=d(y[0])).length?0|+l:0,r=(r=d(y[1])).length?0|+r:-1,B=1):(r=l=(l=d(y[0])).length?0|+l:0,B=0),y="",X=0}else B=0,X=0,l=0,r=0;if(X&&null===K&&(K=""),"@"===(p=u[c](0))?(q=1,u=u.slice(1)):q=0,"."===(p=u[c](0))?(J=1,u=u.slice(1)):J=0,u=(o=-1s.length&&l.arity_min<=l.arity&&(r=l.arity_min),o=n(l,r?s.splice(s.length-r,r):[]),s.push(o),i&&e.dispose());return u=null,s[0]},I.reduce=function(t,i,e,l,r,o){var u,s,a,p,h,f,c,y=null,d=0;if(l)if(rt===(p=l).type&&(p=p.morph([r,t,i])),lt===p.type){if(!1===(f=p.validate(r,i,t))[0])return o.err=!0,o.msg=f[1],!1;(a=p.node(null,r,i,t)).arity=f[0],e.unshift(a),i.unshift(a)}else{if(e.length&&(d=(y=e[0]).op_index),y&&y.op_next(p,r,i,t)){for(;i.length>d;)c=(s=(u=i.shift()).node).arity,et&s.type&&0===c?c=1:c>t.length&&s.arity_min<=s.arity&&(c=s.arity_min),a=s.node(c?t.splice(t.length-c,c):[],u.pos),t.push(a);if(!y.op_complete())return;e.shift(),i.shift(),p=y.node,y.dispose(),d=e.length?e[0].op_index:0}else if(!1===(f=p.validate(r,i,t))[0])return o.err=!0,o.msg=f[1],!1;if(h=p.fixity,K===h)(c=p.arity)>t.length&&p.arity_min<=t.length&&(c=p.arity_min),a=p.node(c?t.splice(t.length-c,c):[],r),t.push(a);else if(L===h)i.unshift(at(p.otype,p.arity,p,null,r)),et&p.type&&0===p.arity&&t.push(n.node(null,r+1));else{for(;i.length>d;){if(!((s=(u=i.shift()).node).priorityt.length&&s.arity_min<=s.arity&&(c=s.arity_min),a=s.node(c?t.splice(t.length-c,c):[],u.pos),t.push(a)}i.unshift(at(p.otype,p.arity,p,null,r))}}else for(;i.length;)c=(s=(u=i.shift()).node).arity,et&s.type&&0===c?c=1:c>t.length&&s.arity_min<=s.arity&&(c=s.arity_min),a=s.node(c?t.splice(t.length-c,c):[],u.pos),t.push(a)},I.parse_delimited_block=function(t,n,i,e,l){5>arguments.length&&(l=!0);var r=e,o=!1,u="";for(l=!1!==l,n+=1;n=3||!r&&!o&&!u)&&(p=!1);return l},I.parse=function(t,n){var i,l,r,u,s,a,p,h,f,c,y,d,g,_,v,m,T=I.reduce,b=st.get_entry,S=!e.call(n.RE,"t_var"),E=0,O={err:!1,msg:""};for(l=(i=String(t.source)).length,a=0,t._cnt=0,t._symbol_table={},t._cache={},t.variables={},f=[],c=[],y=[],d=0,E=0;a0&&!1===(h=t.t_op(n,s));)s=s.slice(0,-1);if(!1!==h){if(T(f,c,y,h,d+=1,O),O.err){E=1,m=O.msg;break}a+=s.length;continue}}if(S||!(p=r.match(n.RE.t_var))||!1===(h=t.t_var(n,p[1]))){if(p=r.match(n.RE.t_nonspc)){if(!1!==(h=t.t_liter(n,p[1],W))){d+=1,f.push(h.node(null,d)),a+=p[0].length;continue}if(!1!==(h=t.t_op(n,p[1]))){if(T(f,c,y,h,d+=1,O),O.err){E=1,m=O.msg;break}a+=p[0].length;continue}E=1,m='Unknown token "'+p[0]+'"';break}}else d+=1,f.push(h.node(null,d)),a+=p[0].length}if(E||(T(f,c,y),(1!==f.length||c.length>0)&&(E=1,m="Parse Error, Mismatched Parentheses or Operators")),!E)try{_=t.compile(f[0],n)}catch(r){E=1,m="Compilation Error, "+r.toString()}if(y=null,c=null,f=null,t._symbol_table=null,E)throw _=null,t.variables=[],t._cnt=0,t._cache={},t.evaluatorString="",t.evaluator=t.dummy_evaluator,new Error("Xpresion Error: "+m+' at "'+i+'"');return t.variables=o(t.variables),t.evaluatorString=_[0],t.evaluator=_[1],t},I.render=function(t,n){return t.render(n)},I.GET=function(t,n){if(!n||!n.length)return t;for(var i,e=0,l=n.length,r=t;e1?lt:et,[i,o,r,u,h(0,s),a]},ht.match_args=function(t,n,i,e){for(var l=e.length-1,r=0,o=p(t);(r=0)&&n===(l>=0?e[l].pos:-10);)r++,n--,l--;return r>=o?o:t<=0&&0},ht[i]=u(pt[i]),ht[i].otype=null,ht[i].ofixity=null,ht[i].opdef=null,ht[i].parts=null,ht[i].morphes=null,ht[i].dispose=function(){return this.otype=null,this.ofixity=null,this.opdef=null,this.parts=null,this.morphes=null,pt[i].dispose.call(this),this},ht[i].Polymorphic=function(t){return this.type=rt,this.morphes=(t||[]).map(ht.Condition),this},ht[i].morph=function(t){var n,i,e,l,r,o=this.morphes,u=o.length,s=0,a=o[0][1],p=!1;if(t.length<7){for(t.push(!!t[1].length&&t[1][t[1].length-1]),t.push(!!t[2].length&&t[2][0]),t.push(!!t[4]&&t[4].pos+1===t[0]),e=0,l=t[1].length-1,r=0;!e;)if(l>=0&&r=0))break;e=t[1][l--].type}t.push(e)}for(i={POS:t[0],TOKS:t[1],OPS:t[2],TOK:t[3],OP:t[4],PREV_IS_OP:t[5],DEDUCED_TYPE:t[6]};s=a.priority&&(a=n[1])}for(p||(n=a);rt===n.type;)n=n.morph(t);return n},ht[i].render=function(t){t&&t.length||(t=["",""]);var n,i=this.otype,e=this.output,l=this.parenthesize,r=l?I.LPAREN:"",o=l?I.RPAREN:"",u=I.COMMA,s=this.ofixity;t.length;return pt(i,n=e instanceof D?r+e.render({$:t})+o:z===s?r+t.join(e)+o:K===s?r+t.join(u)+o+e:e+r+t.join(u)+o,n)},ht[i].validate=function(t,n,i){var e=this.opdef,l="",r=0;return 0===e[0][0]&&!1===(r=ht.match_args(e[0][2],t-1,n,i))&&(l='Operator "'+this.input+'" expecting '+e[0][2]+" prior argument(s)"),[r,l]},ht[i].node=function(t,n,i,e){t=t||[],n=n||0;var l,r=this.otype;return this.revert&&t.reverse(),X===r&&t.length?r=t[0].type:t.length&&(t[0].type=r),l=new at(r,this.arity,this,t,n),lt===this.type&&arguments.length>2&&(l.op_parts=this.parts.slice(1),l.op_def=this.opdef.slice(0===this.opdef[0][0]?2:1),l.op_index=arguments[2].length+1),l},I.Func=ft,ft[i]=u(ht[i]),I[i]={constructor:I,source:null,variables:null,evaluatorString:null,evaluator:null,_cnt:0,_cache:null,_symbol_table:null,dummy_evaluator:null,dispose:function(){return this.dummy_evaluator=null,this.source=null,this.variables=null,this.evaluatorString=null,this.evaluator=null,this._cnt=null,this._symbol_table=null,this._cache=null,this},compile:function(t,n){n||(n=I.defaultConfiguration());var i=at.DFT(t,I.render,!0);return[i,function(t,n,i){return w("Fn,Cache,Xpresion",["return function evaluator(Var){",' "use strict";'," return "+t+";","};"].join("\n"))(n,i,I)}(i,n.FN,this._cache)]},evaluate:function(t){return 1>arguments.length&&(t={}),"function"==typeof this.evaluator?this.evaluator(t):null},debug:function(t){var n=["Expression: "+this.source,"Variables : ["+this.variables.join(",")+"]","Evaluator : "+this.evaluatorString];return arguments.length&&(n.push("Data : "+r(t,null,4)),n.push("Result : "+r(this.evaluate(t)))),n.join("\n")},toString:function(){return"[Xpresion source]: "+String(this.source)},t_liter:function(t,n,i){return Z===i?pt(Z,n,n):st.get_entry(t.RESERVED,n.toLowerCase())},t_block:function(t,n,i,l){if(l=l||"",Q===i)return pt(Q,n,n);if(tt===i){var r,o,u="re_"+n+l;return e.call(this._symbol_table,u)?r=this._symbol_table[u]:(r="re_"+ ++this._cnt,o=n.slice(1,-1),this._cache[r]=new RegExp(o,l||""),this._symbol_table[u]=r),pt(tt,n,"Cache."+r)}return!1},t_var:function(t,n){var i,l=n.split("."),r=l[0];return e.call(this.variables,r)||(this.variables[r]=r),1&~%!#@=_,;{}]+)/,t_num:/^(\d+(\.\d+)?)/,t_ident:/^([a-zA-Z_][a-zA-Z0-9_]*)\b/,t_var:/^\$([a-zA-Z0-9_][a-zA-Z0-9_.]*)\b/},blocks:{"'":{type:Q,parse:I.parse_delimited_block},'"':st("'"),"`":{type:tt,parse:I.parse_delimited_block,rest:I.parse_re_flags}},reserved:{null:pt(J,"null","null"),false:pt(nt,"false","false"),true:pt(nt,"true","true"),infinity:pt(Z,"Infinity","Infinity"),nan:pt(Z,"NaN","NaN"),none:st("null"),inf:st("infinity")},operators:{"(":{input:["(",-1,")"],output:"<$.0>",otype:X,fixity:K,associativity:V,priority:0},")":{input:[-1,")"]},"[":{input:["[",-1,"]"],output:"\\[<$.0>\\]",otype:it,fixity:K,associativity:V,priority:2},"]":{input:[-1,"]"]},",":{input:[1,",",1],output:"<$.0>,<$.1>",otype:q,fixity:z,associativity:G,priority:103},"?":{input:[1,"?",1,":",1],output:"(<$.0>?<$.1>:<$.2>)",otype:B,fixity:z,associativity:V,priority:100},":":{input:[1,":",1]},"!":{input:["!",1],output:"!<$.0>",otype:nt,fixity:L,associativity:V,priority:10},"~":{input:["~",1],output:"~<$.0>",otype:Z,fixity:L,associativity:V,priority:10},"^":{input:[1,"^",1],output:"Math.pow(<$.0>,<$.1>)",otype:Z,fixity:z,associativity:V,priority:11},"*":{input:[1,"*",1],output:"(<$.0>*<$.1>)",otype:Z,fixity:z,associativity:G,priority:20},"/":{input:[1,"/",1],output:"(<$.0>/<$.1>)",otype:Z,fixity:z,associativity:G,priority:20},"%":{input:[1,"%",1],output:"(<$.0>%<$.1>)",otype:Z,fixity:z,associativity:G,priority:20},"+":{polymorphic:[[function(t,n){return t.TOK&&!t.PREV_IS_OP&&t.DEDUCED_TYPE===n.T_ARY},{input:[1,"+",1],output:"Fn.ary_merge(<$.0>,<$.1>)",otype:it,fixity:z,associativity:G,priority:25}],[function(t,n){return t.TOK&&!t.PREV_IS_OP&&t.DEDUCED_TYPE===n.T_STR},{input:[1,"+",1],output:"(<$.0>+String(<$.1>))",otype:Q,fixity:z,associativity:G,priority:25}],[function(t,n){return t.TOK&&!t.PREV_IS_OP},{input:[1,"+",1],output:"(<$.0>+<$.1>)",otype:Z,fixity:z,associativity:G,priority:25}],[function(t,n){return!t.TOK||t.PREV_IS_OP},{input:["+",1],output:"<$.0>",otype:Z,fixity:L,associativity:V,priority:4}]]},"-":{polymorphic:[[function(t,n){return t.TOK&&!t.PREV_IS_OP},{input:[1,"-",1],output:"(<$.0>-<$.1>)",otype:Z,fixity:z,associativity:G,priority:25}],[function(t,n){return!t.TOK||t.PREV_IS_OP},{input:["-",1],output:"(-<$.0>)",otype:Z,fixity:L,associativity:V,priority:4}]]},">>":{input:[1,">>",1],output:"(<$.0>\\>\\><$.1>)",otype:Z,fixity:z,associativity:G,priority:30},"<<":{input:[1,"<<",1],output:"(<$.0>\\<\\<<$.1>)",otype:Z,fixity:z,associativity:G,priority:30},">":{input:[1,">",1],output:"(<$.0>\\><$.1>)",otype:nt,fixity:z,associativity:G,priority:35},"<":{input:[1,"<",1],output:"(<$.0>\\<<$.1>)",otype:nt,fixity:z,associativity:G,priority:35},">=":{input:[1,">=",1],output:"(<$.0>\\>=<$.1>)",otype:nt,fixity:z,associativity:G,priority:35},"<=":{input:[1,"<=",1],output:"(<$.0>\\<=<$.1>)",otype:nt,fixity:z,associativity:G,priority:35},"==":{polymorphic:[[function(t,n){return t.DEDUCED_TYPE===n.T_ARY},{input:[1,"==",1],output:"Fn.ary_eq(<$.0>,<$.1>)",otype:nt,fixity:z,associativity:G,priority:40}],[function(t,n){return!0},{input:[1,"==",1],output:"(<$.0>==<$.1>)",otype:nt,fixity:z,associativity:G,priority:40}]]},"!=":{input:[1,"!=",1],output:"(<$.0>!=<$.1>)",otype:nt,fixity:z,associativity:G,priority:40},is:{input:[1,"is",1],output:"(<$.0>===<$.1>)",otype:nt,fixity:z,associativity:G,priority:40},matches:{input:[1,"matches",1],output:"Fn.match(<$.1>,<$.0>)",otype:nt,fixity:z,associativity:Y,priority:40},in:{input:[1,"in",1],output:"Fn.contains(<$.1>,<$.0>)",otype:nt,fixity:z,associativity:Y,priority:40},"&":{input:[1,"&",1],output:"(<$.0>&<$.1>)",otype:Z,fixity:z,associativity:G,priority:45},"|":{input:[1,"|",1],output:"(<$.0>|<$.1>)",otype:Z,fixity:z,associativity:G,priority:46},"&&":{input:[1,"&&",1],output:"(<$.0>&&<$.1>)",otype:nt,fixity:z,associativity:G,priority:47},"||":{input:[1,"||",1],output:"(<$.0>||<$.1>)",otype:nt,fixity:z,associativity:G,priority:48},or:st("||"),and:st("&&"),not:st("!")},functions:{min:{input:"min",output:"Math.min(<$.0>)",otype:Z},max:{input:"max",output:"Math.max(<$.0>)",otype:Z},pow:{input:"pow",output:"Math.pow(<$.0>)",otype:Z},sqrt:{input:"sqrt",output:"Math.sqrt(<$.0>)",otype:Z},len:{input:"len",output:"Fn.len(<$.0>)",otype:Z},int:{input:"int",output:"parseInt(<$.0>)",otype:Z},float:{input:"float",output:"parseFloat(<$.0>)",otype:Z},str:{input:"str",output:"String(<$.0>)",otype:Q},array:{input:"array",output:"Fn.ary(<$.0>)",otype:it},clamp:{input:"clamp",output:"Fn.clamp(<$.0>)",otype:Z},sum:{input:"sum",output:"Fn.sum(<$.0>)",otype:Z},avg:{input:"avg",output:"Fn.avg(<$.0>)",otype:Z},time:{input:"avg",output:"Fn.time()",otype:Z,arity:0},date:{input:"date",output:"Fn.date(<$.0>)",otype:Q}},runtime:{clamp:function(t,n,i){return n>i?t>n?n:ti?i:t0)for(t=0;t0){for(t=0;t