UNPKG

12.5 kBJavaScriptView Raw
1/**
2* JSPath
3*
4* Copyright (c) 2012 Filatov Dmitry (dfilatov@yandex-team.ru)
5* With parts by Marat Dulin (mdevils@gmail.com)
6* Dual licensed under the MIT and GPL licenses:
7* http://www.opensource.org/licenses/mit-license.php
8* http://www.gnu.org/licenses/gpl.html
9*
10* @version 0.2.9
11*/(function(){function r(e){return Function("data,subst",n(t(e)))}var e={PATH:1,SELECTOR:2,OBJ_PRED:3,POS_PRED:4,LOGICAL_EXPR:5,COMPARISON_EXPR:6,MATH_EXPR:7,CONCAT_EXPR:8,UNARY_EXPR:9,POS_EXPR:10,LITERAL:11,SUBST:12},t=function(){function u(e){r=e.split(""),i=0,s=null,o=r.length;var n=a(),u=O();return u.type!==t.EOP&&I(u),n}function a(){N()||I(O());var t=!1;T("^")&&(O(),t=!0);var n=[],r;while(r=f())n.push(r);return{type:e.PATH,fromRoot:t,parts:n}}function f(){if(C())return l();if(T("["))return c();if(T("{"))return h();if(T("("))return x()}function l(){var n=O().val,r=L(),i;if(T("*")||r.type===t.ID||r.type===t.STR)i=O().val;return{type:e.SELECTOR,selector:n,prop:i}}function c(){k("[");var t=b();return k("]"),{type:e.POS_PRED,arg:t}}function h(){k("{");var t=p();return k("}"),{type:e.OBJ_PRED,arg:t}}function p(){var t=d(),n;while(T("||"))O(),(n||(n=[t])).push(d());return n?{type:e.LOGICAL_EXPR,op:"||",args:n}:t}function d(){var t=v(),n;while(T("&&"))O(),(n||(n=[t])).push(v());return n?{type:e.LOGICAL_EXPR,op:"&&",args:n}:t}function v(){var t=m();while(T("==")||T("!=")||T("===")||T("!==")||T("^=")||T("^==")||T("$==")||T("$=")||T("*==")||T("*="))t={type:e.COMPARISON_EXPR,op:O().val,args:[t,v()]};return t}function m(){var t=g();while(T("<")||T(">")||T("<=")||T(">="))t={type:e.COMPARISON_EXPR,op:O().val,args:[t,m()]};return t}function g(){var t=y();while(T("+")||T("-"))t={type:e.MATH_EXPR,op:O().val,args:[t,g()]};return t}function y(){var t=w();while(T("*")||T("/")||T("%"))t={type:e.MATH_EXPR,op:O().val,args:[t,y()]};return t}function b(){if(T(":"))return O(),{type:e.POS_EXPR,toIdx:w()};var t=w();return T(":")?(O(),T("]")?{type:e.POS_EXPR,fromIdx:t}:{type:e.POS_EXPR,fromIdx:t,toIdx:w()}):{type:e.POS_EXPR,idx:t}}function w(){return T("!")||T("-")?{type:e.UNARY_EXPR,op:O().val,arg:w()}:E()}function E(){var n=L(),r=n.type;return r===t.STR||r===t.NUM||r===t.BOOL?{type:e.LITERAL,val:O().val}:r===t.ID&&n.val[0]==="$"?{type:e.SUBST,name:O().val.substr(1)}:N()?a():T("(")?S():I(O())}function S(){k("(");var e=p();return k(")"),e}function x(){k("(");var t=a(),n;while(T("|"))O(),(n||(n=[t])).push(a());return k(")"),n?{type:e.CONCAT_EXPR,op:"|",args:n}:t}function T(e){var n=L();return n.type===t.PUNCT&&n.val===e}function N(){return C()||T("^")}function C(){var e=L();if(e.type===t.PUNCT){var n=e.val;return n==="."||n===".."}return!1}function k(e){var n=O();(n.type!==t.PUNCT||n.val!==e)&&I(n)}function L(){if(s!==null)return s;var e=i;return s=A(),i=e,s}function A(){while(_(r[i]))++i;if(i>=o)return{type:t.EOP,range:[i,i]};var e=F();if(e||(e=H())||(e=B())||(e=j()))return e;I({val:r[i],range:[i,i]})}function O(){var e;return s?(i=s.range[1],e=s,s=null,e):A()}function M(e){return"0123456789".indexOf(e)>=0}function _(e){return e===" "}function D(e){return e==="$"||e==="_"||e>="a"&&e<="z"||e>="A"&&e<="Z"}function P(e){return D(e)||e>="0"&&e<="9"}function H(){var e=r[i];if(!D(e))return;var n=i,s=e;while(++i<o){e=r[i];if(!P(e))break;s+=e}return s==="true"||s==="false"?{type:t.BOOL,val:s==="true",range:[n,i]}:{type:t.ID,val:s,range:[n,i]}}function B(){if(r[i]!=='"')return;var e=++i,n="",s;while(i<o){s=r[i++];if(s==='"')break;n+=s}return{type:t.STR,val:n,range:[e,i]}}function j(){var e=i,n=r[i],s=n===".";if(s||M(n)){var u=n;while(++i<o){n=r[i];if(n==="."){if(s)return;s=!0}else if(!M(n))break;u+=n}return{type:t.NUM,val:s?parseFloat(u):parseInt(u,10),range:[e,i]}}}function F(){var e=i,n=r[i],s=r[i+1];if(n==="."){if(M(s))return;return r[++i]==="."?{type:t.PUNCT,val:"..",range:[e,++i]}:{type:t.PUNCT,val:".",range:[e,i]}}if(s==="="){var o=r[i+2];if(o==="="){if("=!^$*".indexOf(n)>=0)return{type:t.PUNCT,val:n+s+o,range:[e,i+=3]}}else if("=!^$*><".indexOf(n)>=0)return{type:t.PUNCT,val:n+s,range:[e,i+=2]}}if(n===s&&(n==="|"||n==="&"))return{type:t.PUNCT,val:n+s,range:[e,i+=2]};if(":{}()[]^+-*/%!><|".indexOf(n)>=0)return{type:t.PUNCT,val:n,range:[e,++i]}}function I(e){e.type===t.EOP&&q(e,n.UNEXP_EOP),q(e,n.UNEXP_TOKEN,e.val)}function q(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 t={ID:1,NUM:2,STR:3,BOOL:4,PUNCT:5,EOP:6},n={UNEXP_TOKEN:'Unexpected token "%0"',UNEXP_EOP:"Unexpected end of path"},r,i,s,o;return u}(),n=function(){function s(){if(i.length)return i.shift();var e="v"+ ++r;return n.push(e),e}function o(){var e=arguments,t=e.length;while(t--)i.push(e[t])}function u(e){return t=[],n=["res"],r=0,i=[],a(e,"res","data",!0),t.unshift("var ",Array.isArray?"isArr = Array.isArray":'toStr = Object.prototype.toString, isArr = function(o) { return toStr.call(o) === "[object Array]"; }',",",n.join(","),";","isArr(data) || (data = [data]);"),t.push("return res;"),t.join("")}function a(n,r,i,s){var o=n.parts,u=0,a=o.length,p=!0;t.push(r,"=",n.fromRoot?"data":i,";");while(u<a){var d=o[u++];switch(d.type){case e.SELECTOR:d.selector===".."?l(d,r,r):f(d,r,r),p=!0;break;case e.OBJ_PRED:c(d,r,r);break;case e.POS_PRED:p=h(d,r,r)!==!1||!s;break;case e.CONCAT_EXPR:b(d,r,r),p=!0}}p||t.push(r,"=",r,"[0];")}function f(e,n,r){if(e.prop){var i=w(e.prop),u=s(),a=s(),f=s(),l=s(),c=s(),h=s(),p=s();t.push(u,"= [],",a,"= 0,",f,"=",r,".length,",p,"= [];","while(",a,"<",f,") {",l,"=",r,"[",a,"++];","if(",l,"!= null) {"),e.prop==="*"?(t.push("if(typeof ",l,'=== "object") {',"if(isArr(",l,")) {",u,"=",u,".concat(",l,");","}","else {","for(",c," in ",l,") {","if(",l,".hasOwnProperty(",c,")) {",h,"=",l,"[",c,"];"),E(u,h),t.push("}","}","}","}")):(t.push(h,"=",l,"[",i,"];"),E(u,h,p,f)),t.push("}","}",n,"=",f,"> 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(e,n,r){var i=e.prop,u=s(),a=s(),f=s(),l=s(),c=s(),h=s(),p=s(),d=s();t.push(u,"=",r,".slice(),",d,"= [];","while(",u,".length) {",a,"=",u,".shift();"),i?t.push("if(typeof ",a,'=== "object" &&',a,") {"):t.push("if(typeof ",a,"!= null) {"),t.push(f,"= [];","if(isArr(",a,")) {",l,"= 0,",p,"=",a,".length;","while(",l,"<",p,") {",h,"=",a,"[",l,"++];"),i&&t.push("if(typeof ",h,'=== "object") {'),E(f,h),i&&t.push("}"),t.push("}","}","else {"),i?i!=="*"&&(t.push(h,"=",a,'["'+i+'"];'),E(d,h)):(E(d,a),t.push("if(typeof ",a,'=== "object") {')),t.push("for(",c," in ",a,") {","if(",a,".hasOwnProperty(",c,")) {",h,"=",a,"[",c,"];"),E(f,h),i==="*"&&E(d,h),t.push("}","}"),i||t.push("}"),t.push("}",f,".length &&",u,".unshift.apply(",u,",",f,");","}","}",n,"=",d,";"),o(u,a,f,l,c,h,p,d)}function c(e,n,r){var i=s(),u=s(),a=s(),f=s(),l=s();t.push(i,"= [];",u,"= 0;",a,"=",r,".length;","while(",u,"<",a,") {",l,"=",r,"[",u,"];"),p(e.arg,f,l),t.push(x(e.arg,f),"&&",i,".push(",l,");","++",u,";","}",n,"=",i,";"),o(i,u,a,l,f)}function h(e,n,r){var i=e.arg,u,a;if(i.idx){var f=s();return p(i.idx,f,r),t.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),t.push(n,"=",r,".slice(",u,", ",a,");"),o(u,a)):(p(i.fromIdx,u=s(),r),t.push(n,"=",r,".slice(",u,");"),o(u)):(p(i.toIdx,a=s(),r),t.push(n,"=",r,".slice(0, ",a,");"),o(a))}function p(n,r,i){switch(n.type){case e.PATH:var u=s();a(n,u,"["+i+"]"),t.push(r,"=",u,";"),o(u);break;case e.COMPARISON_EXPR:d(n,r,i);break;case e.MATH_EXPR:g(n,r,i);break;case e.LOGICAL_EXPR:m(n,r,i);break;case e.UNARY_EXPR:y(n,r,i);break;case e.LITERAL:var f=n.val;switch(typeof f){case"string":t.push(r,"=",w(f),";");break;default:t.push(r,"=",f,";")}break;case e.SUBST:t.push(r,"= subst.",n.name,";")}}function d(n,r,i){var u=s(),a=s(),f=s(),l=s(),c=s(),h=s(),d=s(),m=s(),g=n.args[0],y=n.args[1];t.push(r,"= false;"),p(g,u,i),p(y,a,i);var b=g.type===e.PATH,w=y.type===e.LITERAL;t.push(f,"="),b?t.push("true;"):t.push("isArr(",u,");"),t.push(l,"="),w?t.push("false;"):t.push("isArr(",a,");"),t.push("if("),b||t.push(f,"&&"),t.push(u,".length === 1) {",u,"=",u,"[0];",f,"= false;","}"),w||t.push("if(",l,"&&",a,".length === 1) {",a,"=",a,"[0];",l,"= false;","}"),t.push(c,"= 0;","if(",f,") {",d,"=",u,".length;"),w||(t.push("if(",l,") {",m,"=",a,".length;","while(",c,"<",d,"&& !",r,") {",h,"= 0;","while(",h,"<",m,") {"),v(n.op,[u,"[",c,"]"].join(""),[a,"[",h,"]"].join("")),t.push(r,"= true;","break;","}","++",h,";","}","++",c,";","}","}","else {")),t.push("while(",c,"<",d,") {"),v(n.op,[u,"[",c,"]"].join(""),a),t.push(r,"= true;","break;","}","++",c,";","}"),w||t.push("}"),t.push("}"),w||(t.push("else if(",l,") {",m,"=",a,".length;","while(",c,"<",m,") {"),v(n.op,u,[a,"[",c,"]"].join("")),t.push(r,"= true;","break;","}","++",c,";","}","}")),t.push("else {",r,"=",N[n.op](u,a),";","}"),o(u,a,f,l,c,h,d,m)}function v(e,n,r){t.push("if(",N[e](n,r),") {")}function m(e,n,r){var i=[],u=e.args,a=u.length,f=0,l;t.push(n,"= false;");switch(e.op){case"&&":while(f<a)i.push(l=s()),p(u[f],l,r),t.push("if(",x(u[f++],l),") {");t.push(n,"= true;");break;case"||":while(f<a)i.push(l=s()),p(u[f],l,r),t.push("if(",x(u[f],l),") {",n,"= true;","}"),f++ +1<a&&t.push("else {");--a}while(a--)t.push("}");o.apply(null,i)}function g(e,n,r){var i=s(),u=s(),a=e.args;p(a[0],i,r),p(a[1],u,r),t.push(n,"=",N[e.op](T(a[0],i),T(a[1],u)),";"),o(i,u)}function y(e,n,r){var i=s(),u=e.arg;p(u,i,r);switch(e.op){case"!":t.push(n,"= !",x(u,i)+";");break;case"-":t.push(n,"= -",T(u,i)+";")}o(i)}function b(e,n,r){var i=[],u=e.args,f=u.length,l=0;while(l<f)i.push(s()),a(u[l],i[l++],r);t.push(n,"= (",n,"= []).concat.call(",n,",",i.join(","),");"),o.apply(null,i)}function w(e){return"'"+e.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'"}function E(e,n,r,i){t.push("if(",n,"!= null) {","if(isArr(",n,")) {"),r&&(t.push(i,"> 1?"),S(r,n),t.push(":")),t.push(e,"=",e,".concat(",n,");","}","else {"),r&&t.push("if(",r,".length) {",e,"=",e,".concat.apply(",e,",",r,");",r,"= [];","}"),S(e,n),t.push("}","}")}function S(e,n){t.push(e,".length?",e,".push(",n,") :",e,"[0] = ",n)}function x(t,n){switch(t.type){case e.LOGICAL_EXPR:return n;case e.LITERAL:return"!!"+n;case e.PATH:return n+".length > 0";default:return["(typeof ",n,'=== "boolean"?',n,":","isArr(",n,")?",n,".length > 0 : !!",n,")"].join("")}}function T(t,n){switch(t.type){case e.LITERAL:return n;case e.PATH:return n+"[0]";default:return["(isArr(",n,")?",n,"[0] : ",n,")"].join("")}}var t,n,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}};return u}(),i={},s=[],o={cacheSize:100},u={cacheSize:function(e,t){if(t<e&&s.length>t){var n=s.splice(0,s.length-t),r=n.length;while(r--)delete i[n[r]]}}},a=function(e,t,n){return i[e]||(i[e]=r(e),s.push(e)>o.cacheSize&&delete i[s.shift()]),i[e](t,n||{})};a.version="0.2.9",a.params=function(e){if(!arguments.length)return o;for(var t in e)e.hasOwnProperty(t)&&(u[t]&&u[t](o[t],e[t]),o[t]=e[t])},a.compile=r,a.apply=a,typeof exports=="object"?module.exports=a:typeof define=="function"?define(function(e,t,n){n.exports=a}):JSPath=a})();
\No newline at end of file