]> source.dussan.org Git - archiva.git/commitdiff
add url parser library
authorOlivier Lamy <olamy@apache.org>
Wed, 14 Nov 2012 20:04:10 +0000 (20:04 +0000)
committerOlivier Lamy <olamy@apache.org>
Wed, 14 Nov 2012 20:04:10 +0000 (20:04 +0000)
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1409347 13f79535-47bb-0310-9956-ffa450edef68

archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/purl-2.2.1.js [new file with mode: 0644]

diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/purl-2.2.1.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/purl-2.2.1.js
new file mode 100644 (file)
index 0000000..509ca08
--- /dev/null
@@ -0,0 +1,271 @@
+/*
+ * JQuery URL Parser plugin, v2.2.1
+ * Developed and maintanined by Mark Perkins, mark@allmarkedup.com
+ * Source repository: https://github.com/allmarkedup/jQuery-URL-Parser
+ * Licensed under an MIT-style license. See https://github.com/allmarkedup/jQuery-URL-Parser/blob/master/LICENSE for details.
+ */ 
+
+;(function(factory) {
+       if (typeof define === 'function' && define.amd) {
+               // AMD available; use anonymous module
+               if ( typeof jQuery !== 'undefined' ) {
+                       define(['jquery'], factory);    
+               } else {
+                       define([], factory);
+               }
+       } else {
+               // No AMD available; mutate global vars
+               if ( typeof jQuery !== 'undefined' ) {
+                       factory(jQuery);
+               } else {
+                       factory();
+               }
+       }
+})(function($, undefined) {
+       
+       var tag2attr = {
+                       a       : 'href',
+                       img     : 'src',
+                       form    : 'action',
+                       base    : 'href',
+                       script  : 'src',
+                       iframe  : 'src',
+                       link    : 'href'
+               },
+               
+               key = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'fragment'], // keys available to query
+               
+               aliases = { 'anchor' : 'fragment' }, // aliases for backwards compatability
+               
+               parser = {
+                       strict : /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,  //less intuitive, more accurate to the specs
+                       loose :  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // more intuitive, fails on relative paths and deviates from specs
+               },
+               
+               toString = Object.prototype.toString,
+               
+               isint = /^[0-9]+$/;
+       
+       function parseUri( url, strictMode ) {
+               var str = decodeURI( url ),
+               res   = parser[ strictMode || false ? 'strict' : 'loose' ].exec( str ),
+               uri = { attr : {}, param : {}, seg : {} },
+               i   = 14;
+               
+               while ( i-- ) {
+                       uri.attr[ key[i] ] = res[i] || '';
+               }
+               
+               // build query and fragment parameters          
+               uri.param['query'] = parseString(uri.attr['query']);
+               uri.param['fragment'] = parseString(uri.attr['fragment']);
+               
+               // split path and fragement into segments               
+               uri.seg['path'] = uri.attr.path.replace(/^\/+|\/+$/g,'').split('/');     
+               uri.seg['fragment'] = uri.attr.fragment.replace(/^\/+|\/+$/g,'').split('/');
+               
+               // compile a 'base' domain attribute        
+               uri.attr['base'] = uri.attr.host ? (uri.attr.protocol ?  uri.attr.protocol+'://'+uri.attr.host : uri.attr.host) + (uri.attr.port ? ':'+uri.attr.port : '') : '';      
+                 
+               return uri;
+       };
+       
+       function getAttrName( elm ) {
+               var tn = elm.tagName;
+               if ( typeof tn !== 'undefined' ) return tag2attr[tn.toLowerCase()];
+               return tn;
+       }
+       
+       function promote(parent, key) {
+               if (parent[key].length == 0) return parent[key] = {};
+               var t = {};
+               for (var i in parent[key]) t[i] = parent[key][i];
+               parent[key] = t;
+               return t;
+       }
+
+       function parse(parts, parent, key, val) {
+               var part = parts.shift();
+               if (!part) {
+                       if (isArray(parent[key])) {
+                               parent[key].push(val);
+                       } else if ('object' == typeof parent[key]) {
+                               parent[key] = val;
+                       } else if ('undefined' == typeof parent[key]) {
+                               parent[key] = val;
+                       } else {
+                               parent[key] = [parent[key], val];
+                       }
+               } else {
+                       var obj = parent[key] = parent[key] || [];
+                       if (']' == part) {
+                               if (isArray(obj)) {
+                                       if ('' != val) obj.push(val);
+                               } else if ('object' == typeof obj) {
+                                       obj[keys(obj).length] = val;
+                               } else {
+                                       obj = parent[key] = [parent[key], val];
+                               }
+                       } else if (~part.indexOf(']')) {
+                               part = part.substr(0, part.length - 1);
+                               if (!isint.test(part) && isArray(obj)) obj = promote(parent, key);
+                               parse(parts, obj, part, val);
+                               // key
+                       } else {
+                               if (!isint.test(part) && isArray(obj)) obj = promote(parent, key);
+                               parse(parts, obj, part, val);
+                       }
+               }
+       }
+
+       function merge(parent, key, val) {
+               if (~key.indexOf(']')) {
+                       var parts = key.split('['),
+                       len = parts.length,
+                       last = len - 1;
+                       parse(parts, parent, 'base', val);
+               } else {
+                       if (!isint.test(key) && isArray(parent.base)) {
+                               var t = {};
+                               for (var k in parent.base) t[k] = parent.base[k];
+                               parent.base = t;
+                       }
+                       set(parent.base, key, val);
+               }
+               return parent;
+       }
+
+       function parseString(str) {
+               return reduce(String(str).split(/&|;/), function(ret, pair) {
+                       try {
+                               pair = decodeURIComponent(pair.replace(/\+/g, ' '));
+                       } catch(e) {
+                               // ignore
+                       }
+                       var eql = pair.indexOf('='),
+                               brace = lastBraceInKey(pair),
+                               key = pair.substr(0, brace || eql),
+                               val = pair.substr(brace || eql, pair.length),
+                               val = val.substr(val.indexOf('=') + 1, val.length);
+
+                       if ('' == key) key = pair, val = '';
+
+                       return merge(ret, key, val);
+               }, { base: {} }).base;
+       }
+       
+       function set(obj, key, val) {
+               var v = obj[key];
+               if (undefined === v) {
+                       obj[key] = val;
+               } else if (isArray(v)) {
+                       v.push(val);
+               } else {
+                       obj[key] = [v, val];
+               }
+       }
+       
+       function lastBraceInKey(str) {
+               var len = str.length,
+                        brace, c;
+               for (var i = 0; i < len; ++i) {
+                       c = str[i];
+                       if (']' == c) brace = false;
+                       if ('[' == c) brace = true;
+                       if ('=' == c && !brace) return i;
+               }
+       }
+       
+       function reduce(obj, accumulator){
+               var i = 0,
+                       l = obj.length >> 0,
+                       curr = arguments[2];
+               while (i < l) {
+                       if (i in obj) curr = accumulator.call(undefined, curr, obj[i], i, obj);
+                       ++i;
+               }
+               return curr;
+       }
+       
+       function isArray(vArg) {
+               return Object.prototype.toString.call(vArg) === "[object Array]";
+       }
+       
+       function keys(obj) {
+               var keys = [];
+               for ( prop in obj ) {
+                       if ( obj.hasOwnProperty(prop) ) keys.push(prop);
+               }
+               return keys;
+       }
+               
+       function purl( url, strictMode ) {
+               if ( arguments.length === 1 && url === true ) {
+                       strictMode = true;
+                       url = undefined;
+               }
+               strictMode = strictMode || false;
+               url = url || window.location.toString();
+       
+               return {
+                       
+                       data : parseUri(url, strictMode),
+                       
+                       // get various attributes from the URI
+                       attr : function( attr ) {
+                               attr = aliases[attr] || attr;
+                               return typeof attr !== 'undefined' ? this.data.attr[attr] : this.data.attr;
+                       },
+                       
+                       // return query string parameters
+                       param : function( param ) {
+                               return typeof param !== 'undefined' ? this.data.param.query[param] : this.data.param.query;
+                       },
+                       
+                       // return fragment parameters
+                       fparam : function( param ) {
+                               return typeof param !== 'undefined' ? this.data.param.fragment[param] : this.data.param.fragment;
+                       },
+                       
+                       // return path segments
+                       segment : function( seg ) {
+                               if ( typeof seg === 'undefined' ) {
+                                       return this.data.seg.path;
+                               } else {
+                                       seg = seg < 0 ? this.data.seg.path.length + seg : seg - 1; // negative segments count from the end
+                                       return this.data.seg.path[seg];                    
+                               }
+                       },
+                       
+                       // return fragment segments
+                       fsegment : function( seg ) {
+                               if ( typeof seg === 'undefined' ) {
+                                       return this.data.seg.fragment;                    
+                               } else {
+                                       seg = seg < 0 ? this.data.seg.fragment.length + seg : seg - 1; // negative segments count from the end
+                                       return this.data.seg.fragment[seg];                    
+                               }
+                       }
+               
+               };
+       
+       };
+       
+       if ( typeof $ !== 'undefined' ) {
+               
+               $.fn.url = function( strictMode ) {
+                       var url = '';
+                       if ( this.length ) {
+                               url = $(this).attr( getAttrName(this[0]) ) || '';
+                       }    
+                       return purl( url, strictMode );
+               };
+               
+               $.url = purl;
+               
+       } else {
+               window.purl = purl;
+       }
+
+});
+