PageSourceSearch

https://openstreetmap.cz/theme/js/lib-component-querystring.js?5ca6fbd3

js openstreetmap.cz collected 2026-10-01 11:52:53 UTC 2,697 bytes, 136 lines download raw bytes

1var querystring = {};
2
3/**
4 * Module dependencies.
5 */
6
7var trim = function (str) {
8    if (str.trim) return str.trim();
9    return str.replace(/^\s*|\s*$/g, '');
10};
11
12var toString = Object.prototype.toString;
13var type = function (val) {
14    switch (toString.call(val)) {
15        case '[object Date]':
16            return 'date';
17        case '[object RegExp]':
18            return 'regexp';
19        case '[object Arguments]':
20            return 'arguments';
21        case '[object Array]':
22            return 'array';
23        case '[object Error]':
24            return 'error';
25    }
26
27    if (val === null) return 'null';
28    if (val === undefined) return 'undefined';
29    if (val !== val) return 'nan';
30    if (val && val.nodeType === 1) return 'element';
31
32    val = val.valueOf
33        ? val.valueOf()
34        : Object.prototype.valueOf.apply(val)
35
36    return typeof val;
37};
38
39
40var pattern = /(\w+)\[(\d+)\]/
41
42/**
43 * Safely encode the given string
44 *
45 * @param {String} str
46 * @return {String}
47 * @api private
48 */
49
50var encode = function (str) {
51    try {
52        return encodeURIComponent(str);
53    } catch (e) {
54        return str;
55    }
56};
57
58/**
59 * Safely decode the string
60 *
61 * @param {String} str
62 * @return {String}
63 * @api private
64 */
65
66var decode = function (str) {
67    try {
68        return decodeURIComponent(str.replace(/\+/g, ' '));
69    } catch (e) {
70        return str;
71    }
72};
73
74/**
75 * Parse the given query `str`.
76 *
77 * @param {String} str
78 * @return {Object}
79 * @api public
80 */
81
82querystring.parse = function (str) {
83    if ('string' != typeof str) return {};
84
85    str = trim(str);
86    if ('' == str) return {};
87    if ('?' == str.charAt(0)) str = str.slice(1);
88
89    var obj = {};
90    var pairs = str.split('&');
91    for (var i = 0; i < pairs.length; i++) {
92        var parts = pairs[i].split('=');
93        var key = decode(parts[0]);
94        var m;
95
96        if (m = pattern.exec(key)) {
97            obj[m[1]] = obj[m[1]] || [];
98            obj[m[1]][m[2]] = decode(parts[1]);
99            continue;
100        }
101
102        obj[parts[0]] = null == parts[1]
103            ? ''
104            : decode(parts[1]);
105    }
106
107    return obj;
108};
109
110/**
111 * Stringify the given `obj`.
112 *
113 * @param {Object} obj
114 * @return {String}
115 * @api public
116 */
117
118querystring.stringify = function (obj) {
119    if (!obj) return '';
120    var pairs = [];
121
122    for (var key in obj) {
123        var value = obj[key];
124
125        if ('array' == type(value)) {
126            for (var i = 0; i < value.length; ++i) {
127                pairs.push(encode(key + '[' + i + ']') + '=' + encode(value[i]));
128            }
129            continue;
130        }
131
132        pairs.push(encode(key) + '=' + encode(obj[key]));
133    }
134
135    return pairs.join('&');
136};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.