diff options
| author | Tristan Zur <tzur@web.web.ccwn.org> | 2014-03-27 22:27:47 +0100 |
|---|---|---|
| committer | Tristan Zur <tzur@web.web.ccwn.org> | 2014-03-27 22:27:47 +0100 |
| commit | b62676ca5d3d6f6ba3f019ea3f99722e165a98d8 (patch) | |
| tree | 86722cb80f07d4569f90088eeaea2fc2f6e2ef94 /js/dojo-1.6/dojox/jsonPath | |
Diffstat (limited to 'js/dojo-1.6/dojox/jsonPath')
| -rw-r--r-- | js/dojo-1.6/dojox/jsonPath/README | 126 | ||||
| -rw-r--r-- | js/dojo-1.6/dojox/jsonPath/query.js | 170 | ||||
| -rw-r--r-- | js/dojo-1.6/dojox/jsonPath/query.xd.js | 174 |
3 files changed, 470 insertions, 0 deletions
diff --git a/js/dojo-1.6/dojox/jsonPath/README b/js/dojo-1.6/dojox/jsonPath/README new file mode 100644 index 0000000..a37dec6 --- /dev/null +++ b/js/dojo-1.6/dojox/jsonPath/README @@ -0,0 +1,126 @@ +------------------------------------------------------------------------------- +dojox.jsonPath +------------------------------------------------------------------------------- +Version 1.0 +Release date: 11/14/2007 +------------------------------------------------------------------------------- +Project state: beta +------------------------------------------------------------------------------- +Project authors + Dustin Machi + Kris Zyp +------------------------------------------------------------------------------- +Project description + +jsonPath is a query system similar in idea to xpath, but for use against +javascript objects. This code is a port of the jsonPath code at +http://code.google.com/p/jsonpath/. It was contributed under CLA by Stefan +Goessner. Thanks Stefan! + +------------------------------------------------------------------------------- +Dependencies: + +Dojo Core (package loader). +------------------------------------------------------------------------------- +Documentation + +Usage: + +var matches = dojox.jsonPath.query(objectToQuery, jsonPathExpresson) + +Expressions: + + $ The Root Object + @ The current object/element + . or [] The child operator + .. Recursive descent + * all objects + [] subscript operator + [,] Union operator + [start:end:step] array slice operator + ?() applies a filter/script expression + () script expresions + + some examples: + + Given the following test data set: + + var json = + { "store": { + "book": [ + { "category": "reference", + "author": "Nigel Rees", + "title": "Sayings of the Century", + "price": 8.95 + }, + { "category": "fiction", + "author": "Evelyn Waugh", + "title": "Sword of Honour", + "price": 12.99 + }, + { "category": "fiction", + "author": "Herman Melville", + "title": "Moby Dick", + "isbn": "0-553-21311-3", + "price": 8.99 + }, + { "category": "fiction", + "author": "J. R. R. Tolkien", + "title": "The Lord of the Rings", + "isbn": "0-395-19395-8", + "price": 22.99 + } + ], + "bicycle": { + "color": "red", + "price": 19.95 + } + } + }; + + Here are some example queries and their output: + + $.store.book[*].author + ["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"] + + $..author + ["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"] + + $.store.* + [[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],{"color":"red","price":19.95}] + + $.store..price + [8.95,12.99,8.99,22.99,19.95] + + $..book[(@.length-1)] + [{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}] + + $..book[-1] + [{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}] + + $..book[0,1] + [{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}] + + $..book[:2] + [{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}] + + $..book[?(@.isbn)] + [{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}] + + $..book[?(@.price<10)] + [{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}] + + $..* + [{"book":[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],"bicycle":{"color":"red","price":19.95}},[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],{"color":"red","price":19.95},{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99},"reference","Nigel Rees","Sayings of the Century",8.95,"fiction","Evelyn Waugh","Sword of Honour",12.99,"fiction","Herman Melville","Moby Dick","0-553-21311-3",8.99,"fiction","J. R. R. Tolkien","The Lord of the Rings","0-395-19395-8",22.99,"red",19.95] + + +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/jsonPath + +Install into the following directory structure: +/dojox/jsonPath/ + +...which should be at the same level as your Dojo checkout. diff --git a/js/dojo-1.6/dojox/jsonPath/query.js b/js/dojo-1.6/dojox/jsonPath/query.js new file mode 100644 index 0000000..0c8d492 --- /dev/null +++ b/js/dojo-1.6/dojox/jsonPath/query.js @@ -0,0 +1,170 @@ +/*
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
+ Available via Academic Free License >= 2.1 OR the modified BSD license.
+ see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.jsonPath.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.jsonPath.query"] = true;
+dojo.provide("dojox.jsonPath.query");
+
+dojox.jsonPath.query = function(/*Object*/obj, /*String*/expr, /*Object*/arg){
+ // summaRy
+ // Perform jsonPath query `expr` on javascript object or json string `obj`
+ // obj - object || json string to perform query on
+ // expr - jsonPath expression (string) to be evaluated
+ // arg - {}special arugments.
+ // resultType: "VALUE"||"BOTH"||"PATH"} (defaults to value)
+ // evalType: "RESULT"||"ITEM"} (defaults to ?)
+
+ var re = dojox.jsonPath._regularExpressions;
+ if (!arg){arg={};}
+
+ var strs = [];
+ function _str(i){ return strs[i];}
+ var acc;
+ if (arg.resultType == "PATH" && arg.evalType == "RESULT") throw Error("RESULT based evaluation not supported with PATH based results");
+ var P = {
+ resultType: arg.resultType || "VALUE",
+ normalize: function(expr){
+ var subx = [];
+ expr = expr.replace(/'([^']|'')*'/g, function(t){return "_str("+(strs.push(eval(t))-1)+")";});
+ var ll = -1;
+ while(ll!=subx.length){
+ ll=subx.length;//TODO: Do expression syntax checking
+ expr = expr.replace(/(\??\([^\(\)]*\))/g, function($0){return "#"+(subx.push($0)-1);});
+ }
+ expr = expr.replace(/[\['](#[0-9]+)[\]']/g,'[$1]')
+ .replace(/'?\.'?|\['?/g, ";")
+ .replace(/;;;|;;/g, ";..;")
+ .replace(/;$|'?\]|'$/g, "");
+ ll = -1;
+ while(ll!=expr){
+ ll=expr;
+ expr = expr.replace(/#([0-9]+)/g, function($0,$1){return subx[$1];});
+ }
+ return expr.split(";");
+ },
+ asPaths: function(paths){
+ for (var j=0;j<paths.length;j++){
+ var p = "$";
+ var x= paths[j];
+ for (var i=1,n=x.length; i<n; i++)
+ p += /^[0-9*]+$/.test(x[i]) ? ("["+x[i]+"]") : ("['"+x[i]+"']");
+ paths[j]=p;
+ }
+ return paths;
+ },
+ exec: function(locs, val, rb){
+ var path = ['$'];
+ var result=rb?val:[val];
+ var paths=[path];
+ function add(v, p,def){
+ if (v && v.hasOwnProperty(p) && P.resultType != "VALUE") paths.push(path.concat([p]));
+ if (def)
+ result = v[p];
+ else if (v && v.hasOwnProperty(p))
+ result.push(v[p]);
+ }
+ function desc(v){
+ result.push(v);
+ paths.push(path);
+ P.walk(v,function(i){
+ if (typeof v[i] ==='object') {
+ var oldPath = path;
+ path = path.concat(i);
+ desc(v[i]);
+ path = oldPath;
+ }
+ });
+ }
+ function slice(loc, val){
+ if (val instanceof Array){
+ var len=val.length, start=0, end=len, step=1;
+ loc.replace(/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/g, function($0,$1,$2,$3){start=parseInt($1||start);end=parseInt($2||end);step=parseInt($3||step);});
+ start = (start < 0) ? Math.max(0,start+len) : Math.min(len,start);
+ end = (end < 0) ? Math.max(0,end+len) : Math.min(len,end);
+ for (var i=start; i<end; i+=step)
+ add(val,i);
+ }
+ }
+ function repStr(str){
+ var i=loc.match(/^_str\(([0-9]+)\)$/);
+ return i?strs[i[1]]:str;
+ }
+ function oper(val){
+ if (/^\(.*?\)$/.test(loc)) // [(expr)]
+ add(val, P.eval(loc, val),rb);
+ else if (loc === "*"){
+ P.walk(val, rb && val instanceof Array ? // if it is result based, there is no point to just return the same array
+ function(i){P.walk(val[i],function(j){ add(val[i],j); })} :
+ function(i){ add(val,i); });
+ }
+ else if (loc === "..")
+ desc(val);
+ else if (/,/.test(loc)){ // [name1,name2,...]
+ for (var s=loc.split(/'?,'?/),i=0,n=s.length; i<n; i++)
+ add(val,repStr(s[i]));
+ }
+ else if (/^\?\(.*?\)$/.test(loc)) // [?(expr)]
+ P.walk(val, function(i){ if (P.eval(loc.replace(/^\?\((.*?)\)$/,"$1"),val[i])) add(val,i); });
+ else if (/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(loc)) // [start:end:step] python slice syntax
+ slice(loc, val);
+ else {
+ loc=repStr(loc);
+ if (rb && val instanceof Array && !/^[0-9*]+$/.test(loc))
+ P.walk(val, function(i){ add(val[i], loc)});
+ else
+ add(val,loc,rb);
+ }
+
+ }
+ while (locs.length){
+ var loc = locs.shift();
+ if ((val = result) === null || val===undefined) return val;
+ result = [];
+ var valPaths = paths;
+ paths = [];
+ if (rb)
+ oper(val)
+ else
+ P.walk(val,function(i){path=valPaths[i]||path;oper(val[i])});
+ }
+ if (P.resultType == "BOTH"){
+ paths = P.asPaths(paths);
+ var newResult = [];
+ for (var i =0;i <paths.length;i++)
+ newResult.push({path:paths[i],value:result[i]});
+ return newResult;
+ }
+ return P.resultType == "PATH" ? P.asPaths(paths):result;
+ },
+ walk: function(val, f){
+ if (val instanceof Array){
+ for (var i=0,n=val.length; i<n; i++)
+ if (i in val)
+ f(i);
+ }
+ else if (typeof val === "object"){
+ for (var m in val)
+ if (val.hasOwnProperty(m))
+ f(m);
+ }
+ },
+ eval: function(x, _v){
+ try { return $ && _v && eval(x.replace(/@/g,'_v')); }
+ catch(e){ throw new SyntaxError("jsonPath: " + e.message + ": " + x.replace(/@/g, "_v").replace(/\^/g, "_a")); }
+ }
+ };
+
+ var $ = obj;
+ if (expr && obj){
+ return P.exec(P.normalize(expr).slice(1), obj, arg.evalType == "RESULT");
+ }
+
+ return false;
+
+};
+
+}
diff --git a/js/dojo-1.6/dojox/jsonPath/query.xd.js b/js/dojo-1.6/dojox/jsonPath/query.xd.js new file mode 100644 index 0000000..7d766a5 --- /dev/null +++ b/js/dojo-1.6/dojox/jsonPath/query.xd.js @@ -0,0 +1,174 @@ +/*
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
+ Available via Academic Free License >= 2.1 OR the modified BSD license.
+ see: http://dojotoolkit.org/license for details
+*/
+
+
+dojo._xdResourceLoaded(function(dojo, dijit, dojox){
+return {depends: [["provide", "dojox.jsonPath.query"]],
+defineResource: function(dojo, dijit, dojox){if(!dojo._hasResource["dojox.jsonPath.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.jsonPath.query"] = true;
+dojo.provide("dojox.jsonPath.query");
+
+dojox.jsonPath.query = function(/*Object*/obj, /*String*/expr, /*Object*/arg){
+ // summaRy
+ // Perform jsonPath query `expr` on javascript object or json string `obj`
+ // obj - object || json string to perform query on
+ // expr - jsonPath expression (string) to be evaluated
+ // arg - {}special arugments.
+ // resultType: "VALUE"||"BOTH"||"PATH"} (defaults to value)
+ // evalType: "RESULT"||"ITEM"} (defaults to ?)
+
+ var re = dojox.jsonPath._regularExpressions;
+ if (!arg){arg={};}
+
+ var strs = [];
+ function _str(i){ return strs[i];}
+ var acc;
+ if (arg.resultType == "PATH" && arg.evalType == "RESULT") throw Error("RESULT based evaluation not supported with PATH based results");
+ var P = {
+ resultType: arg.resultType || "VALUE",
+ normalize: function(expr){
+ var subx = [];
+ expr = expr.replace(/'([^']|'')*'/g, function(t){return "_str("+(strs.push(eval(t))-1)+")";});
+ var ll = -1;
+ while(ll!=subx.length){
+ ll=subx.length;//TODO: Do expression syntax checking
+ expr = expr.replace(/(\??\([^\(\)]*\))/g, function($0){return "#"+(subx.push($0)-1);});
+ }
+ expr = expr.replace(/[\['](#[0-9]+)[\]']/g,'[$1]')
+ .replace(/'?\.'?|\['?/g, ";")
+ .replace(/;;;|;;/g, ";..;")
+ .replace(/;$|'?\]|'$/g, "");
+ ll = -1;
+ while(ll!=expr){
+ ll=expr;
+ expr = expr.replace(/#([0-9]+)/g, function($0,$1){return subx[$1];});
+ }
+ return expr.split(";");
+ },
+ asPaths: function(paths){
+ for (var j=0;j<paths.length;j++){
+ var p = "$";
+ var x= paths[j];
+ for (var i=1,n=x.length; i<n; i++)
+ p += /^[0-9*]+$/.test(x[i]) ? ("["+x[i]+"]") : ("['"+x[i]+"']");
+ paths[j]=p;
+ }
+ return paths;
+ },
+ exec: function(locs, val, rb){
+ var path = ['$'];
+ var result=rb?val:[val];
+ var paths=[path];
+ function add(v, p,def){
+ if (v && v.hasOwnProperty(p) && P.resultType != "VALUE") paths.push(path.concat([p]));
+ if (def)
+ result = v[p];
+ else if (v && v.hasOwnProperty(p))
+ result.push(v[p]);
+ }
+ function desc(v){
+ result.push(v);
+ paths.push(path);
+ P.walk(v,function(i){
+ if (typeof v[i] ==='object') {
+ var oldPath = path;
+ path = path.concat(i);
+ desc(v[i]);
+ path = oldPath;
+ }
+ });
+ }
+ function slice(loc, val){
+ if (val instanceof Array){
+ var len=val.length, start=0, end=len, step=1;
+ loc.replace(/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/g, function($0,$1,$2,$3){start=parseInt($1||start);end=parseInt($2||end);step=parseInt($3||step);});
+ start = (start < 0) ? Math.max(0,start+len) : Math.min(len,start);
+ end = (end < 0) ? Math.max(0,end+len) : Math.min(len,end);
+ for (var i=start; i<end; i+=step)
+ add(val,i);
+ }
+ }
+ function repStr(str){
+ var i=loc.match(/^_str\(([0-9]+)\)$/);
+ return i?strs[i[1]]:str;
+ }
+ function oper(val){
+ if (/^\(.*?\)$/.test(loc)) // [(expr)]
+ add(val, P.eval(loc, val),rb);
+ else if (loc === "*"){
+ P.walk(val, rb && val instanceof Array ? // if it is result based, there is no point to just return the same array
+ function(i){P.walk(val[i],function(j){ add(val[i],j); })} :
+ function(i){ add(val,i); });
+ }
+ else if (loc === "..")
+ desc(val);
+ else if (/,/.test(loc)){ // [name1,name2,...]
+ for (var s=loc.split(/'?,'?/),i=0,n=s.length; i<n; i++)
+ add(val,repStr(s[i]));
+ }
+ else if (/^\?\(.*?\)$/.test(loc)) // [?(expr)]
+ P.walk(val, function(i){ if (P.eval(loc.replace(/^\?\((.*?)\)$/,"$1"),val[i])) add(val,i); });
+ else if (/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(loc)) // [start:end:step] python slice syntax
+ slice(loc, val);
+ else {
+ loc=repStr(loc);
+ if (rb && val instanceof Array && !/^[0-9*]+$/.test(loc))
+ P.walk(val, function(i){ add(val[i], loc)});
+ else
+ add(val,loc,rb);
+ }
+
+ }
+ while (locs.length){
+ var loc = locs.shift();
+ if ((val = result) === null || val===undefined) return val;
+ result = [];
+ var valPaths = paths;
+ paths = [];
+ if (rb)
+ oper(val)
+ else
+ P.walk(val,function(i){path=valPaths[i]||path;oper(val[i])});
+ }
+ if (P.resultType == "BOTH"){
+ paths = P.asPaths(paths);
+ var newResult = [];
+ for (var i =0;i <paths.length;i++)
+ newResult.push({path:paths[i],value:result[i]});
+ return newResult;
+ }
+ return P.resultType == "PATH" ? P.asPaths(paths):result;
+ },
+ walk: function(val, f){
+ if (val instanceof Array){
+ for (var i=0,n=val.length; i<n; i++)
+ if (i in val)
+ f(i);
+ }
+ else if (typeof val === "object"){
+ for (var m in val)
+ if (val.hasOwnProperty(m))
+ f(m);
+ }
+ },
+ eval: function(x, _v){
+ try { return $ && _v && eval(x.replace(/@/g,'_v')); }
+ catch(e){ throw new SyntaxError("jsonPath: " + e.message + ": " + x.replace(/@/g, "_v").replace(/\^/g, "_a")); }
+ }
+ };
+
+ var $ = obj;
+ if (expr && obj){
+ return P.exec(P.normalize(expr).slice(1), obj, arg.evalType == "RESULT");
+ }
+
+ return false;
+
+};
+
+}
+
+}};});
|
