1 |
|
2 |
|
3 |
|
4 | !function(exports, Object) {
|
5 |
|
6 | "use strict";
|
7 | var getFns = Object.create(null)
|
8 | , setFns = Object.create(null)
|
9 | , filterFns = Object.create(null)
|
10 | , KEYS = Object.keys
|
11 | , FILTER_ERR = "Invalid filter: "
|
12 | , escRe = /['\n\r\u2028\u2029]|\\(?!x2e)/g
|
13 | , pathRe = /(^$|[\s\S]+?)(?:(?:\[((?:\[[^\]]+\]|[^\]])*)\]|\{([^}]*)})(?:([*^])(.*))?)?(?:\.(?=([^.]))|(?:;(.+))?$)/g
|
14 | , pathArgs = "i,j,I,J,K,m,p,f,r,e,t"
|
15 | , pattRe = /(\w+)(?::((?:(['"\/])(?:\\\3|.)*?\3[gim]*|[^;])*))?/g
|
16 | , reEscRe = /[.+^=:${}()|\/\\]/g
|
17 | , keyRe = /\[(.*?)\]/g
|
18 | , globRe = /\[.+?\]|[?*]/
|
19 | , globReplace = /\?|(?=\*)/g
|
20 | , globGroup = /\[!(?=.*\])/g
|
21 | , primitiveRe = /^(-?(\d*\.)?\d+|true|false|null)$/
|
22 | , valRe = /("|')(?:\\\1|.)*?\1|(\w*)\{((?:("|')(?:\\\4|.)*?\4|\w*\{(?:("|')(?:\\\5|.)*?\5|[^}])*?\}|.)*?)\}|([@$]?)([^,]+)/g
|
23 | , filterRe = /(!?)(\$?)((?:[-+:.\/\w]|\[[^\]]+\]|\{[^}]+}|\\x2e)+)(\[]|\{}|)(?:(!(?=\1)==?|(?=\1)[<>=]=?)((?:("|')(?:\\\7|.)*?\7|\w*\{(?:("|')(?:\\\8|.)*?\8|\{(?:("|')(?:\\\9|.)*?\9|[^}])*?\}|.)*?\}|[^|&()])*))?(?=[;)|&]|$)|(([;&|])\11*|([()])|.)/g
|
24 | , onlyFilterRe = RegExp("^(?:([@*])|" + filterRe.source.slice(0, -10) + "))+$")
|
25 | , cleanRe = /(\(o=d\)&&(?!.*o=o).*)\(o=d\)&&/g
|
26 | , fns = {
|
27 | "==": "a==d",
|
28 | "===": "a===d",
|
29 | ">": "a<d",
|
30 | ">=": "a<=d",
|
31 | "<": "a>d",
|
32 | "<=": "a>=d",
|
33 | "~": "typeof d==='string'&&a.test(d)"
|
34 | }
|
35 | , fnMap = {
|
36 | w: "Day()||7",
|
37 | Y: "FullYear()%100",
|
38 | M: "Month()+1",
|
39 | D: "Date()",
|
40 | h: "Hours()",
|
41 | H: "Hours()%12||12",
|
42 | m: "Minutes()",
|
43 | s: "Seconds()",
|
44 | S: "Milliseconds()"
|
45 | }
|
46 | , hasOwn = fns.hasOwnProperty
|
47 | , tmpDate = new Date()
|
48 | , isArray = Array.isArray
|
49 |
|
50 | exports.clone = clone
|
51 | exports.matcher = matcher
|
52 | exports.get = function(obj, pointer, fallback) { return pathFn(pointer)(obj, fallback) }
|
53 | exports.isObject = isObject
|
54 | exports.mergePatch = mergePatch
|
55 | exports.set = function(obj, pointer, value) { return pathFn(pointer, true)(obj, value) }
|
56 | exports.setForm = setForm
|
57 | exports.tr = tr
|
58 |
|
59 | exports.get.str = pathStr
|
60 | matcher.re = filterRe
|
61 | matcher.str = filterStr
|
62 | matcher.valRe = valRe
|
63 |
|
64 | exports.ext = {
|
65 | num: function(str, dec) {
|
66 | var out = typeof str === "string" ? parseFloat(
|
67 | dec ?
|
68 | str.replace(dec, "\ufdff").replace(/[^-e\d\ufdff]/g, "").replace("\ufdff", ".") :
|
69 | str.replace(/[^-e\d.]/g, "")
|
70 | ) : NaN
|
71 | return out === out ? out : null
|
72 | },
|
73 | date: Date.parse
|
74 | }
|
75 |
|
76 | function quote(str) {
|
77 | return "'" + (str || "").replace(escRe, escFn) + "'"
|
78 | }
|
79 |
|
80 | |
81 |
|
82 |
|
83 |
|
84 |
|
85 | function mergePatch(target, patch, changed, previous, pointer) {
|
86 | var undef, key, oldVal, val, len, nextPointer
|
87 | if (isObject(patch)) {
|
88 | if (!pointer) {
|
89 | pointer = ""
|
90 | }
|
91 | if (!isObject(target)) {
|
92 | target = {}
|
93 | }
|
94 | for (key in patch) if (
|
95 | undef !== (oldVal = target[key], val = patch[key]) &&
|
96 | hasOwn.call(patch, key) &&
|
97 | (
|
98 | undef == val ?
|
99 | undef !== oldVal && delete target[key] :
|
100 | target[key] !== val
|
101 | )
|
102 | ) {
|
103 | nextPointer = pointer + "/" + key.replace(/~/g, "~0").replace(/\//g, "~1")
|
104 | len = changed && isObject(target[key]) && changed.length
|
105 | if (undef != val) {
|
106 | target[key] = mergePatch(target[key], val, changed, previous, nextPointer)
|
107 | }
|
108 | if (len === false || changed && len != changed.length) {
|
109 | changed.push(nextPointer)
|
110 | if (previous && !isObject(oldVal)) {
|
111 | previous[nextPointer] = oldVal
|
112 | }
|
113 | }
|
114 | }
|
115 | } else {
|
116 | if (changed && isObject(target)) {
|
117 | val = {}
|
118 | for (key in target) if (hasOwn.call(target, key)) {
|
119 | val[key] = null
|
120 | }
|
121 | mergePatch(target, val, changed, previous, pointer)
|
122 | }
|
123 | target = patch
|
124 | }
|
125 | return target
|
126 | }
|
127 |
|
128 | function escFn(str) {
|
129 | return escape(str).replace(/%u/g, "\\u").replace(/%/g, "\\x")
|
130 | }
|
131 |
|
132 | function pathStr(str, set) {
|
133 | return (
|
134 | str.charAt(0) === "/" ?
|
135 | str.slice(1).replace(/\./g, "\\x2e").replace(/\//g, ".").replace(/~1/g, "/").replace(/~0/g, "~") :
|
136 | str
|
137 | )
|
138 | .replace(pathRe, set === true ? pathSet : pathGet)
|
139 | }
|
140 |
|
141 | function pathGet(str, path, arr, obj, arrExt, arrSup, dot, ext) {
|
142 | var v = dot ? "(o=" : "(c="
|
143 | , sub = arr || obj
|
144 | if (sub && !(sub = onlyFilterRe.exec(sub))) throw Error(FILTER_ERR + str)
|
145 | v = (
|
146 | sub ?
|
147 | pathGet(0, path, 0, 0, 0, 0, 1) + (arr ? "i" : "j") + "(o)&&" + v + (
|
148 | arrExt ? "f(o,m(" + quote(sub[0]) + ")" + (
|
149 | arrSup ? (arrExt === "*" ? ",p(" : ",r(") + quote(arrSup) + "))" : ")"
|
150 | ) :
|
151 | sub[1] ? (arr ? "o" : "K(o)") + (sub[0] === "*" ? "" : ".length") :
|
152 | +arr == arr ? "o[" + (arr < 0 ? "o.length" + arr : arr) + "]" :
|
153 | sub[0].charAt(0) === "@" ? "o[p(" + quote(sub[0].slice(1)) + ")(d)]" :
|
154 | (arr ? "I" : "J") + "(o,m(" + quote(sub[0]) + "))"
|
155 | ) + ")" :
|
156 | v + "o[" + quote(path) + "])" + (
|
157 | arr === "" ? "&&i(c)&&c" :
|
158 | obj === "" ? "&&j(c)&&c" :
|
159 | ""
|
160 | )
|
161 | ) + (dot ? "&&" : "")
|
162 | if (ext) for (; sub = pattRe.exec(ext); ) {
|
163 | v = "(c=e." + sub[1] + "(" + v + (sub[2] ? "," + sub[2] : "") + "))"
|
164 | }
|
165 | return v
|
166 | }
|
167 |
|
168 | function pathSet(str, path, arr, obj, arrExt, arrSup, dot) {
|
169 | var op = "o[" + quote(path) + "]"
|
170 | , out = ""
|
171 | , sub = arr || obj
|
172 | if (sub) {
|
173 | out = "(o=" + (arr ? "i(" : "j(") + op + ")?" + op + ":(" + op + (arr ? "=[]" : "={}") +"))&&"
|
174 | if (arr === "-") {
|
175 | op = "o[o.length]"
|
176 | } else if (+arr == arr) {
|
177 | op = "o[" + (arr < 0 ? "o.length" + arr : arr) + "]"
|
178 | } else if (sub.charAt(0) === "@") {
|
179 | op = "o[p(" + quote(sub.slice(1)) + ")(d)]"
|
180 | } else {
|
181 | if (!onlyFilterRe.test(arr)) throw Error(FILTER_ERR + str)
|
182 | op = "o[t]"
|
183 | out += "(t=" + (arr ? "I" : "J") + "(o,m(" + quote(sub) + "),1))!=null&&"
|
184 | }
|
185 | }
|
186 | return out + (dot ?
|
187 | "(o=typeof " + op + "==='object'&&" + op + "||(" + op + "={}))&&" :
|
188 | "((c=" + op + "),(" + op + "=v),c)"
|
189 | )
|
190 | }
|
191 |
|
192 | function pathFn(str, set) {
|
193 | var map = set === true ? setFns : getFns
|
194 | return map[str] || (map[str] = Function(
|
195 | pathArgs,
|
196 | "return function(d,v,b){var c,o;return (o=d)&&" +
|
197 | pathStr(str, set) +
|
198 | (set ? ",c}": "!==void 0?c:v}")
|
199 | )(isArray, isObject, inArray, inObject, KEYS, matcher, pathFn, filterObj, tr, exports.ext))
|
200 | }
|
201 |
|
202 | function clone(obj) {
|
203 | var temp, key
|
204 | if (obj && typeof obj == "object") {
|
205 |
|
206 | temp = obj instanceof Date ? new Date(+obj) :
|
207 | obj instanceof RegExp ? RegExp(obj.source, (""+obj).split("/").pop()) :
|
208 | obj.constructor()
|
209 | for (key in obj) if (hasOwn.call(obj, key)) {
|
210 | temp[key] = clone(obj[key])
|
211 | }
|
212 | obj = temp
|
213 | }
|
214 | return obj
|
215 | }
|
216 |
|
217 | function matcher(str, prefix, opts, getter, tmp) {
|
218 | var optimized
|
219 | , arr = []
|
220 | , key = (prefix || "") + (fns[str] || filterStr(str, opts, arr, getter))
|
221 | , fn = filterFns[key]
|
222 | if (!fn) {
|
223 | for (optimized = key; optimized != (optimized = optimized.replace(cleanRe, "$1")); );
|
224 | fn = filterFns[key] = Function(
|
225 | fns[str] ? "a" : "a," + pathArgs,
|
226 | "return function(d,b){var o;return " + optimized + "}"
|
227 | )
|
228 | fn.source = optimized
|
229 | }
|
230 | return fns[str] ? fn : fn(
|
231 | arr, isArray, isObject, inArray, inObject, KEYS, matcher, pathFn, filterObj, tr, exports.ext, tmp
|
232 | )
|
233 | }
|
234 |
|
235 |
|
236 |
|
237 |
|
238 |
|
239 |
|
240 |
|
241 |
|
242 |
|
243 |
|
244 | matcher.date = function(str) {
|
245 | return matcher(str, "(t.setTime(typeof d==='string'?Date.parse(d):+d)>=0)&&", null, dateGetter, tmpDate)
|
246 | }
|
247 |
|
248 | function dateGetter(name) {
|
249 | return "(t.get" + fnMap[name] + ")"
|
250 | }
|
251 |
|
252 | function filterStr(qs, opts, arr, getter) {
|
253 | return qs.replace(filterRe, worker).replace(/^[1&]&+|&+1?$/g, "") || "1"
|
254 |
|
255 | function worker(all, not, isOption, attr, isArray, op, val, q1, q2, q3, ext, ok2, ok1) {
|
256 | if (ext) {
|
257 | if (!ok2 && !ok1) {
|
258 | throw Error(FILTER_ERR + qs)
|
259 | }
|
260 | return ok1 ? ok1 : ok2 == ";" ? "&&" : ok2 + ok2
|
261 | }
|
262 | if (isOption) {
|
263 | if (opts) opts[attr] = val
|
264 | return "1"
|
265 | }
|
266 |
|
267 | var idd, m, v, isRe
|
268 | , a = []
|
269 | , pre = "(o=d)&&"
|
270 |
|
271 | attr = (getter || pathStr)(attr)
|
272 |
|
273 | if (m = attr.match(/\(c=(.*?)\)$/)) {
|
274 | if (m[1] == "K(o)") {
|
275 | pre += attr + "&&"
|
276 | attr = "c"
|
277 | } else {
|
278 | if (m.index) pre += attr.slice(0, m.index)
|
279 | attr = m[1]
|
280 | }
|
281 | }
|
282 |
|
283 | if (op == "!=" || op == "!==") {
|
284 | not = "!"
|
285 | op = op.slice(1)
|
286 | }
|
287 | if (isArray) {
|
288 | pre += not + (isArray === "[]" ? "i(" : "j(") + attr + ")"
|
289 | }
|
290 |
|
291 | if (!op) {
|
292 | return isArray === "" ? pre + not + attr : pre
|
293 | }
|
294 |
|
295 | if (op == "=" || op == "==") op += "="
|
296 | if (val === "") val="''"
|
297 | for (; m = valRe.exec(val); ) {
|
298 |
|
299 |
|
300 | isRe = 0
|
301 | v = m[6] == "$" ? "b['"+ m[7] +"']" : arrIdx(arr,
|
302 | m[1] || m[3] ? m[0].slice(m[3] ? m[2].length + 1 : 1, -1) :
|
303 | m[6] ? m[7] :
|
304 | primitiveRe.test(m[0]) ? exports.parse(m[0]) :
|
305 | (isRe = globRe.test(m[0])) ? RegExp(
|
306 | "^" + m[0]
|
307 | .replace(reEscRe, "\\$&")
|
308 | .replace(globReplace, ".")
|
309 | .replace(globGroup, "[^") + "$",
|
310 | op === "==" ? "i" : ""
|
311 | ) :
|
312 | m[0]
|
313 | )
|
314 | idd = (
|
315 | m[2] ? "m." + m[2].toLowerCase() :
|
316 | m[3] ? "m" :
|
317 | isArray || attr === "c" ? arrIdx(arr, matcher(isRe ? "~" : op)) :
|
318 | ""
|
319 | ) + "(" + v
|
320 | a.push(
|
321 | isArray || attr === "c" ? (isArray == "{}" ? "J(" : "I(") + attr + "," + idd + "))" :
|
322 | m[2] || m[3] ? idd + ")(" + attr + ")" :
|
323 | isRe ? "typeof " + attr + "==='string'&&" + v + ".test(" + attr + ")" :
|
324 | m[6] ? attr + "!==void 0&&" + attr + op + (
|
325 | m[6] == "$" ? "b['"+ m[7] +"']" : "p(" + v + ")(o)"
|
326 | ) :
|
327 | attr + op + v
|
328 | )
|
329 | }
|
330 |
|
331 | return pre + (
|
332 | isArray ? (not ? "||" : "&&") : ""
|
333 | ) + not + "(" + a.join("||") + ")"
|
334 | }
|
335 | }
|
336 |
|
337 | function arrIdx(arr, val) {
|
338 | for (
|
339 | var i = arr.length;
|
340 | 0 <= --i && !(
|
341 | arr[i] === val ||
|
342 | val && val.source && val.source === arr[i].source
|
343 | );
|
344 | );
|
345 | return "a[" + (-1 < i ? i : arr.push(val) - 1) + "]"
|
346 | }
|
347 |
|
348 | function setForm(map, key_, val) {
|
349 | for (var match, key = key_, step = map; match = keyRe.exec(key_); ) {
|
350 | if (step === map) key = key.slice(0, match.index)
|
351 | match = match[1]
|
352 | step = step[key] || (
|
353 | step[key] = match && +match != match ? {} : []
|
354 | )
|
355 | key = match
|
356 | }
|
357 | if (isArray(step)) {
|
358 | step.push(val)
|
359 | } else if (isArray(step[key])) {
|
360 | step[key].push(val)
|
361 | } else {
|
362 | step[key] = step[key] != null ? [step[key], val] : val
|
363 | }
|
364 | }
|
365 |
|
366 | function tr(attrs, aclFn) {
|
367 | var attr, tmp
|
368 | , arr = []
|
369 | , map = {}
|
370 | , i = 0
|
371 | for (; attr = valRe.exec(attrs); ) {
|
372 | tmp = attr[0].split(":")
|
373 | exports.set(map, tmp[0], i)
|
374 | arr[i++] = pathFn(tmp[1] ? attr[0].slice(tmp[0].length+1) : tmp[0])
|
375 | }
|
376 | return Function(
|
377 | "g,a",
|
378 | "return function(o,a){return " +
|
379 | exports.stringify(map).replace(/:(\d+)/g,":g[$1](o)") + "}"
|
380 | )(arr, aclFn)
|
381 | }
|
382 |
|
383 | function isObject(obj) {
|
384 | return !!obj && obj.constructor === Object
|
385 | }
|
386 |
|
387 | function inArray(a, fn, idx) {
|
388 | for (var i = -1, len = a.length; ++i < len; ) {
|
389 | if (fn(a[i])) return idx == null ? a[i] : i
|
390 | }
|
391 | return idx != null && len
|
392 | }
|
393 |
|
394 | function inObject(o, fn, idx) {
|
395 | for (var key in o) {
|
396 | if (fn(o[key])) return idx == null ? o[key] : key
|
397 | }
|
398 | return null
|
399 | }
|
400 |
|
401 | function filterObj(a, match, get) {
|
402 | var out = []
|
403 | , i = -1
|
404 | , len = a.length
|
405 | if (isObject(a)) {
|
406 | for (i in a) if (hasOwn.call(a, i) && match(a[i])) {
|
407 | out.push(get ? get(a[i]) : a[i])
|
408 | }
|
409 | } else {
|
410 | for (; ++i < len; ) if (match(a[i])) {
|
411 | out.push(get ? get(a[i]) : a[i])
|
412 | }
|
413 | }
|
414 | return out
|
415 | }
|
416 | // `this` refers to the `window` in browser and to the `exports` in Node.js.
|
417 | }(JSON, Object) // jshint ignore:line
|
418 |
|
419 |
|