-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathobjektivity.js
114 lines (96 loc) · 3.37 KB
/
objektivity.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
(function( window, undefined ) {
var objektivity = (function(){
var DEFAULT_SEP = '&;',
CLASS_MATCH = new RegExp('\\s(\[a-z|A-Z\]+)');
var objectClassName = function(object){
return CLASS_MATCH.exec(Object.prototype.toString.call(object))[1];
}
var unescape = function(s){
if(!s){ return s; }
return decodeURIComponent(s.replace(/\+/g, '%20'));
}
var parseQuery = function(queryString, d){
var params = {},
matcher = new RegExp("["+(d ? d : DEFAULT_SEP)+"] *"), //default regex /[&;] */
kvPairs = (queryString || '').split(matcher),
kvPair,
k,v;
for(var i=0, length=kvPairs.length; i < length; i++){
kvPair = kvPairs[i].split('=',2);
k = unescape(kvPair[0]);
v = unescape(kvPair[1]);
if(cur = params[k]){
if( objectClassName(params) === "Array" ){
params[k],push(v);
} else {
params[k] = [cur, v]
}
} else {
params[k] = v;
}
}
return params;
}
var parseNestedQuery = function(queryString, d){
var params = {},
matcher = new RegExp("["+(d ? d : DEFAULT_SEP)+"] *"), //default regex /[&;] */
kvPairs = (queryString || '').split(matcher),
kvPair,
k,v;
for(var i=0, length=kvPairs.length; i < length; i++){
kvPair = kvPairs[i].split('=',2);
k = unescape(kvPair[0]);
v = unescape(kvPair[1]);
normalize_params(params, k, v);
}
return params;
}
var matcherOne = new RegExp("^[\\[\\]]*([^\\[\\]]+)\\]*(.*)"),
matcherTwo = new RegExp("^\\[\\]\\[([^\\[\\]]+)\\]$"),
matcherThree = new RegExp("^\\[\\](.+)$"),
arrayMatcher = new RegExp("^\\[\\s*\\]$");
var normalize_params = function(params, name, v){
var kv = matcherOne.exec(name),
k = (kv && kv[1]) || '',
after = (kv && kv[2]) || '',
last;
if(k.length == 0) {
return;
}
if(after == ""){
params[k] = v;
} else if(arrayMatcher.test(after)){
params[k] || (params[k] = []);
if(!(objectClassName(params[k]) === "Array")){
throw "expected Array (got "+objectClassName(params[k])+") for param `"+k+"'";
}
params[k].push(v);
} else if( (child_key = matcherTwo.exec(after)) || (child_key = matcherThree.exec(after)) ){
child_key = child_key[1];
params[k] || (params[k] = []);
if( !(objectClassName(params[k]) === "Array") ){
throw "expected Array (got "+objectClassName(params[k])+") for param `"+k+"'";
}
last = params[k].length-1;
if( objectClassName(params[k][last]) === "Object" && !(params[k][last][child_key]) ){
normalize_params(params[k][last], child_key, v);
} else {
params[k].push( normalize_params({}, child_key, v) );
}
} else {
params[k] || (params[k] = {});
if(!(objectClassName(params[k]) === "Object")){
throw "expected Hash (got "+objectClassName(params[k])+") for param `"+k+"'";
}
params[k] = normalize_params(params[k], after, v)
}
return params;
}
return {
parseNestedQuery : parseNestedQuery,
parseQuery: parseQuery,
unescape : unescape
}
})();
window.objektivity = objektivity;
})(window);