PageSourceSearch

https://www.wilbursmithbooks.com/modules/apostrophe-assets/js/vendor/jquery-url-parser.js

js wilbursmithbooks.com collected 2026-10-02 10:51:36 UTC 7,927 bytes, 270 lines download raw bytes

1/*
2 * JQuery URL Parser plugin, v2.2.1
3 * Developed and maintanined by Mark Perkins, [email protected]
4 * Source repository: https://github.com/allmarkedup/jQuery-URL-Parser
5 * Licensed under an MIT-style license. See https://github.com/allmarkedup/jQuery-URL-Parser/blob/master/LICENSE for details.
6 */ 
7
8;(function(factory) {
9  if (typeof define === 'function' && define.amd) {
10    // AMD available; use anonymous module
11    if ( typeof jQuery !== 'undefined' ) {
12      define(['jquery'], factory);  
13    } else {
14      define([], factory);
15    }
16  } else {
17    // No AMD available; mutate global vars
18    if ( typeof jQuery !== 'undefined' ) {
19      factory(jQuery);
20    } else {
21      factory();
22    }
23  }
24})(function($, undefined) {
25
26  var tag2attr = {
27      a       : 'href',
28      img     : 'src',
29      form    : 'action',
30      base    : 'href',
31      script  : 'src',
32      iframe  : 'src',
33      link    : 'href'
34    },
35
36    key = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'fragment'], // keys available to query
37
38    aliases = { 'anchor' : 'fragment' }, // aliases for backwards compatability
39
40    parser = {
41      strict : /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,  //less intuitive, more accurate to the specs
42      loose :  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // more intuitive, fails on relative paths and deviates from specs
43    },
44
45    toString = Object.prototype.toString,
46
47    isint = /^[0-9]+$/;
48
49  function parseUri( url, strictMode ) {
50    var str = decodeURI( url ),
51    res   = parser[ strictMode || false ? 'strict' : 'loose' ].exec( str ),
52    uri = { attr : {}, param : {}, seg : {} },
53    i   = 14;
54
55    while ( i-- ) {
56      uri.attr[ key[i] ] = res[i] || '';
57    }
58
59    // build query and fragment parameters    
60    uri.param['query'] = parseString(uri.attr['query']);
61    uri.param['fragment'] = parseString(uri.attr['fragment']);
62
63    // split path and fragement into segments   
64    uri.seg['path'] = uri.attr.path.replace(/^\/+|\/+$/g,'').split('/');     
65    uri.seg['fragment'] = uri.attr.fragment.replace(/^\/+|\/+$/g,'').split('/');
66
67    // compile a 'base' domain attribute        
68    uri.attr['base'] = uri.attr.host ? (uri.attr.protocol ?  uri.attr.protocol+'://'+uri.attr.host : uri.attr.host) + (uri.attr.port ? ':'+uri.attr.port : '') : '';      
69
70    return uri;
71  };
72
73  function getAttrName( elm ) {
74    var tn = elm.tagName;
75    if ( typeof tn !== 'undefined' ) return tag2attr[tn.toLowerCase()];
76    return tn;
77  }
78
79  function promote(parent, key) {
80    if (parent[key].length == 0) return parent[key] = {};
81    var t = {};
82    for (var i in parent[key]) t[i] = parent[key][i];
83    parent[key] = t;
84    return t;
85  }
86
87  function parse(parts, parent, key, val) {
88    var part = parts.shift();
89    if (!part) {
90      if (isArray(parent[key])) {
91        parent[key].push(val);
92      } else if ('object' == typeof parent[key]) {
93        parent[key] = val;
94      } else if ('undefined' == typeof parent[key]) {
95        parent[key] = val;
96      } else {
97        parent[key] = [parent[key], val];
98      }
99    } else {
100      var obj = parent[key] = parent[key] || [];
101      if (']' == part) {
102        if (isArray(obj)) {
103          if ('' != val) obj.push(val);
104        } else if ('object' == typeof obj) {
105          obj[keys(obj).length] = val;
106        } else {
107          obj = parent[key] = [parent[key], val];
108        }
109      } else if (~part.indexOf(']')) {
110        part = part.substr(0, part.length - 1);
111        if (!isint.test(part) && isArray(obj)) obj = promote(parent, key);
112        parse(parts, obj, part, val);
113        // key
114      } else {
115        if (!isint.test(part) && isArray(obj)) obj = promote(parent, key);
116        parse(parts, obj, part, val);
117      }
118    }
119  }
120
121  function merge(parent, key, val) {
122    if (~key.indexOf(']')) {
123      var parts = key.split('['),
124      len = parts.length,
125      last = len - 1;
126      parse(parts, parent, 'base', val);
127    } else {
128      if (!isint.test(key) && isArray(parent.base)) {
129        var t = {};
130        for (var k in parent.base) t[k] = parent.base[k];
131        parent.base = t;
132      }
133      set(parent.base, key, val);
134    }
135    return parent;
136  }
137
138  function parseString(str) {
139    return reduce(String(str).split(/&|;/), function(ret, pair) {
140      try {
141        pair = decodeURIComponent(pair.replace(/\+/g, ' '));
142      } catch(e) {
143        // ignore
144      }
145      var eql = pair.indexOf('='),
146        brace = lastBraceInKey(pair),
147        key = pair.substr(0, brace || eql),
148        val = pair.substr(brace || eql, pair.length),
149        val = val.substr(val.indexOf('=') + 1, val.length);
150
151      if ('' == key) key = pair, val = '';
152
153      return merge(ret, key, val);
154    }, { base: {} }).base;
155  }
156
157  function set(obj, key, val) {
158    var v = obj[key];
159    if (undefined === v) {
160      obj[key] = val;
161    } else if (isArray(v)) {
162      v.push(val);
163    } else {
164      obj[key] = [v, val];
165    }
166  }
167
168  function lastBraceInKey(str) {
169    var len = str.length,
170       brace, c;
171    for (var i = 0; i < len; ++i) {
172      c = str[i];
173      if (']' == c) brace = false;
174      if ('[' == c) brace = true;
175      if ('=' == c && !brace) return i;
176    }
177  }
178
179  function reduce(obj, accumulator){
180    var i = 0,
181      l = obj.length >> 0,
182      curr = arguments[2];
183    while (i < l) {
184      if (i in obj) curr = accumulator.call(undefined, curr, obj[i], i, obj);
185      ++i;
186    }
187    return curr;
188  }
189
190  function isArray(vArg) {
191    return Object.prototype.toString.call(vArg) === "[object Array]";
192  }
193
194  function keys(obj) {
195    var keys = [];
196    for ( prop in obj ) {
197      if ( obj.hasOwnProperty(prop) ) keys.push(prop);
198    }
199    return keys;
200  }
201
202  function purl( url, strictMode ) {
203    if ( arguments.length === 1 && url === true ) {
204      strictMode = true;
205      url = undefined;
206    }
207    strictMode = strictMode || false;
208    url = url || window.location.toString();
209
210    return {
211
212      data : parseUri(url, strictMode),
213
214      // get various attributes from the URI
215      attr : function( attr ) {
216        attr = aliases[attr] || attr;
217        return typeof attr !== 'undefined' ? this.data.attr[attr] : this.data.attr;
218      },
219
220      // return query string parameters
221      param : function( param ) {
222        return typeof param !== 'undefined' ? this.data.param.query[param] : this.data.param.query;
223      },
224
225      // return fragment parameters
226      fparam : function( param ) {
227        return typeof param !== 'undefined' ? this.data.param.fragment[param] : this.data.param.fragment;
228      },
229
230      // return path segments
231      segment : function( seg ) {
232        if ( typeof seg === 'undefined' ) {
233          return this.data.seg.path;
234        } else {
235          seg = seg < 0 ? this.data.seg.path.length + seg : seg - 1; // negative segments count from the end
236          return this.data.seg.path[seg];                    
237        }
238      },
239
240      // return fragment segments
241      fsegment : function( seg ) {
242        if ( typeof seg === 'undefined' ) {
243          return this.data.seg.fragment;                    
244        } else {
245          seg = seg < 0 ? this.data.seg.fragment.length + seg : seg - 1; // negative segments count from the end
246          return this.data.seg.fragment[seg];                    
247        }
248      }
249
250    };
251
252  };
253
254  if ( typeof $ !== 'undefined' ) {
255
256    $.fn.url = function( strictMode ) {
257      var url = '';
258      if ( this.length ) {
259        url = $(this).attr( getAttrName(this[0]) ) || '';
260      }    
261      return purl( url, strictMode );
262    };
263
264    $.url = purl;
265
266  } else {
267    window.purl = purl;
268  }
269
270});

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.