diff --git a/jspath.min.js b/jspath.min.js index 9dd9ae9..53bae9f 100644 --- a/jspath.min.js +++ b/jspath.min.js @@ -8,4 +8,4 @@ * http://www.gnu.org/licenses/gpl.html * * @version 0.2.2 -*/(function(e){var t;typeof exports=="object"?e(t,exports):typeof define=="function"?define(e):e(t,JSPath={})})(function(e,t){function s(e){return Function("data,subst",i(r(e)))}var n={PATH:1,SELECTOR:2,OBJ_PRED:3,POS_PRED:4,LOGICAL_EXPR:5,BINARY_EXPR:6,CONCAT_EXPR:7,UNARY_EXPR:8,ARRAY_EXPR:9,LITERAL:10,SUBST:11},r=function(){function u(t){r=t,i=0,s=null,o=r.length;var n=a(),u=M();return u.type!==e.EOP&&q(u),n}function a(){C()||q(M());var e=!1;N("^")&&(M(),e=!0);var t=[],r;while(i")||N("<=")||N(">="))e={type:n.BINARY_EXPR,op:M().val,args:[e,g()]};return e}function y(){var e=b();while(N("+")||N("-"))e={type:n.BINARY_EXPR,op:M().val,args:[e,y()]};return e}function b(){var e=E();while(N("*")||N("/")||N("%"))e={type:n.BINARY_EXPR,op:M().val,args:[e,b()]};return e}function w(){if(N(":"))return M(),{type:n.ARRAY_EXPR,toIdx:E()};var e=E();return N(":")?(M(),N("]")?{type:n.ARRAY_EXPR,fromIdx:e}:{type:n.ARRAY_EXPR,fromIdx:e,toIdx:E()}):{type:n.ARRAY_EXPR,idx:e}}function E(){return N("!")||N("-")?{type:n.UNARY_EXPR,op:M().val,arg:E()}:S()}function S(){var t=A(),r=t.type;return r===e.STR||r===e.NUM||r===e.BOOL?{type:n.LITERAL,val:M().val}:r===e.ID&&t.val[0]==="$"?{type:n.SUBST,name:M().val.substr(1)}:C()?a():N("(")?x():q(M())}function x(){L("(");var e=d();return L(")"),e}function T(){L("(");var e=a(),t;while(N("|"))M(),(t||(t=[e])).push(a());return L(")"),t?{type:n.CONCAT_EXPR,op:"|",args:t}:e}function N(t){var n=A();return n.type===e.PUNCT&&n.val===t}function C(){return k()||N("^")}function k(){var t=A();if(t.type===e.PUNCT){var n=t.val;return n==="."||n===".."}return!1}function L(t){var n=M();(n.type!==e.PUNCT||n.val!==t)&&q(n)}function A(){if(s!==null)return s;var e=i;return s=O(),i=e,s}function O(){while(D(r[i]))++i;if(i>=o)return{type:e.EOP,range:[i,i]};var t=I();if(t||(t=j())||(t=j())||(t=F())||(t=B()))return t;q({val:r[i],range:[i,i]})}function M(){var e;return s?(i=s.range[1],e=s,s=null,e):O()}function _(e){return"0123456789".indexOf(e)>=0}function D(e){return e===" "}function P(e){return e==="$"||e==="_"||e>="a"&&e<="z"||e>="A"&&e<="Z"}function H(e){return P(e)||e>="0"&&e<="9"}function B(){var t=r[i];if(!P(t))return;var n=i,s=t;while(++i=0)return{type:e.PUNCT,val:n+s+o,range:[t,i+=3]}}else if("=!^$*><".indexOf(n)>=0)return{type:e.PUNCT,val:n+s,range:[t,i+=2]}}if(n===s&&(n==="|"||n==="&"))return{type:e.PUNCT,val:n+s,range:[t,i+=2]};if(":{}()[]^+-*/%!><|".indexOf(n)>=0)return{type:e.PUNCT,val:n,range:[t,++i]}}function q(n){n.type===e.EOP&&R(n,t.UNEXP_EOP),R(n,t.UNEXP_TOKEN,n.val)}function R(e,t){var n=Array.prototype.slice.call(arguments,2),r=t.replace(/%(\d)/g,function(e,t){return n[t]||""}),i=new Error(r);throw i.column=e.range[0],i}var e={ID:1,NUM:2,STR:3,BOOL:4,PUNCT:5,EOP:6},t={UNEXP_TOKEN:'Unexpected token "%0"',UNEXP_EOP:"Unexpected end of path"},r,i,s,o;return u}(),i=function(){function s(){if(i.length)return i.shift();var e="v"+ ++r;return t.push(e),e}function o(){var e=arguments,t=e.length;while(t--)i.push(e[t])}function u(n){return e=[],t=["res"],r=0,i=[],a(n,"res","data",!0),"data = Array.isArray(data)? data : [data];"+(t.length?"var "+t.join(",")+";":"")+e.join("")+"return res;"}function a(t,r,i,u){var a=s(),p=t.parts,d=0,v=p.length,m=!0;e.push(a,"=",t.fromRoot?"data":i,";");while(d 1 &&",p,".length?",p,".length > 1?",u,".concat.apply(",u,",",p,") :",u,".concat(",p,"[0]) :",u,";"),o(u,a,f,l,c,h,p)}}function l(t,n,r){var i=t.prop,u=s(),a=s(),f=s(),l=s(),c=s(),h=s(),p=s(),d=s();e.push(u,"=",r,".slice(),",d,"= [];","while(",u,".length) {",a,"=",u,".shift();"),i?e.push("if(typeof ",a,'=== "object" &&',a,") {"):e.push("if(typeof ",a,"!= null) {"),e.push(f,"= [];","if(Array.isArray(",a,")) {",l,"= 0,",p,"=",a,".length;","while(",l,"<",p,") {",h,"=",a,"[",l,"++];"),i&&e.push("if(typeof ",h,'=== "object") {'),S(f,h),i&&e.push("}"),e.push("}","}","else {"),i?i!=="*"&&(e.push(h,"=",a,'["'+i+'"];'),S(d,h)):(S(d,a),e.push("if(typeof ",a,'=== "object") {')),e.push("for(",c," in ",a,") {","if(",a,".hasOwnProperty(",c,")) {",h,"=",a,"[",c,"];"),S(f,h),i==="*"&&S(d,h),e.push("}","}"),i||e.push("}"),e.push("}",f,".length &&",u,".unshift.apply(",u,",",f,");","}","}",n,"=",d,";"),o(u,a,f,l,c,h,p,d)}function c(t,n,r){var i=s(),u=s(),a=s(),f=s(),l=s();e.push(i,"= [];",u,"= 0;",a,"=",r,".length;","while(",u,"<",a,") {",l,"=",r,"[",u,"];"),d(t.arg,f,l),e.push(x(t.arg,f),"&&",i,".push(",l,");","++",u,";","}",n,"=",i,";"),o(i,u,a,l,f)}function h(t,n,r){var i=t.arg,u,a;if(i.idx){var f=s();return d(i.idx,f,r),e.push(f,"=",p(f,r),";",n,"=",r,"[",f,"] == null? [] : [",r,"[",f,"]];"),o(f),!1}i.fromIdx?i.toIdx?(u=s(),a=s(),d(i.fromIdx,u,r),d(i.toIdx,a,r),e.push(u,"=",p(u,r),";",a,"=",p(a,r),";",n,"=",r,".slice(",u,", ",a,");"),o(u,a)):(u=s(),d(i.fromIdx,u,r),e.push(u,"=",p(u,r),";",n,"=",r,".slice(",u,");"),o(u)):(a=s(),d(i.toIdx,a,r),e.push(a,"=",p(a,r),";",n,"=",r,".slice(0, ",a,");"),o(a))}function p(e,t){return[e,"< 0?",t,".length +",e,":",e].join("")}function d(t,r,i){switch(t.type){case n.PATH:var u=s();a(t,u,"["+i+"]"),e.push(r,"=",u,";"),o(u);break;case n.BINARY_EXPR:C[t.op]?y(t,r,i):v(t,r,i);break;case n.LOGICAL_EXPR:g(t,r,i);break;case n.UNARY_EXPR:b(t,r,i);break;case n.LITERAL:var f=t.val;switch(typeof f){case"string":e.push(r,"=",E(f),";");break;default:e.push(r,"=",f,";")}break;case n.SUBST:e.push(r,"= subst.",t.name,";")}}function v(t,r,i){var u=s(),a=s(),f=s(),l=s(),c=s(),h=s(),p=s(),v=s(),g=t.args[0],y=t.args[1];e.push(r,"= false;"),d(g,u,i),d(y,a,i);var b=g.type===n.PATH,w=y.type===n.LITERAL;e.push(f,"="),b?e.push("true;"):e.push("Array.isArray(",u,");"),e.push(l,"="),w?e.push("false;"):e.push("Array.isArray(",a,");"),e.push("if(",f,"&&",u,".length === 1) {",u,"=",u,"[0];",f,"= false;","}"),w||e.push("if(",l,"&&",a,".length === 1) {",a,"=",a,"[0];",l,"= false;","}"),e.push(c,"= 0;","if(",f,") {",p,"=",u,".length;"),w||(e.push("if(",l,") {",v,"=",a,".length;","while(",c,"<",p,"&& !",r,") {",h,"= 0;","while(",h,"<",v,") {"),m(t.op,[u,"[",c,"]"].join(""),[a,"[",h,"]"].join("")),e.push(r,"= true;","break;","}","++",h,";","}","++",c,";","}","}","else {")),e.push("while(",c,"<",p,") {"),m(t.op,[u,"[",c,"]"].join(""),a),e.push(r,"= true;","break;","}","++",c,";","}"),w||e.push("}"),e.push("}"),w||(e.push("else if(",l,") {",v,"=",a,".length;","while(",c,"<",v,") {"),m(t.op,u,[a,"[",c,"]"].join("")),e.push(r,"= true;","break;","}","++",c,";","}","}")),e.push("else {",r,"=",N[t.op](u,a),";","}"),o(u,a,f,l,c,h,p,v)}function m(t,n,r){e.push("if(",N[t](n,r),") {")}function g(t,n,r){var i=[],u=t.args,a=u.length,f=0,l;e.push(n,"= false;");switch(t.op){case"&&":while(f 1?",r,".push(",n,") :"),e.push(t,"=",t,".concat(",n,");","}","else {"),r&&e.push("if(",r,".length) {",t,"=",t,".concat.apply(",t,",",r,");",r,"= [];","}"),e.push(t,".push(",n,");","}","}")}function x(e,t){switch(e.type){case n.LOGICAL_EXPR:return t;case n.LITERAL:return"!!"+t;case n.PATH:return t+".length > 0";default:return["(typeof ",t,'=== "boolean"?',t,":","Array.isArray(",t,")?",t,".length > 0 : !!",t,")"].join("")}}function T(e,t){switch(e.type){case n.LITERAL:return t;case n.PATH:return t+"[0]";default:return["(Array.isArray(",t,")?",t,"[0] : ",t,")"].join("")}}var e,t,r,i,N={"===":function(e,t){return e+"==="+t},"==":function(e,t){return"typeof "+e+'=== "string" && typeof '+t+'=== "string"?'+e+".toLowerCase() ==="+t+".toLowerCase() :"+e+"=="+t},">=":function(e,t){return e+">="+t},">":function(e,t){return e+">"+t},"<=":function(e,t){return e+"<="+t},"<":function(e,t){return e+"<"+t},"!==":function(e,t){return e+"!=="+t},"!=":function(e,t){return e+"!="+t},"^==":function(e,t){return["typeof ",e,'=== "string" && typeof ',t+'=== "string" &&',e,".indexOf(",t,") === 0"].join("")},"^=":function(e,t){return[e,"!= null &&",t,"!= null &&",e,".toString().toLowerCase().indexOf(",t,".toString().toLowerCase()) === 0"].join("")},"$==":function(e,t){return["typeof ",e,'=== "string" && typeof ',t,'=== "string" &&',e,".lastIndexOf(",t,") ===",e,".length -",t,".length"].join("")},"$=":function(e,t){return[e,"!= null &&",t,"!= null &&","(",e,"=",e,".toLowerCase().toString()).indexOf(","(",t,"=",t,".toLowerCase().toLowerCase())) ===",e,".length -",t,".length"].join("")},"*==":function(e,t){return["typeof ",e,'=== "string" && typeof ',t,'=== "string" &&',e,".indexOf(",t,") > -1"].join("")},"*=":function(e,t){return[e,"!= null && ",t,"!= null &&",e,".toString().toLowerCase().indexOf(",t,".toString().toLowerCase()) > -1"].join("")},"+":function(e,t){return e+"+"+t},"-":function(e,t){return e+"-"+t},"*":function(e,t){return e+"*"+t},"/":function(e,t){return e+"/"+t},"%":function(e,t){return e+"%"+t}},C={"+":1,"-":1,"*":1,"/":1,"%":1};return u}(),o={},u=[],a={cacheSize:100},f={cacheSize:function(e,t){if(tt){var n=u.splice(0,u.length-t),r=n.length,i=0;while(ia.cacheSize&&delete o[u.shift()]),o[e](t,n||{})}}); \ No newline at end of file +*/(function(e){var t;typeof exports=="object"?e(t,exports):typeof define=="function"?define(e):e(t,JSPath={})})(function(e,t){function s(e){return Function("data,subst",i(r(e)))}var n={PATH:1,SELECTOR:2,OBJ_PRED:3,POS_PRED:4,LOGICAL_EXPR:5,BINARY_EXPR:6,CONCAT_EXPR:7,UNARY_EXPR:8,POS_EXPR:9,LITERAL:10,SUBST:11},r=function(){function u(t){r=t,i=0,s=null,o=r.length;var n=a(),u=M();return u.type!==e.EOP&&q(u),n}function a(){C()||q(M());var e=!1;N("^")&&(M(),e=!0);var t=[],r;while(i")||N("<=")||N(">="))e={type:n.BINARY_EXPR,op:M().val,args:[e,g()]};return e}function y(){var e=b();while(N("+")||N("-"))e={type:n.BINARY_EXPR,op:M().val,args:[e,y()]};return e}function b(){var e=E();while(N("*")||N("/")||N("%"))e={type:n.BINARY_EXPR,op:M().val,args:[e,b()]};return e}function w(){if(N(":"))return M(),{type:n.POS_EXPR,toIdx:E()};var e=E();return N(":")?(M(),N("]")?{type:n.POS_EXPR,fromIdx:e}:{type:n.POS_EXPR,fromIdx:e,toIdx:E()}):{type:n.POS_EXPR,idx:e}}function E(){return N("!")||N("-")?{type:n.UNARY_EXPR,op:M().val,arg:E()}:S()}function S(){var t=A(),r=t.type;return r===e.STR||r===e.NUM||r===e.BOOL?{type:n.LITERAL,val:M().val}:r===e.ID&&t.val[0]==="$"?{type:n.SUBST,name:M().val.substr(1)}:C()?a():N("(")?x():q(M())}function x(){L("(");var e=d();return L(")"),e}function T(){L("(");var e=a(),t;while(N("|"))M(),(t||(t=[e])).push(a());return L(")"),t?{type:n.CONCAT_EXPR,op:"|",args:t}:e}function N(t){var n=A();return n.type===e.PUNCT&&n.val===t}function C(){return k()||N("^")}function k(){var t=A();if(t.type===e.PUNCT){var n=t.val;return n==="."||n===".."}return!1}function L(t){var n=M();(n.type!==e.PUNCT||n.val!==t)&&q(n)}function A(){if(s!==null)return s;var e=i;return s=O(),i=e,s}function O(){while(D(r[i]))++i;if(i>=o)return{type:e.EOP,range:[i,i]};var t=I();if(t||(t=j())||(t=j())||(t=F())||(t=B()))return t;q({val:r[i],range:[i,i]})}function M(){var e;return s?(i=s.range[1],e=s,s=null,e):O()}function _(e){return"0123456789".indexOf(e)>=0}function D(e){return e===" "}function P(e){return e==="$"||e==="_"||e>="a"&&e<="z"||e>="A"&&e<="Z"}function H(e){return P(e)||e>="0"&&e<="9"}function B(){var t=r[i];if(!P(t))return;var n=i,s=t;while(++i=0)return{type:e.PUNCT,val:n+s+o,range:[t,i+=3]}}else if("=!^$*><".indexOf(n)>=0)return{type:e.PUNCT,val:n+s,range:[t,i+=2]}}if(n===s&&(n==="|"||n==="&"))return{type:e.PUNCT,val:n+s,range:[t,i+=2]};if(":{}()[]^+-*/%!><|".indexOf(n)>=0)return{type:e.PUNCT,val:n,range:[t,++i]}}function q(n){n.type===e.EOP&&R(n,t.UNEXP_EOP),R(n,t.UNEXP_TOKEN,n.val)}function R(e,t){var n=Array.prototype.slice.call(arguments,2),r=t.replace(/%(\d)/g,function(e,t){return n[t]||""}),i=new Error(r);throw i.column=e.range[0],i}var e={ID:1,NUM:2,STR:3,BOOL:4,PUNCT:5,EOP:6},t={UNEXP_TOKEN:'Unexpected token "%0"',UNEXP_EOP:"Unexpected end of path"},r,i,s,o;return u}(),i=function(){function s(){if(i.length)return i.shift();var e="v"+ ++r;return t.push(e),e}function o(){var e=arguments,t=e.length;while(t--)i.push(e[t])}function u(n){return e=[],t=["res"],r=0,i=[],a(n,"res","data",!0),"data = Array.isArray(data)? data : [data];"+(t.length?"var "+t.join(",")+";":"")+e.join("")+"return res;"}function a(t,r,i,u){var a=s(),p=t.parts,d=0,v=p.length,m=!0;e.push(a,"=",t.fromRoot?"data":i,";");while(d 1 &&",p,".length?",p,".length > 1?",u,".concat.apply(",u,",",p,") :",u,".concat(",p,"[0]) :",u,";"),o(u,a,f,l,c,h,p)}}function l(t,n,r){var i=t.prop,u=s(),a=s(),f=s(),l=s(),c=s(),h=s(),p=s(),d=s();e.push(u,"=",r,".slice(),",d,"= [];","while(",u,".length) {",a,"=",u,".shift();"),i?e.push("if(typeof ",a,'=== "object" &&',a,") {"):e.push("if(typeof ",a,"!= null) {"),e.push(f,"= [];","if(Array.isArray(",a,")) {",l,"= 0,",p,"=",a,".length;","while(",l,"<",p,") {",h,"=",a,"[",l,"++];"),i&&e.push("if(typeof ",h,'=== "object") {'),E(f,h),i&&e.push("}"),e.push("}","}","else {"),i?i!=="*"&&(e.push(h,"=",a,'["'+i+'"];'),E(d,h)):(E(d,a),e.push("if(typeof ",a,'=== "object") {')),e.push("for(",c," in ",a,") {","if(",a,".hasOwnProperty(",c,")) {",h,"=",a,"[",c,"];"),E(f,h),i==="*"&&E(d,h),e.push("}","}"),i||e.push("}"),e.push("}",f,".length &&",u,".unshift.apply(",u,",",f,");","}","}",n,"=",d,";"),o(u,a,f,l,c,h,p,d)}function c(t,n,r){var i=s(),u=s(),a=s(),f=s(),l=s();e.push(i,"= [];",u,"= 0;",a,"=",r,".length;","while(",u,"<",a,") {",l,"=",r,"[",u,"];"),p(t.arg,f,l),e.push(S(t.arg,f),"&&",i,".push(",l,");","++",u,";","}",n,"=",i,";"),o(i,u,a,l,f)}function h(t,n,r){var i=t.arg,u,a;if(i.idx){var f=s();return p(i.idx,f,r),e.push(f,"< 0 && (",f,"=",r,".length +",f,");",n,"=",r,"[",f,"] == null? [] : [",r,"[",f,"]];"),o(f),!1}i.fromIdx?i.toIdx?(p(i.fromIdx,u=s(),r),p(i.toIdx,a=s(),r),e.push(n,"=",r,".slice(",u,", ",a,");"),o(u,a)):(p(i.fromIdx,u=s(),r),e.push(n,"=",r,".slice(",u,");"),o(u)):(p(i.toIdx,a=s(),r),e.push(n,"=",r,".slice(0, ",a,");"),o(a))}function p(t,r,i){switch(t.type){case n.PATH:var u=s();a(t,u,"["+i+"]"),e.push(r,"=",u,";"),o(u);break;case n.BINARY_EXPR:N[t.op]?g(t,r,i):d(t,r,i);break;case n.LOGICAL_EXPR:m(t,r,i);break;case n.UNARY_EXPR:y(t,r,i);break;case n.LITERAL:var f=t.val;switch(typeof f){case"string":e.push(r,"=",w(f),";");break;default:e.push(r,"=",f,";")}break;case n.SUBST:e.push(r,"= subst.",t.name,";")}}function d(t,r,i){var u=s(),a=s(),f=s(),l=s(),c=s(),h=s(),d=s(),m=s(),g=t.args[0],y=t.args[1];e.push(r,"= false;"),p(g,u,i),p(y,a,i);var b=g.type===n.PATH,w=y.type===n.LITERAL;e.push(f,"="),b?e.push("true;"):e.push("Array.isArray(",u,");"),e.push(l,"="),w?e.push("false;"):e.push("Array.isArray(",a,");"),e.push("if(",f,"&&",u,".length === 1) {",u,"=",u,"[0];",f,"= false;","}"),w||e.push("if(",l,"&&",a,".length === 1) {",a,"=",a,"[0];",l,"= false;","}"),e.push(c,"= 0;","if(",f,") {",d,"=",u,".length;"),w||(e.push("if(",l,") {",m,"=",a,".length;","while(",c,"<",d,"&& !",r,") {",h,"= 0;","while(",h,"<",m,") {"),v(t.op,[u,"[",c,"]"].join(""),[a,"[",h,"]"].join("")),e.push(r,"= true;","break;","}","++",h,";","}","++",c,";","}","}","else {")),e.push("while(",c,"<",d,") {"),v(t.op,[u,"[",c,"]"].join(""),a),e.push(r,"= true;","break;","}","++",c,";","}"),w||e.push("}"),e.push("}"),w||(e.push("else if(",l,") {",m,"=",a,".length;","while(",c,"<",m,") {"),v(t.op,u,[a,"[",c,"]"].join("")),e.push(r,"= true;","break;","}","++",c,";","}","}")),e.push("else {",r,"=",T[t.op](u,a),";","}"),o(u,a,f,l,c,h,d,m)}function v(t,n,r){e.push("if(",T[t](n,r),") {")}function m(t,n,r){var i=[],u=t.args,a=u.length,f=0,l;e.push(n,"= false;");switch(t.op){case"&&":while(f 1?",r,".push(",n,") :"),e.push(t,"=",t,".concat(",n,");","}","else {"),r&&e.push("if(",r,".length) {",t,"=",t,".concat.apply(",t,",",r,");",r,"= [];","}"),e.push(t,".push(",n,");","}","}")}function S(e,t){switch(e.type){case n.LOGICAL_EXPR:return t;case n.LITERAL:return"!!"+t;case n.PATH:return t+".length > 0";default:return["(typeof ",t,'=== "boolean"?',t,":","Array.isArray(",t,")?",t,".length > 0 : !!",t,")"].join("")}}function x(e,t){switch(e.type){case n.LITERAL:return t;case n.PATH:return t+"[0]";default:return["(Array.isArray(",t,")?",t,"[0] : ",t,")"].join("")}}var e,t,r,i,T={"===":function(e,t){return e+"==="+t},"==":function(e,t){return"typeof "+e+'=== "string" && typeof '+t+'=== "string"?'+e+".toLowerCase() ==="+t+".toLowerCase() :"+e+"=="+t},">=":function(e,t){return e+">="+t},">":function(e,t){return e+">"+t},"<=":function(e,t){return e+"<="+t},"<":function(e,t){return e+"<"+t},"!==":function(e,t){return e+"!=="+t},"!=":function(e,t){return e+"!="+t},"^==":function(e,t){return["typeof ",e,'=== "string" && typeof ',t+'=== "string" &&',e,".indexOf(",t,") === 0"].join("")},"^=":function(e,t){return[e,"!= null &&",t,"!= null &&",e,".toString().toLowerCase().indexOf(",t,".toString().toLowerCase()) === 0"].join("")},"$==":function(e,t){return["typeof ",e,'=== "string" && typeof ',t,'=== "string" &&',e,".lastIndexOf(",t,") ===",e,".length -",t,".length"].join("")},"$=":function(e,t){return[e,"!= null &&",t,"!= null &&","(",e,"=",e,".toLowerCase().toString()).indexOf(","(",t,"=",t,".toLowerCase().toLowerCase())) ===",e,".length -",t,".length"].join("")},"*==":function(e,t){return["typeof ",e,'=== "string" && typeof ',t,'=== "string" &&',e,".indexOf(",t,") > -1"].join("")},"*=":function(e,t){return[e,"!= null && ",t,"!= null &&",e,".toString().toLowerCase().indexOf(",t,".toString().toLowerCase()) > -1"].join("")},"+":function(e,t){return e+"+"+t},"-":function(e,t){return e+"-"+t},"*":function(e,t){return e+"*"+t},"/":function(e,t){return e+"/"+t},"%":function(e,t){return e+"%"+t}},N={"+":1,"-":1,"*":1,"/":1,"%":1};return u}(),o={},u=[],a={cacheSize:100},f={cacheSize:function(e,t){if(tt){var n=u.splice(0,u.length-t),r=n.length,i=0;while(ia.cacheSize&&delete o[u.shift()]),o[e](t,n||{})}}); \ No newline at end of file diff --git a/lib/jspath.js b/lib/jspath.js index abde97c..cdfb243 100644 --- a/lib/jspath.js +++ b/lib/jspath.js @@ -35,7 +35,7 @@ var SYNTAX = { BINARY_EXPR : 6, CONCAT_EXPR : 7, UNARY_EXPR : 8, - ARRAY_EXPR : 9, + POS_EXPR : 9, LITERAL : 10, SUBST : 11 }; @@ -268,7 +268,7 @@ var parse = (function() { if(match(':')) { lex(); return { - type : SYNTAX.ARRAY_EXPR, + type : SYNTAX.POS_EXPR, toIdx : parseUnaryExpr() }; } @@ -278,21 +278,21 @@ var parse = (function() { lex(); if(match(']')) { return { - type : SYNTAX.ARRAY_EXPR, + type : SYNTAX.POS_EXPR, fromIdx : fromExpr }; } return { - type : SYNTAX.ARRAY_EXPR, + type : SYNTAX.POS_EXPR, fromIdx : fromExpr, toIdx : parseUnaryExpr() }; } return { - type : SYNTAX.ARRAY_EXPR, + type : SYNTAX.POS_EXPR, idx : fromExpr }; } @@ -837,46 +837,31 @@ var translate = (function() { var idx = acquireVar(); translateExpression(arrayExpr.idx, idx, ctx); body.push( - idx, '=', generateNormalizeArrayIndex(idx, ctx), ';', + idx, '< 0 && (', idx, '=', ctx, '.length +', idx, ');', dest, '=', ctx, '[', idx, '] == null? [] : [', ctx, '[', idx, ']];'); releaseVars(idx); return false; } else if(arrayExpr.fromIdx) { if(arrayExpr.toIdx) { - fromIdx = acquireVar(); - toIdx = acquireVar(); - translateExpression(arrayExpr.fromIdx, fromIdx, ctx); - translateExpression(arrayExpr.toIdx, toIdx, ctx); - body.push( - fromIdx, '=', generateNormalizeArrayIndex(fromIdx, ctx), ';', - toIdx, '=', generateNormalizeArrayIndex(toIdx, ctx), ';', - dest, '=', ctx, '.slice(', fromIdx, ', ', toIdx, ');'); + translateExpression(arrayExpr.fromIdx, fromIdx = acquireVar(), ctx); + translateExpression(arrayExpr.toIdx, toIdx = acquireVar(), ctx); + body.push(dest, '=', ctx, '.slice(', fromIdx, ', ', toIdx, ');'); releaseVars(fromIdx, toIdx); } else { - fromIdx = acquireVar(); - translateExpression(arrayExpr.fromIdx, fromIdx, ctx); - body.push( - fromIdx, '=', generateNormalizeArrayIndex(fromIdx, ctx), ';', - dest, '=', ctx, '.slice(', fromIdx, ');'); + translateExpression(arrayExpr.fromIdx, fromIdx = acquireVar(), ctx); + body.push(dest, '=', ctx, '.slice(', fromIdx, ');'); releaseVars(fromIdx); } } else { - toIdx = acquireVar(); - translateExpression(arrayExpr.toIdx, toIdx, ctx); - body.push( - toIdx, '=', generateNormalizeArrayIndex(toIdx, ctx), ';', - dest, '=', ctx, '.slice(0, ', toIdx, ');'); + translateExpression(arrayExpr.toIdx, toIdx = acquireVar(), ctx); + body.push(dest, '=', ctx, '.slice(0, ', toIdx, ');'); releaseVars(toIdx); } } - function generateNormalizeArrayIndex(val, ctx) { - return [val, '< 0?', ctx, '.length +', val, ':', val].join(''); - } - function translateExpression(expr, dest, ctx) { switch(expr.type) { case SYNTAX.PATH: