Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dojox / jsonPath / query.js @ 13

History | View | Annotate | Download (3.71 KB)

1
/*
2
        Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
3
        Available via Academic Free License >= 2.1 OR the modified BSD license.
4
        see: http://dojotoolkit.org/license for details
5
*/
6

    
7

    
8
if(!dojo._hasResource["dojox.jsonPath.query"]){
9
dojo._hasResource["dojox.jsonPath.query"]=true;
10
dojo.provide("dojox.jsonPath.query");
11
dojox.jsonPath.query=function(_1,_2,_3){
12
var re=dojox.jsonPath._regularExpressions;
13
if(!_3){
14
_3={};
15
}
16
var _4=[];
17
function _5(i){
18
return _4[i];
19
};
20
var _6;
21
if(_3.resultType=="PATH"&&_3.evalType=="RESULT"){
22
throw Error("RESULT based evaluation not supported with PATH based results");
23
}
24
var P={resultType:_3.resultType||"VALUE",normalize:function(_7){
25
var _8=[];
26
_7=_7.replace(/'([^']|'')*'/g,function(t){
27
return "_str("+(_4.push(eval(t))-1)+")";
28
});
29
var ll=-1;
30
while(ll!=_8.length){
31
ll=_8.length;
32
_7=_7.replace(/(\??\([^\(\)]*\))/g,function($0){
33
return "#"+(_8.push($0)-1);
34
});
35
}
36
_7=_7.replace(/[\['](#[0-9]+)[\]']/g,"[$1]").replace(/'?\.'?|\['?/g,";").replace(/;;;|;;/g,";..;").replace(/;$|'?\]|'$/g,"");
37
ll=-1;
38
while(ll!=_7){
39
ll=_7;
40
_7=_7.replace(/#([0-9]+)/g,function($0,$1){
41
return _8[$1];
42
});
43
}
44
return _7.split(";");
45
},asPaths:function(_9){
46
for(var j=0;j<_9.length;j++){
47
var p="$";
48
var x=_9[j];
49
for(var i=1,n=x.length;i<n;i++){
50
p+=/^[0-9*]+$/.test(x[i])?("["+x[i]+"]"):("['"+x[i]+"']");
51
}
52
_9[j]=p;
53
}
54
return _9;
55
},exec:function(_a,_b,rb){
56
var _c=["$"];
57
var _d=rb?_b:[_b];
58
var _e=[_c];
59
function _f(v,p,def){
60
if(v&&v.hasOwnProperty(p)&&P.resultType!="VALUE"){
61
_e.push(_c.concat([p]));
62
}
63
if(def){
64
_d=v[p];
65
}else{
66
if(v&&v.hasOwnProperty(p)){
67
_d.push(v[p]);
68
}
69
}
70
};
71
function _10(v){
72
_d.push(v);
73
_e.push(_c);
74
P.walk(v,function(i){
75
if(typeof v[i]==="object"){
76
var _11=_c;
77
_c=_c.concat(i);
78
_10(v[i]);
79
_c=_11;
80
}
81
});
82
};
83
function _12(loc,val){
84
if(val instanceof Array){
85
var len=val.length,_13=0,end=len,_14=1;
86
loc.replace(/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/g,function($0,$1,$2,$3){
87
_13=parseInt($1||_13);
88
end=parseInt($2||end);
89
_14=parseInt($3||_14);
90
});
91
_13=(_13<0)?Math.max(0,_13+len):Math.min(len,_13);
92
end=(end<0)?Math.max(0,end+len):Math.min(len,end);
93
for(var i=_13;i<end;i+=_14){
94
_f(val,i);
95
}
96
}
97
};
98
function _15(str){
99
var i=loc.match(/^_str\(([0-9]+)\)$/);
100
return i?_4[i[1]]:str;
101
};
102
function _16(val){
103
if(/^\(.*?\)$/.test(loc)){
104
_f(val,P.eval(loc,val),rb);
105
}else{
106
if(loc==="*"){
107
P.walk(val,rb&&val instanceof Array?function(i){
108
P.walk(val[i],function(j){
109
_f(val[i],j);
110
});
111
}:function(i){
112
_f(val,i);
113
});
114
}else{
115
if(loc===".."){
116
_10(val);
117
}else{
118
if(/,/.test(loc)){
119
for(var s=loc.split(/'?,'?/),i=0,n=s.length;i<n;i++){
120
_f(val,_15(s[i]));
121
}
122
}else{
123
if(/^\?\(.*?\)$/.test(loc)){
124
P.walk(val,function(i){
125
if(P.eval(loc.replace(/^\?\((.*?)\)$/,"$1"),val[i])){
126
_f(val,i);
127
}
128
});
129
}else{
130
if(/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(loc)){
131
_12(loc,val);
132
}else{
133
loc=_15(loc);
134
if(rb&&val instanceof Array&&!/^[0-9*]+$/.test(loc)){
135
P.walk(val,function(i){
136
_f(val[i],loc);
137
});
138
}else{
139
_f(val,loc,rb);
140
}
141
}
142
}
143
}
144
}
145
}
146
}
147
};
148
while(_a.length){
149
var loc=_a.shift();
150
if((_b=_d)===null||_b===undefined){
151
return _b;
152
}
153
_d=[];
154
var _17=_e;
155
_e=[];
156
if(rb){
157
_16(_b);
158
}else{
159
P.walk(_b,function(i){
160
_c=_17[i]||_c;
161
_16(_b[i]);
162
});
163
}
164
}
165
if(P.resultType=="BOTH"){
166
_e=P.asPaths(_e);
167
var _18=[];
168
for(var i=0;i<_e.length;i++){
169
_18.push({path:_e[i],value:_d[i]});
170
}
171
return _18;
172
}
173
return P.resultType=="PATH"?P.asPaths(_e):_d;
174
},walk:function(val,f){
175
if(val instanceof Array){
176
for(var i=0,n=val.length;i<n;i++){
177
if(i in val){
178
f(i);
179
}
180
}
181
}else{
182
if(typeof val==="object"){
183
for(var m in val){
184
if(val.hasOwnProperty(m)){
185
f(m);
186
}
187
}
188
}
189
}
190
},eval:function(x,_19){
191
try{
192
return $&&_19&&eval(x.replace(/@/g,"_v"));
193
}
194
catch(e){
195
throw new SyntaxError("jsonPath: "+e.message+": "+x.replace(/@/g,"_v").replace(/\^/g,"_a"));
196
}
197
}};
198
var $=_1;
199
if(_2&&_1){
200
return P.exec(P.normalize(_2).slice(1),_1,_3.evalType=="RESULT");
201
}
202
return false;
203
};
204
}