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.