From 56208d404d702acb91257bf44b3b1f0b0577ea06 Mon Sep 17 00:00:00 2001 From: Nikos M Date: Sat, 6 Apr 2019 17:09:36 +0300 Subject: [PATCH] v.1.0.0 (contd) * add typecasting functions: (array, str, int, float) * add more tests --- README.md | 41 ++++++++++++++++-------- src/js/Xpresion.js | 8 +++++ src/js/Xpresion.min.js | 2 +- src/php/Xpresion.php | 18 ++++++++--- src/python/Xpresion.py | 10 ++++-- test/out-js | 40 +++++++++++++++++++++-- test/out-php | 72 +++++++++++++++++++++++++++++++++++++++--- test/out-py | 42 ++++++++++++++++++++++-- test/test.js | 6 ++++ test/test.php | 6 ++++ test/test.py | 6 ++++ 11 files changed, 220 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 5833397..76fd910 100644 --- a/README.md +++ b/README.md @@ -15,20 +15,20 @@ A simple, fast and flexible **eXpression Parser Engine** (with custom functions **see also:** -* [Contemplate](https://github.com/foo123/Contemplate) a light-weight template engine for Node/XPCOM/JS, PHP, Python -* [HtmlWidget](https://github.com/foo123/HtmlWidget) html widgets used as (template) plugins and/or standalone for PHP, Node/XPCOM/JS, Python (can be used as plugins for Contemplate engine as well) +* [Contemplate](https://github.com/foo123/Contemplate) a light-weight template engine for Node.js / Browser / XPCOM Javascript, PHP, Python +* [HtmlWidget](https://github.com/foo123/HtmlWidget) html widgets used as (template) plugins and/or standalone for Node.js / Browser / XPCOM Javascript, PHP, Python (can be used as plugins for Contemplate engine as well) * [Tao](https://github.com/foo123/Tao.js) A simple, tiny, isomorphic, precise and fast template engine for handling both string and live dom based templates * [ModelView](https://github.com/foo123/modelview.js) a light-weight and flexible MVVM framework for JavaScript/HTML5 * [ModelView MVC jQueryUI Widgets](https://github.com/foo123/modelview-widgets) plug-n-play, state-full, full-MVC widgets for jQueryUI using modelview.js (e.g calendars, datepickers, colorpickers, tables/grids, etc..) (in progress) -* [Dromeo](https://github.com/foo123/Dromeo) a flexible, agnostic router for Node/XPCOM/JS, PHP, Python -* [PublishSubscribe](https://github.com/foo123/PublishSubscribe) a simple and flexible publish-subscribe pattern implementation for Node/XPCOM/JS, PHP, Python -* [Regex Analyzer/Composer](https://github.com/foo123/RegexAnalyzer) Regular Expression Analyzer and Composer for Node/XPCOM/JS, PHP, Python -* [StringTemplate](https://github.com/foo123/StringTemplate) simple and flexible string templates for PHP, Python, Node/XPCOM/JS -* [GrammarTemplate](https://github.com/foo123/GrammarTemplate) versatile and intuitive grammar-based templating for PHP, Python, Node/XPCOM/JS -* [Dialect](https://github.com/foo123/Dialect) a simple cross-platform SQL construction for PHP, Python, Node/XPCOM/JS -* [Abacus](https://github.com/foo123/Abacus) a fast combinatorics and computation library for Node/XPCOM/JS, PHP, Python +* [Dromeo](https://github.com/foo123/Dromeo) a flexible, agnostic router for Node.js / Browser / XPCOM Javascript, PHP, Python +* [PublishSubscribe](https://github.com/foo123/PublishSubscribe) a simple and flexible publish-subscribe pattern implementation for Node.js / Browser / XPCOM Javascript, PHP, Python +* [Regex Analyzer/Composer](https://github.com/foo123/RegexAnalyzer) Regular Expression Analyzer and Composer for Node.js / Browser / XPCOM Javascript, PHP, Python +* [StringTemplate](https://github.com/foo123/StringTemplate) simple and flexible string templates for Node.js / Browser / XPCOM Javascript, PHP, Python +* [GrammarTemplate](https://github.com/foo123/GrammarTemplate) versatile and intuitive grammar-based templating for Node.js / Browser / XPCOM Javascript, PHP, Python +* [Dialect](https://github.com/foo123/Dialect) a simple cross-platform SQL construction for Node.js / Browser / XPCOM Javascript, PHP, Python +* [Abacus](https://github.com/foo123/Abacus) a fast combinatorics and computation library for Node.js / Browser / XPCOM Javascript, PHP, Python * [Simulacra](https://github.com/foo123/Simulacra) a simulation, algebraic, probability and combinatorics PHP package for scientific computations -* [RT](https://github.com/foo123/RT) client-side real-time communication for Node/XPCOM/JS with support for Poll/BOSH/WebSockets +* [RT](https://github.com/foo123/RT) client-side real-time communication for Node.js / Browser / XPCOM Javascript with support for Poll / BOSH / WebSockets * [Asynchronous](https://github.com/foo123/asynchronous.js) a simple manager for async, linearised, parallelised, interleaved and sequential tasks for JavaScript @@ -62,7 +62,7 @@ Configuration is intutive, easy and flexible (see examples). However, since `Xpresion` is a parser engine, adding a default configuration, it can itself be a parser as well (out-of-the-box). -**NOTE:** `Xpresion` (v.1.0.0+) uses [GrammarTemplates](https://github.com/foo123/GrammarTemplate) for operator output. This is more flexible than simply using [StringTemplates](https://github.com/foo123/StringTemplate) as previously, since it supports blocks of optional code, default values, optional placeholders and many other things. Only make sure to escape (with `\` character) all `"<"`,`">"`,`"["`,`"]"` literal characters inside the output you define for operators and functions (see default configuration example below) +**NOTE:** `Xpresion` (v.1.0.0+) uses [Grammar Templates](https://github.com/foo123/GrammarTemplate) for operator output. This is more flexible than simply using [String Templates](https://github.com/foo123/StringTemplate) as previously, since it supports blocks of optional code, default values, optional placeholders and many other things. Only make sure to escape (with `\` character) all `"<"`,`">"`,`"["`,`"]"` literal characters inside the output you define for operators and functions (see default configuration example below) **Features:** @@ -898,11 +898,21 @@ Xpresion.defaultConfiguration(Configuration({ ,'output' : 'parseInt(<$.0>)' ,'otype' : T_NUM } +,'float' : { + 'input' : 'float' + ,'output' : 'parseFloat(<$.0>)' + ,'otype' : T_NUM + } ,'str' : { 'input' : 'str' ,'output' : 'String(<$.0>)' ,'otype' : T_STR } +,'array' : { + 'input' : 'array' + ,'output' : 'Fn.ary(<$.0>)' + ,'otype' : T_ARY + } ,'clamp' : { 'input' : 'clamp' ,'output' : 'Fn.clamp(<$.0>)' @@ -965,6 +975,9 @@ Xpresion.defaultConfiguration(Configuration({ if ( l > 0 ) { for(i=0; i)' ,'otype' : T_STR } + ,'array' : { + 'input' : 'array' + ,'output' : 'Fn.ary(<$.0>)' + ,'otype' : T_ARY + } ,'clamp' : { 'input' : 'clamp' ,'output' : 'Fn.clamp(<$.0>)' @@ -2825,6 +2830,9 @@ Xpresion.init = function( ) { if ( l > 0 ) { for(i=0; in.start)for(h=n.start,d=-1===n.end?v-1:Math.min(n.end,v-1),g=h;g<=d;g++)m+=c(t,n.tpl,e,i,g,o,a);else y||n.start!==n.end||(m=c(t,n.tpl,e,i,null,o,a));return m}function f(t,e,i,r,a,s,f){var c,h,d,g,v="";return e.stpl&&(n(i,e.stpl)||n(y.subGlobal,e.stpl)||n(r,e.stpl)||n(r,"*")||n(y.fnGlobal,e.stpl)||n(y.fnGlobal,"*"))?(c=u(t,e.key,[String(e.name)],e.loc?null:f),n(i,e.stpl)||n(y.subGlobal,e.stpl)?(null==a||0===a&&e.start===e.end&&e.opt||!l(c)||(c=a0?new Array(l+1).join(e||" ")+i:i}function m(){return j((new Date).getTime()/1e3)}function b(t,n){if(!arguments.length)return"";var e,i,l,r,o,u,a=G,s={},p=(o=n instanceof Date?new Date(n):"number"==typeof n?new Date(1e3*n):new Date).getTimezoneOffset(),f=Y(p),c=o.getMonth();for(s.G=o.getHours(),s.j=o.getDate(),u=s.j%10,s.n=c+1,s.Y=o.getFullYear(),s.w=o.getDay(),s.N=s.w||7,s.d=_(s.j,2,"0"),s.D=a.day_short[s.w],s.l=a.day[s.w],s.S=a.ordinal.ord[s.j]?a.ordinal.ord[s.j]:a.ordinal.ord[u]?a.ordinal.ord[u]:a.ordinal.nth,s.z=I((new Date(s.Y,c,s.j)-new Date(s.Y,0,1))/864e5),s.W=_(1+I((new Date(s.Y,c,s.j-s.N+3)-new Date(s.Y,0,4))/864e5/7),2,"0"),s.F=a.month[c],s.m=_(s.n,2,"0"),s.M=a.month_short[c],s.t=new Date(s.Y,c+1,0).getDate(),s.L=s.Y%4==0&s.Y%100!=0|s.Y%400==0,s.o=s.Y+(11===c&&s.W<9?1:0===c&&s.W>9?-1:0),s.y=s.Y.toString().slice(-2),s.a=s.G>11?a.meridian.pm:a.meridian.am,s.A=s.G>11?a.meridian.PM:a.meridian.AM,s.B=_(j((3600*o.getUTCHours()+60*o.getUTCMinutes()+o.getUTCSeconds()+3600)/86.4)%1e3,3,"0"),s.g=s.G%12||12,s.h=_(s.g,2,"0"),s.H=_(s.G,2,"0"),s.i=_(o.getMinutes(),2,"0"),s.s=_(o.getSeconds(),2,"0"),s.u=_(1e3*o.getMilliseconds(),6,"0"),s.e="",s.I=new Date(s.Y,0)-Date.UTC(s.Y,0)!=new Date(s.Y,6)-Date.UTC(s.Y,6)?1:0,s.O=(p>0?"-":"+")+_(100*j(f/60)+f%60,4,"0"),s.P=s.O.substr(0,3)+":"+s.O.substr(3,2),s.T="UTC",s.Z=60*-p,s.U=o/1e3|0,s.c=[s.Y,"-",s.m,"-",s.d,"\\",s.T,s.H,":",s.i,":",s.s,s.P].join(""),s.r=[s.D,", ",s.d," ",s.M," ",s.Y," ",s.H,":",s.i,":",s.s," ",s.O].join(""),e="",l=0,r=t.length;l","[","]"],y.fnGlobal={},y.subGlobal={},y.guid=i,y.multisplit=function(t,e,l){var o,u,p,f,c,y,h,d,g,v,_,m,b,S,T,E,O,$,x,R,w,D,P,N,F,A,C=e[0],M=e[1],k=e[2],j=e[3],I=C.length,Y=M.length,U=k.length,G=j.length,z="#"+j,K=null,B=0,X=0,q=0,J=0,H=t.length,W=[C,I,M,Y],Z=[k,U,j,G],Q=[null,0,null,0,null,0,null,0];for(l=!0===l,x={type:1,name:null,key:null,stpl:null,dval:null,opt:0,neg:0,algn:0,loc:0,start:0,end:0},w=g=new s({type:0,val:"",algn:""}),D=null,R=null,T={},O=null,E={},$=null,W[1]u&&4>p;)W[u+1]u;)Q[m]=W[u],Q[m+1]=W[u+1],u+=2,m+=2;for(;4>p;)Q[m]=Z[p],Q[m+1]=Z[p+1],p+=2,m+=2;for(h=null,_="",m=0;m1?(u=(u=L(_[0])).length?0|+u:0,p=(p=L(_[1])).length?0|+p:-1,X=1):(p=u=(u=L(_[0])).length?0|+u:0,X=0),_="",B=0}else X=0,B=0,u=0,p=0;if(B&&null===K&&(K=""),"@"===(d=c[V](0))?(q=1,c=c.slice(1)):q=0,"."===(d=c[V](0))?(J=1,c=c.slice(1)):J=0,f=-1a.length&&l.arity_min<=l.arity&&(r=l.arity_min),o=n(l,r?a.splice(a.length-r,r):[]),a.push(o),e&&i.dispose());return u=null,a[0]},O.reduce=function(t,n,e,i,l,r){var o,u,a,s,p,f,c,y=null,h=0;if(i)if(s=i,ct===s.type&&(s=s.morph([l,t,n])),ft===s.type){if(!1===(f=s.validate(l,n,t))[0])return r.err=!0,r.msg=f[1],!1;(a=s.node(null,l,n,t)).arity=f[0],e.unshift(a),n.unshift(a)}else{if(e.length&&(h=(y=e[0]).op_index),y&&y.op_next(s,l,n,t)){for(;n.length>h;)c=(u=(o=n.shift()).node).arity,pt&u.type&&0===c?c=1:c>t.length&&u.arity_min<=u.arity&&(c=u.arity_min),a=u.node(c?t.splice(t.length-c,c):[],o.pos),t.push(a);if(!y.op_complete())return;e.shift(),n.shift(),s=y.node,y.dispose(),h=e.length?e[0].op_index:0}else if(!1===(f=s.validate(l,n,t))[0])return r.err=!0,r.msg=f[1],!1;if(p=s.fixity,Z===p)(c=s.arity)>t.length&&s.arity_min<=t.length&&(c=s.arity_min),a=s.node(c?t.splice(t.length-c,c):[],l),t.push(a);else if(H===p)n.unshift(x(s.otype,s.arity,s,null,l)),pt&s.type&&0===s.arity&&t.push(P.node(null,l+1));else{for(;n.length>h;){if(o=n.shift(),!((u=o.node).priorityt.length&&u.arity_min<=u.arity&&(c=u.arity_min),a=u.node(c?t.splice(t.length-c,c):[],o.pos),t.push(a)}n.unshift(x(s.otype,s.arity,s,null,l))}}else for(;n.length;)c=(u=(o=n.shift()).node).arity,pt&u.type&&0===c?c=1:c>t.length&&u.arity_min<=u.arity&&(c=u.arity_min),a=u.node(c?t.splice(t.length-c,c):[],o.pos),t.push(a)},O.parse_delimited_block=function(t,n,e,i,l){5>arguments.length&&(l=!0);var r=i,o=!1,u="";for(l=!1!==l,n+=1;n=3||!r&&!o&&!u)&&(p=!1);return l},O.parse=function(t,n){var e,i,l,r,o,u,a,s,p,f,c,y,h,d,g,v,_=O.reduce,m=$.get_entry,b=!F.call(n.RE,"t_var"),S=0,T={err:!1,msg:""};for(i=(e=String(t.source)).length,u=0,t._cnt=0,t._symbol_table={},t._cache={},t.variables={},p=[],f=[],c=[],y=0,S=0;u0&&!1===(s=t.t_op(n,o));)o=o.slice(0,-1);if(!1!==s){if(y+=1,_(p,f,c,s,y,T),T.err){S=1,v=T.msg;break}u+=o.length;continue}}if(b||!(a=l.match(n.RE.t_var))||!1===(s=t.t_var(n,a[1]))){if(a=l.match(n.RE.t_nonspc)){if(!1!==(s=t.t_liter(n,a[1],lt))){y+=1,p.push(s.node(null,y)),u+=a[0].length;continue}if(!1!==(s=t.t_op(n,a[1]))){if(y+=1,_(p,f,c,s,y,T),T.err){S=1,v=T.msg;break}u+=a[0].length;continue}S=1,v='Unknown token "'+a[0]+'"';break}}else y+=1,p.push(s.node(null,y)),u+=a[0].length}if(S||(_(p,f,c),(1!==p.length||f.length>0)&&(S=1,v="Parse Error, Mismatched Parentheses or Operators")),!S)try{d=t.compile(p[0],n)}catch(l){S=1,v="Compilation Error, "+l.toString()}if(c=null,f=null,p=null,t._symbol_table=null,S)throw d=null,t.variables=[],t._cnt=0,t._cache={},t.evaluatorString="",t.evaluator=t.dummy_evaluator,new Error("Xpresion Error: "+v+' at "'+e+'"');return t.variables=M(t.variables),t.evaluatorString=d[0],t.evaluator=d[1],t},O.render=function(t,n){return t.render(n)},O.GET=function(t,n){if(!n||!n.length)return t;for(var e,i=0,l=n.length,r=t;i1?ft:pt,[e,o,r,u,U(0,a),s]},w.match_args=function(t,n,e,i){for(var l,r=i.length-1,o=0,u=Y(t);(o=0)&&(l=r>=0?i[r].pos:-10,n===l);)o++,n--,r--;return o>=u?u:t<=0&&0},w[N]=k(R[N]),w[N].otype=null,w[N].ofixity=null,w[N].opdef=null,w[N].parts=null,w[N].morphes=null,w[N].dispose=function(){var t=this;return t.otype=null,t.ofixity=null,t.opdef=null,t.parts=null,t.morphes=null,R[N].dispose.call(t),t},w[N].Polymorphic=function(t){var n=this;return n.type=ct,n.morphes=(t||[]).map(w.Condition),n},w[N].morph=function(t){var n,e,i=this.morphes,l=i.length,r=0,o=i[0][1],u=!1;for(t.length<7&&(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]),t.push(t[4]?t[4].type:t[3]?t[3].type:0)),e={POS:t[0],TOKS:t[1],OPS:t[2],TOK:t[3],OP:t[4],PREV_IS_OP:t[5],DEDUCED_TYPE:t[6]};r=o.priority&&(o=n[1])}for(u||(n=o);ct===n.type;)n=n.morph(t);return n},w[N].render=function(t){t&&t.length||(t=["",""]);var n,e=this,i=e.otype,l=e.output,r=e.parenthesize,o=r?O.LPAREN:"",u=r?O.RPAREN:"",a=O.COMMA,s=e.ofixity;t.length;return n=l instanceof y?o+l.render({$:t})+u:W===s?o+t.join(l)+u:Z===s?o+t.join(a)+u+l:l+o+t.join(a)+u,R(i,n,n)},w[N].validate=function(t,n,e){var i=this,l=i.opdef,r="",o=0;return 0===l[0][0]&&!1===(o=w.match_args(l[0][2],t-1,n,e))&&(r='Operator "'+i.input+'" expecting '+l[0][2]+" prior argument(s)"),[o,r]},w[N].node=function(t,n,e,i){t=t||[],n=n||0;var l,r=this,o=r.otype;return r.revert&&t.reverse(),Q===o&&t.length?o=t[0].type:t.length&&(t[0].type=o),l=new x(o,r.arity,r,t,n),ft===r.type&&arguments.length>2&&(l.op_parts=r.parts.slice(1),l.op_def=r.opdef.slice(0===r.opdef[0][0]?2:1),l.op_index=arguments[2].length+1),l},O.Func=D,D[N]=k(w[N]),O[N]={constructor:O,source:null,variables:null,evaluatorString:null,evaluator:null,_cnt:0,_cache:null,_symbol_table:null,dummy_evaluator:null,dispose:function(){var t=this;return t.dummy_evaluator=null,t.source=null,t.variables=null,t.evaluatorString=null,t.evaluator=null,t._cnt=null,t._symbol_table=null,t._cache=null,t},compile:function(t,n){n||(n=O.defaultConfiguration());var e=x.DFT(t,O.render,!0);return[e,T(e,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=this,e=["Expression: "+n.source,"Variables : ["+n.variables.join(",")+"]","Evaluator : "+n.evaluatorString];return arguments.length&&(e.push("Data : "+C(t,null,4)),e.push("Result : "+C(n.evaluate(t)))),e.join("\n")},toString:function(){return"[Xpresion source]: "+String(this.source)},t_liter:function(t,n,e){return rt===e?R(rt,n,n):$.get_entry(t.RESERVED,n.toLowerCase())},t_block:function(t,n,e,i){if(i=i||"",ot===e)return R(ot,n,n);if(ut===e){var l,r,o="re_"+n+i;return F.call(this._symbol_table,o)?l=this._symbol_table[o]:(l="re_"+ ++this._cnt,r=n.slice(1,-1),this._cache[l]=d(r,i),this._symbol_table[o]=l),R(ut,n,"Cache."+l)}return!1},t_var:function(t,n){var e,i=n.split("."),l=i[0];return F.call(this.variables,l)||(this.variables[l]=l),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:ot,parse:O.parse_delimited_block},'"':$("'"),"`":{type:ut,parse:O.parse_delimited_block,rest:O.parse_re_flags}},reserved:{null:R(et,"null","null"),false:R(at,"false","false"),true:R(at,"true","true"),infinity:R(rt,"Infinity","Infinity"),nan:R(rt,"NaN","NaN"),none:$("null"),inf:$("infinity")},operators:{"(":{input:["(",-1,")"],output:"<$.0>",otype:Q,fixity:Z,associativity:J,priority:0},")":{input:[-1,")"]},"[":{input:["[",-1,"]"],output:"\\[<$.0>\\]",otype:st,fixity:Z,associativity:J,priority:2},"]":{input:[-1,"]"]},",":{input:[1,",",1],output:"<$.0>,<$.1>",otype:nt,fixity:W,associativity:q,priority:3},"?":{input:[1,"?",1,":",1],output:"(<$.0>?<$.1>:<$.2>)",otype:tt,fixity:W,associativity:J,priority:100},":":{input:[1,":",1]},"!":{input:["!",1],output:"!<$.0>",otype:at,fixity:H,associativity:J,priority:10},"~":{input:["~",1],output:"~<$.0>",otype:rt,fixity:H,associativity:J,priority:10},"^":{input:[1,"^",1],output:"Math.pow(<$.0>,<$.1>)",otype:rt,fixity:W,associativity:J,priority:11},"*":{input:[1,"*",1],output:"(<$.0>*<$.1>)",otype:rt,fixity:W,associativity:q,priority:20},"/":{input:[1,"/",1],output:"(<$.0>/<$.1>)",otype:rt,fixity:W,associativity:q,priority:20},"%":{input:[1,"%",1],output:"(<$.0>%<$.1>)",otype:rt,fixity:W,associativity:q,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:st,fixity:W,associativity:q,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:ot,fixity:W,associativity:q,priority:25}],[function(t,n){return t.TOK&&!t.PREV_IS_OP},{input:[1,"+",1],output:"(<$.0>+<$.1>)",otype:rt,fixity:W,associativity:q,priority:25}],[function(t,n){return!t.TOK||t.PREV_IS_OP},{input:["+",1],output:"<$.0>",otype:rt,fixity:H,associativity:J,priority:4}]]},"-":{polymorphic:[[function(t,n){return t.TOK&&!t.PREV_IS_OP},{input:[1,"-",1],output:"(<$.0>-<$.1>)",otype:rt,fixity:W,associativity:q,priority:25}],[function(t,n){return!t.TOK||t.PREV_IS_OP},{input:["-",1],output:"(-<$.0>)",otype:rt,fixity:H,associativity:J,priority:4}]]},">>":{input:[1,">>",1],output:"(<$.0>\\>\\><$.1>)",otype:rt,fixity:W,associativity:q,priority:30},"<<":{input:[1,"<<",1],output:"(<$.0>\\<\\<<$.1>)",otype:rt,fixity:W,associativity:q,priority:30},">":{input:[1,">",1],output:"(<$.0>\\><$.1>)",otype:at,fixity:W,associativity:q,priority:35},"<":{input:[1,"<",1],output:"(<$.0>\\<<$.1>)",otype:at,fixity:W,associativity:q,priority:35},">=":{input:[1,">=",1],output:"(<$.0>\\>=<$.1>)",otype:at,fixity:W,associativity:q,priority:35},"<=":{input:[1,"<=",1],output:"(<$.0>\\<=<$.1>)",otype:at,fixity:W,associativity:q,priority:35},"==":{polymorphic:[[function(t,n){return t.DEDUCED_TYPE===n.T_ARY},{input:[1,"==",1],output:"Fn.ary_eq(<$.0>,<$.1>)",otype:at,fixity:W,associativity:q,priority:40}],[function(t,n){return!0},{input:[1,"==",1],output:"(<$.0>==<$.1>)",otype:at,fixity:W,associativity:q,priority:40}]]},"!=":{input:[1,"!=",1],output:"(<$.0>!=<$.1>)",otype:at,fixity:W,associativity:q,priority:40},is:{input:[1,"is",1],output:"(<$.0>===<$.1>)",otype:at,fixity:W,associativity:q,priority:40},matches:{input:[1,"matches",1],output:"Fn.match(<$.1>,<$.0>)",otype:at,fixity:W,associativity:B,priority:40},in:{input:[1,"in",1],output:"Fn.contains(<$.1>,<$.0>)",otype:at,fixity:W,associativity:B,priority:40},"&":{input:[1,"&",1],output:"(<$.0>&<$.1>)",otype:rt,fixity:W,associativity:q,priority:45},"|":{input:[1,"|",1],output:"(<$.0>|<$.1>)",otype:rt,fixity:W,associativity:q,priority:46},"&&":{input:[1,"&&",1],output:"(<$.0>&&<$.1>)",otype:at,fixity:W,associativity:q,priority:47},"||":{input:[1,"||",1],output:"(<$.0>||<$.1>)",otype:at,fixity:W,associativity:q,priority:48},or:$("||"),and:$("&&"),not:$("!")},functions:{min:{input:"min",output:"Math.min(<$.0>)",otype:rt},max:{input:"max",output:"Math.max(<$.0>)",otype:rt},pow:{input:"pow",output:"Math.pow(<$.0>)",otype:rt},sqrt:{input:"sqrt",output:"Math.sqrt(<$.0>)",otype:rt},len:{input:"len",output:"Fn.len(<$.0>)",otype:rt},int:{input:"int",output:"parseInt(<$.0>)",otype:rt},float:{input:"float",output:"parseFloat(<$.0>)",otype:rt},str:{input:"str",output:"String(<$.0>)",otype:ot},clamp:{input:"clamp",output:"Fn.clamp(<$.0>)",otype:rt},sum:{input:"sum",output:"Fn.sum(<$.0>)",otype:rt},avg:{input:"avg",output:"Fn.avg(<$.0>)",otype:rt},time:{input:"avg",output:"Fn.time()",otype:rt,arity:0},date:{input:"date",output:"Fn.date(<$.0>)",otype:ot}},runtime:{clamp:function(t,n,e){return n>e?t>n?n:te?e:t0)for(t=0;t0){for(t=0;tn.start)for(h=n.start,d=-1===n.end?v-1:Math.min(n.end,v-1),g=h;g<=d;g++)m+=c(t,n.tpl,e,i,g,o,a);else y||n.start!==n.end||(m=c(t,n.tpl,e,i,null,o,a));return m}function f(t,e,i,r,a,s,f){var c,h,d,g,v="";return e.stpl&&(n(i,e.stpl)||n(y.subGlobal,e.stpl)||n(r,e.stpl)||n(r,"*")||n(y.fnGlobal,e.stpl)||n(y.fnGlobal,"*"))?(c=u(t,e.key,[String(e.name)],e.loc?null:f),n(i,e.stpl)||n(y.subGlobal,e.stpl)?(null==a||0===a&&e.start===e.end&&e.opt||!l(c)||(c=a0?new Array(l+1).join(e||" ")+i:i}function m(){return j((new Date).getTime()/1e3)}function b(t,n){if(!arguments.length)return"";var e,i,l,r,o,u,a=G,s={},p=(o=n instanceof Date?new Date(n):"number"==typeof n?new Date(1e3*n):new Date).getTimezoneOffset(),f=Y(p),c=o.getMonth();for(s.G=o.getHours(),s.j=o.getDate(),u=s.j%10,s.n=c+1,s.Y=o.getFullYear(),s.w=o.getDay(),s.N=s.w||7,s.d=_(s.j,2,"0"),s.D=a.day_short[s.w],s.l=a.day[s.w],s.S=a.ordinal.ord[s.j]?a.ordinal.ord[s.j]:a.ordinal.ord[u]?a.ordinal.ord[u]:a.ordinal.nth,s.z=I((new Date(s.Y,c,s.j)-new Date(s.Y,0,1))/864e5),s.W=_(1+I((new Date(s.Y,c,s.j-s.N+3)-new Date(s.Y,0,4))/864e5/7),2,"0"),s.F=a.month[c],s.m=_(s.n,2,"0"),s.M=a.month_short[c],s.t=new Date(s.Y,c+1,0).getDate(),s.L=s.Y%4==0&s.Y%100!=0|s.Y%400==0,s.o=s.Y+(11===c&&s.W<9?1:0===c&&s.W>9?-1:0),s.y=s.Y.toString().slice(-2),s.a=s.G>11?a.meridian.pm:a.meridian.am,s.A=s.G>11?a.meridian.PM:a.meridian.AM,s.B=_(j((3600*o.getUTCHours()+60*o.getUTCMinutes()+o.getUTCSeconds()+3600)/86.4)%1e3,3,"0"),s.g=s.G%12||12,s.h=_(s.g,2,"0"),s.H=_(s.G,2,"0"),s.i=_(o.getMinutes(),2,"0"),s.s=_(o.getSeconds(),2,"0"),s.u=_(1e3*o.getMilliseconds(),6,"0"),s.e="",s.I=new Date(s.Y,0)-Date.UTC(s.Y,0)!=new Date(s.Y,6)-Date.UTC(s.Y,6)?1:0,s.O=(p>0?"-":"+")+_(100*j(f/60)+f%60,4,"0"),s.P=s.O.substr(0,3)+":"+s.O.substr(3,2),s.T="UTC",s.Z=60*-p,s.U=o/1e3|0,s.c=[s.Y,"-",s.m,"-",s.d,"\\",s.T,s.H,":",s.i,":",s.s,s.P].join(""),s.r=[s.D,", ",s.d," ",s.M," ",s.Y," ",s.H,":",s.i,":",s.s," ",s.O].join(""),e="",l=0,r=t.length;l","[","]"],y.fnGlobal={},y.subGlobal={},y.guid=i,y.multisplit=function(t,e,l){var o,u,p,f,c,y,h,d,g,v,_,m,b,S,T,E,O,$,x,R,w,D,P,N,F,A,C=e[0],M=e[1],k=e[2],j=e[3],I=C.length,Y=M.length,U=k.length,G=j.length,z="#"+j,K=null,B=0,X=0,q=0,J=0,H=t.length,W=[C,I,M,Y],Z=[k,U,j,G],Q=[null,0,null,0,null,0,null,0];for(l=!0===l,x={type:1,name:null,key:null,stpl:null,dval:null,opt:0,neg:0,algn:0,loc:0,start:0,end:0},w=g=new s({type:0,val:"",algn:""}),D=null,R=null,T={},O=null,E={},$=null,W[1]u&&4>p;)W[u+1]u;)Q[m]=W[u],Q[m+1]=W[u+1],u+=2,m+=2;for(;4>p;)Q[m]=Z[p],Q[m+1]=Z[p+1],p+=2,m+=2;for(h=null,_="",m=0;m1?(u=(u=L(_[0])).length?0|+u:0,p=(p=L(_[1])).length?0|+p:-1,X=1):(p=u=(u=L(_[0])).length?0|+u:0,X=0),_="",B=0}else X=0,B=0,u=0,p=0;if(B&&null===K&&(K=""),"@"===(d=c[V](0))?(q=1,c=c.slice(1)):q=0,"."===(d=c[V](0))?(J=1,c=c.slice(1)):J=0,f=-1a.length&&l.arity_min<=l.arity&&(r=l.arity_min),o=n(l,r?a.splice(a.length-r,r):[]),a.push(o),e&&i.dispose());return u=null,a[0]},O.reduce=function(t,n,e,i,l,r){var o,u,a,s,p,f,c,y=null,h=0;if(i)if(s=i,ct===s.type&&(s=s.morph([l,t,n])),ft===s.type){if(!1===(f=s.validate(l,n,t))[0])return r.err=!0,r.msg=f[1],!1;(a=s.node(null,l,n,t)).arity=f[0],e.unshift(a),n.unshift(a)}else{if(e.length&&(h=(y=e[0]).op_index),y&&y.op_next(s,l,n,t)){for(;n.length>h;)c=(u=(o=n.shift()).node).arity,pt&u.type&&0===c?c=1:c>t.length&&u.arity_min<=u.arity&&(c=u.arity_min),a=u.node(c?t.splice(t.length-c,c):[],o.pos),t.push(a);if(!y.op_complete())return;e.shift(),n.shift(),s=y.node,y.dispose(),h=e.length?e[0].op_index:0}else if(!1===(f=s.validate(l,n,t))[0])return r.err=!0,r.msg=f[1],!1;if(p=s.fixity,Z===p)(c=s.arity)>t.length&&s.arity_min<=t.length&&(c=s.arity_min),a=s.node(c?t.splice(t.length-c,c):[],l),t.push(a);else if(H===p)n.unshift(x(s.otype,s.arity,s,null,l)),pt&s.type&&0===s.arity&&t.push(P.node(null,l+1));else{for(;n.length>h;){if(o=n.shift(),!((u=o.node).priorityt.length&&u.arity_min<=u.arity&&(c=u.arity_min),a=u.node(c?t.splice(t.length-c,c):[],o.pos),t.push(a)}n.unshift(x(s.otype,s.arity,s,null,l))}}else for(;n.length;)c=(u=(o=n.shift()).node).arity,pt&u.type&&0===c?c=1:c>t.length&&u.arity_min<=u.arity&&(c=u.arity_min),a=u.node(c?t.splice(t.length-c,c):[],o.pos),t.push(a)},O.parse_delimited_block=function(t,n,e,i,l){5>arguments.length&&(l=!0);var r=i,o=!1,u="";for(l=!1!==l,n+=1;n=3||!r&&!o&&!u)&&(p=!1);return l},O.parse=function(t,n){var e,i,l,r,o,u,a,s,p,f,c,y,h,d,g,v,_=O.reduce,m=$.get_entry,b=!F.call(n.RE,"t_var"),S=0,T={err:!1,msg:""};for(i=(e=String(t.source)).length,u=0,t._cnt=0,t._symbol_table={},t._cache={},t.variables={},p=[],f=[],c=[],y=0,S=0;u0&&!1===(s=t.t_op(n,o));)o=o.slice(0,-1);if(!1!==s){if(y+=1,_(p,f,c,s,y,T),T.err){S=1,v=T.msg;break}u+=o.length;continue}}if(b||!(a=l.match(n.RE.t_var))||!1===(s=t.t_var(n,a[1]))){if(a=l.match(n.RE.t_nonspc)){if(!1!==(s=t.t_liter(n,a[1],lt))){y+=1,p.push(s.node(null,y)),u+=a[0].length;continue}if(!1!==(s=t.t_op(n,a[1]))){if(y+=1,_(p,f,c,s,y,T),T.err){S=1,v=T.msg;break}u+=a[0].length;continue}S=1,v='Unknown token "'+a[0]+'"';break}}else y+=1,p.push(s.node(null,y)),u+=a[0].length}if(S||(_(p,f,c),(1!==p.length||f.length>0)&&(S=1,v="Parse Error, Mismatched Parentheses or Operators")),!S)try{d=t.compile(p[0],n)}catch(l){S=1,v="Compilation Error, "+l.toString()}if(c=null,f=null,p=null,t._symbol_table=null,S)throw d=null,t.variables=[],t._cnt=0,t._cache={},t.evaluatorString="",t.evaluator=t.dummy_evaluator,new Error("Xpresion Error: "+v+' at "'+e+'"');return t.variables=M(t.variables),t.evaluatorString=d[0],t.evaluator=d[1],t},O.render=function(t,n){return t.render(n)},O.GET=function(t,n){if(!n||!n.length)return t;for(var e,i=0,l=n.length,r=t;i1?ft:pt,[e,o,r,u,U(0,a),s]},w.match_args=function(t,n,e,i){for(var l,r=i.length-1,o=0,u=Y(t);(o=0)&&(l=r>=0?i[r].pos:-10,n===l);)o++,n--,r--;return o>=u?u:t<=0&&0},w[N]=k(R[N]),w[N].otype=null,w[N].ofixity=null,w[N].opdef=null,w[N].parts=null,w[N].morphes=null,w[N].dispose=function(){var t=this;return t.otype=null,t.ofixity=null,t.opdef=null,t.parts=null,t.morphes=null,R[N].dispose.call(t),t},w[N].Polymorphic=function(t){var n=this;return n.type=ct,n.morphes=(t||[]).map(w.Condition),n},w[N].morph=function(t){var n,e,i=this.morphes,l=i.length,r=0,o=i[0][1],u=!1;for(t.length<7&&(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]),t.push(t[4]?t[4].type:t[3]?t[3].type:0)),e={POS:t[0],TOKS:t[1],OPS:t[2],TOK:t[3],OP:t[4],PREV_IS_OP:t[5],DEDUCED_TYPE:t[6]};r=o.priority&&(o=n[1])}for(u||(n=o);ct===n.type;)n=n.morph(t);return n},w[N].render=function(t){t&&t.length||(t=["",""]);var n,e=this,i=e.otype,l=e.output,r=e.parenthesize,o=r?O.LPAREN:"",u=r?O.RPAREN:"",a=O.COMMA,s=e.ofixity;t.length;return n=l instanceof y?o+l.render({$:t})+u:W===s?o+t.join(l)+u:Z===s?o+t.join(a)+u+l:l+o+t.join(a)+u,R(i,n,n)},w[N].validate=function(t,n,e){var i=this,l=i.opdef,r="",o=0;return 0===l[0][0]&&!1===(o=w.match_args(l[0][2],t-1,n,e))&&(r='Operator "'+i.input+'" expecting '+l[0][2]+" prior argument(s)"),[o,r]},w[N].node=function(t,n,e,i){t=t||[],n=n||0;var l,r=this,o=r.otype;return r.revert&&t.reverse(),Q===o&&t.length?o=t[0].type:t.length&&(t[0].type=o),l=new x(o,r.arity,r,t,n),ft===r.type&&arguments.length>2&&(l.op_parts=r.parts.slice(1),l.op_def=r.opdef.slice(0===r.opdef[0][0]?2:1),l.op_index=arguments[2].length+1),l},O.Func=D,D[N]=k(w[N]),O[N]={constructor:O,source:null,variables:null,evaluatorString:null,evaluator:null,_cnt:0,_cache:null,_symbol_table:null,dummy_evaluator:null,dispose:function(){var t=this;return t.dummy_evaluator=null,t.source=null,t.variables=null,t.evaluatorString=null,t.evaluator=null,t._cnt=null,t._symbol_table=null,t._cache=null,t},compile:function(t,n){n||(n=O.defaultConfiguration());var e=x.DFT(t,O.render,!0);return[e,T(e,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=this,e=["Expression: "+n.source,"Variables : ["+n.variables.join(",")+"]","Evaluator : "+n.evaluatorString];return arguments.length&&(e.push("Data : "+C(t,null,4)),e.push("Result : "+C(n.evaluate(t)))),e.join("\n")},toString:function(){return"[Xpresion source]: "+String(this.source)},t_liter:function(t,n,e){return rt===e?R(rt,n,n):$.get_entry(t.RESERVED,n.toLowerCase())},t_block:function(t,n,e,i){if(i=i||"",ot===e)return R(ot,n,n);if(ut===e){var l,r,o="re_"+n+i;return F.call(this._symbol_table,o)?l=this._symbol_table[o]:(l="re_"+ ++this._cnt,r=n.slice(1,-1),this._cache[l]=d(r,i),this._symbol_table[o]=l),R(ut,n,"Cache."+l)}return!1},t_var:function(t,n){var e,i=n.split("."),l=i[0];return F.call(this.variables,l)||(this.variables[l]=l),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:ot,parse:O.parse_delimited_block},'"':$("'"),"`":{type:ut,parse:O.parse_delimited_block,rest:O.parse_re_flags}},reserved:{null:R(et,"null","null"),false:R(at,"false","false"),true:R(at,"true","true"),infinity:R(rt,"Infinity","Infinity"),nan:R(rt,"NaN","NaN"),none:$("null"),inf:$("infinity")},operators:{"(":{input:["(",-1,")"],output:"<$.0>",otype:Q,fixity:Z,associativity:J,priority:0},")":{input:[-1,")"]},"[":{input:["[",-1,"]"],output:"\\[<$.0>\\]",otype:st,fixity:Z,associativity:J,priority:2},"]":{input:[-1,"]"]},",":{input:[1,",",1],output:"<$.0>,<$.1>",otype:nt,fixity:W,associativity:q,priority:3},"?":{input:[1,"?",1,":",1],output:"(<$.0>?<$.1>:<$.2>)",otype:tt,fixity:W,associativity:J,priority:100},":":{input:[1,":",1]},"!":{input:["!",1],output:"!<$.0>",otype:at,fixity:H,associativity:J,priority:10},"~":{input:["~",1],output:"~<$.0>",otype:rt,fixity:H,associativity:J,priority:10},"^":{input:[1,"^",1],output:"Math.pow(<$.0>,<$.1>)",otype:rt,fixity:W,associativity:J,priority:11},"*":{input:[1,"*",1],output:"(<$.0>*<$.1>)",otype:rt,fixity:W,associativity:q,priority:20},"/":{input:[1,"/",1],output:"(<$.0>/<$.1>)",otype:rt,fixity:W,associativity:q,priority:20},"%":{input:[1,"%",1],output:"(<$.0>%<$.1>)",otype:rt,fixity:W,associativity:q,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:st,fixity:W,associativity:q,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:ot,fixity:W,associativity:q,priority:25}],[function(t,n){return t.TOK&&!t.PREV_IS_OP},{input:[1,"+",1],output:"(<$.0>+<$.1>)",otype:rt,fixity:W,associativity:q,priority:25}],[function(t,n){return!t.TOK||t.PREV_IS_OP},{input:["+",1],output:"<$.0>",otype:rt,fixity:H,associativity:J,priority:4}]]},"-":{polymorphic:[[function(t,n){return t.TOK&&!t.PREV_IS_OP},{input:[1,"-",1],output:"(<$.0>-<$.1>)",otype:rt,fixity:W,associativity:q,priority:25}],[function(t,n){return!t.TOK||t.PREV_IS_OP},{input:["-",1],output:"(-<$.0>)",otype:rt,fixity:H,associativity:J,priority:4}]]},">>":{input:[1,">>",1],output:"(<$.0>\\>\\><$.1>)",otype:rt,fixity:W,associativity:q,priority:30},"<<":{input:[1,"<<",1],output:"(<$.0>\\<\\<<$.1>)",otype:rt,fixity:W,associativity:q,priority:30},">":{input:[1,">",1],output:"(<$.0>\\><$.1>)",otype:at,fixity:W,associativity:q,priority:35},"<":{input:[1,"<",1],output:"(<$.0>\\<<$.1>)",otype:at,fixity:W,associativity:q,priority:35},">=":{input:[1,">=",1],output:"(<$.0>\\>=<$.1>)",otype:at,fixity:W,associativity:q,priority:35},"<=":{input:[1,"<=",1],output:"(<$.0>\\<=<$.1>)",otype:at,fixity:W,associativity:q,priority:35},"==":{polymorphic:[[function(t,n){return t.DEDUCED_TYPE===n.T_ARY},{input:[1,"==",1],output:"Fn.ary_eq(<$.0>,<$.1>)",otype:at,fixity:W,associativity:q,priority:40}],[function(t,n){return!0},{input:[1,"==",1],output:"(<$.0>==<$.1>)",otype:at,fixity:W,associativity:q,priority:40}]]},"!=":{input:[1,"!=",1],output:"(<$.0>!=<$.1>)",otype:at,fixity:W,associativity:q,priority:40},is:{input:[1,"is",1],output:"(<$.0>===<$.1>)",otype:at,fixity:W,associativity:q,priority:40},matches:{input:[1,"matches",1],output:"Fn.match(<$.1>,<$.0>)",otype:at,fixity:W,associativity:B,priority:40},in:{input:[1,"in",1],output:"Fn.contains(<$.1>,<$.0>)",otype:at,fixity:W,associativity:B,priority:40},"&":{input:[1,"&",1],output:"(<$.0>&<$.1>)",otype:rt,fixity:W,associativity:q,priority:45},"|":{input:[1,"|",1],output:"(<$.0>|<$.1>)",otype:rt,fixity:W,associativity:q,priority:46},"&&":{input:[1,"&&",1],output:"(<$.0>&&<$.1>)",otype:at,fixity:W,associativity:q,priority:47},"||":{input:[1,"||",1],output:"(<$.0>||<$.1>)",otype:at,fixity:W,associativity:q,priority:48},or:$("||"),and:$("&&"),not:$("!")},functions:{min:{input:"min",output:"Math.min(<$.0>)",otype:rt},max:{input:"max",output:"Math.max(<$.0>)",otype:rt},pow:{input:"pow",output:"Math.pow(<$.0>)",otype:rt},sqrt:{input:"sqrt",output:"Math.sqrt(<$.0>)",otype:rt},len:{input:"len",output:"Fn.len(<$.0>)",otype:rt},int:{input:"int",output:"parseInt(<$.0>)",otype:rt},float:{input:"float",output:"parseFloat(<$.0>)",otype:rt},str:{input:"str",output:"String(<$.0>)",otype:ot},array:{input:"array",output:"Fn.ary(<$.0>)",otype:st},clamp:{input:"clamp",output:"Fn.clamp(<$.0>)",otype:rt},sum:{input:"sum",output:"Fn.sum(<$.0>)",otype:rt},avg:{input:"avg",output:"Fn.avg(<$.0>)",otype:rt},time:{input:"avg",output:"Fn.time()",otype:rt,arity:0},date:{input:"date",output:"Fn.date(<$.0>)",otype:ot}},runtime:{clamp:function(t,n,e){return n>e?t>n?n:te?e:t0)for(t=0;t0){for(t=0;t 'strval(<$.0>)' ,'otype' => Xpresion::T_STR ) + ,'array' => array( + 'input' => 'array' + ,'output' => '$Fn-\\>ary(<$.0>)' + ,'otype' => Xpresion::T_ARY + ) ,'clamp' => array( 'input' => 'clamp' ,'output' => '$Fn-\\>clamp(<$.0>)' @@ -2947,16 +2952,19 @@ function($curr){return true;}, foreach ($values as $v) $s += $v; return $l > 0 ? $s/$l : $s; } - ,'ary_merge'=> function($a1, $a2) { - return array_merge((array)$a1, (array)$a2); + ,'ary' => function( $x ) { + return is_array($x) ? $x : array($x); } - ,'ary_eq' => function($a1, $a2) { + ,'ary_eq' => function( $a1, $a2 ) { return ((array)$a1) == ((array)$a2); } - ,'match' => function($str, $regex) { + ,'ary_merge'=> function( $a1, $a2 ) { + return array_merge((array)$a1, (array)$a2); + } + ,'match' => function( $str, $regex ) { return (bool)preg_match($regex, $str, $m); } - ,'contains' => function($o, $i) { + ,'contains' => function( $o, $i ) { if ( is_string($o) ) return (false !== strpos($o, strval($i))); elseif ( XpresionUtils::is_assoc_array($o) ) return array_key_exists($i, $o); elseif ( is_array($o) ) return in_array($i, $o); diff --git a/src/python/Xpresion.py b/src/python/Xpresion.py index e1e68e4..5dfaf96 100644 --- a/src/python/Xpresion.py +++ b/src/python/Xpresion.py @@ -2569,6 +2569,11 @@ def ary_eq(a1, a2): ,'output' : 'str(<$.0>)' ,'otype' : T_STR } + ,'array' : { + 'input' : 'array' + ,'output' : 'Fn.ary(<$.0>)' + ,'otype' : T_ARY + } ,'clamp' : { 'input' : 'clamp' ,'output' : 'Fn.clamp(<$.0>)' @@ -2609,9 +2614,10 @@ def ary_eq(a1, a2): ,'len' : lambda v: 0 if v is None else (len(v) if isinstance(v,(str,list,tuple,dict)) else 1) ,'sum' : sum ,'avg' : avg - ,'ary_merge': ary_merge + ,'ary' : lambda x: x if isinstance(x,list) else (list(x) if isinstance(x,tuple) else [x]) ,'ary_eq' : ary_eq - ,'match' : lambda s, regex: bool(re.search(regex, s )) + ,'ary_merge': ary_merge + ,'match' : lambda s, regex: bool(re.search(regex, s)) ,'contains' : lambda o, i: bool(i in o) ,'time' : php_time ,'date' : php_date diff --git a/test/out-js b/test/out-js index f752132..3223d5b 100644 --- a/test/out-js +++ b/test/out-js @@ -1,5 +1,41 @@ Xpresion.VERSION 1.0.0 +========================================== +Expression: array("string") +Variables : [] +Evaluator : Fn.ary("string") +Data : {} +Result : ["string"] +========================================== +Expression: array(["ar","ra","y"]) +Variables : [] +Evaluator : Fn.ary(["ar","ra","y"]) +Data : {} +Result : ["ar","ra","y"] +========================================== +Expression: str(2) +Variables : [] +Evaluator : String(2) +Data : {} +Result : "2" +========================================== +Expression: str("2") +Variables : [] +Evaluator : String("2") +Data : {} +Result : "2" +========================================== +Expression: int(2) +Variables : [] +Evaluator : parseInt(2) +Data : {} +Result : 2 +========================================== +Expression: int("2") +Variables : [] +Evaluator : parseInt("2") +Data : {} +Result : 2 ========================================== Error: Xpresion Error: Unknown token "Math.pow(this)" at "Math.pow(this)" ========================================== @@ -226,13 +262,13 @@ Expression: date("Y-m-d H:i:s") Variables : [] Evaluator : Fn.date("Y-m-d H:i:s") Data : {} -Result : "2019-03-20 11:53:52" +Result : "2019-04-06 17:01:05" ========================================== Expression: time() Variables : [] Evaluator : Fn.time() Data : {} -Result : 1553075632 +Result : 1554559265 ========================================== Expression: date("Y-m-d H:i:s", time()) Variables : [] diff --git a/test/out-php b/test/out-php index f3d32c5..cc264f9 100644 --- a/test/out-php +++ b/test/out-php @@ -1,5 +1,69 @@ Xpresion.VERSION 1.0.0 +========================================== +Expression: array("string") +Variables : [] +Evaluator : $Fn->ary("string") +Data : array(0) { +} + +Result : array(1) { + [0]=> + string(6) "string" +} + +========================================== +Expression: array(["ar","ra","y"]) +Variables : [] +Evaluator : $Fn->ary(array("ar","ra","y")) +Data : array(0) { +} + +Result : array(3) { + [0]=> + string(2) "ar" + [1]=> + string(2) "ra" + [2]=> + string(1) "y" +} + +========================================== +Expression: str(2) +Variables : [] +Evaluator : strval(2) +Data : array(0) { +} + +Result : string(1) "2" + +========================================== +Expression: str("2") +Variables : [] +Evaluator : strval("2") +Data : array(0) { +} + +Result : string(1) "2" + +========================================== +Expression: int(2) +Variables : [] +Evaluator : intval(2) +Data : array(0) { +} + +Result : int(2) + +========================================== +Expression: int("2") +Variables : [] +Evaluator : intval("2") +Data : array(0) { +} + +Result : int(2) + ========================================== Xpresion Error: Unknown token "hex2dec($this)" at hex2dec($this) ========================================== @@ -146,11 +210,11 @@ Variables : [v] Evaluator : Xpresion::GET($Var["v"],array("key","0","key")) Data : array(1) { ["v"]=> - object(stdClass)#221 (1) { + object(stdClass)#242 (1) { ["key"]=> array(2) { [0]=> - object(stdClass)#135 (1) { + object(stdClass)#147 (1) { ["key"]=> string(7) "correct" } @@ -271,7 +335,7 @@ Evaluator : date("Y-m-d H:i:s") Data : array(0) { } -Result : string(19) "2019-03-20 10:53:54" +Result : string(19) "2019-04-06 16:01:13" ========================================== Expression: time() @@ -280,7 +344,7 @@ Evaluator : time() Data : array(0) { } -Result : int(1553075634) +Result : int(1554559273) ========================================== Expression: date("Y-m-d H:i:s", time()) diff --git a/test/out-py b/test/out-py index c61f55e..7b5f6e2 100644 --- a/test/out-py +++ b/test/out-py @@ -1,6 +1,42 @@ Xpresion Module loaded succesfully Xpresion.VERSION 1.0.0 +========================================== +Expression: array("string") +Variables : [] +Evaluator : Fn.ary("string") +Data : {} +Result : ['string'] +========================================== +Expression: array(["ar","ra","y"]) +Variables : [] +Evaluator : Fn.ary(["ar","ra","y"]) +Data : {} +Result : ['ar', 'ra', 'y'] +========================================== +Expression: str(2) +Variables : [] +Evaluator : str(2) +Data : {} +Result : '2' +========================================== +Expression: str("2") +Variables : [] +Evaluator : str("2") +Data : {} +Result : '2' +========================================== +Expression: int(2) +Variables : [] +Evaluator : int(2) +Data : {} +Result : 2 +========================================== +Expression: int("2") +Variables : [] +Evaluator : int("2") +Data : {} +Result : 2 ========================================== Xpresion Error: Unknown token "math.pow(self)" at math.pow(self) ========================================== @@ -109,7 +145,7 @@ Evaluator : Var["v"] Expression: $v.key.0.key Variables : [v] Evaluator : Xpresion.GET(Var["v"],["key","0","key"]) -Data : {'v': <__main__.TestObject object at 0x021E64F0>} +Data : {'v': <__main__.TestObject object at 0x021B64F0>} Result : 'correct' ========================================== Expression: True @@ -218,13 +254,13 @@ Expression: date("Y-m-d H:i:s") Variables : [] Evaluator : Fn.date("Y-m-d H:i:s") Data : {} -Result : '2019-03-20 11:53:57' +Result : '2019-04-06 17:01:20' ========================================== Expression: time() Variables : [] Evaluator : Fn.time() Data : {} -Result : 1553075637 +Result : 1554559280 ========================================== Expression: date("Y-m-d H:i:s", time()) Variables : [] diff --git a/test/test.js b/test/test.js index f444836..6d19c5b 100644 --- a/test/test.js +++ b/test/test.js @@ -23,6 +23,12 @@ function test_expr(expr, evaluate) echo( 'Xpresion.VERSION ' + Xpresion.VERSION + "\n" ); +test_expr('array("string")',true); +test_expr('array(["ar","ra","y"])',true); +test_expr('str(2)',true); +test_expr('str("2")',true); +test_expr('int(2)',true); +test_expr('int("2")',true); test_expr('Math.pow(this)'); test_expr('13'); test_expr('1.32'); diff --git a/test/test.php b/test/test.php index 4d1c8d4..73eea3c 100644 --- a/test/test.php +++ b/test/test.php @@ -24,6 +24,12 @@ function test_expr($expr, $evaluate=false) echo_( 'Xpresion.VERSION ' . Xpresion::VERSION . "\n" ); +test_expr('array("string")',true); +test_expr('array(["ar","ra","y"])',true); +test_expr('str(2)',true); +test_expr('str("2")',true); +test_expr('int(2)',true); +test_expr('int("2")',true); test_expr('hex2dec($this)'); test_expr('13'); test_expr('1.32'); diff --git a/test/test.py b/test/test.py index f6a443e..5fc1a42 100644 --- a/test/test.py +++ b/test/test.py @@ -42,6 +42,12 @@ class TestObject: echo( 'Xpresion.VERSION ' + Xpresion.VERSION + "\n" ) +test_expr('array("string")',True) +test_expr('array(["ar","ra","y"])',True) +test_expr('str(2)',True) +test_expr('str("2")',True) +test_expr('int(2)',True) +test_expr('int("2")',True) test_expr('math.pow(self)'); test_expr('13') test_expr('1.32')