164 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// JQuery URL Parser plugin - https://github.com/allmarkedup/jQuery-URL-Parser
 | 
						|
// Written by Mark Perkins, mark@allmarkedup.com
 | 
						|
// License: http://unlicense.org/ (i.e. do what you want with it!)
 | 
						|
 | 
						|
;(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
 | 
						|
	},
 | 
						|
	
 | 
						|
	querystring_parser = /(?:^|&|;)([^&=;]*)=?([^&;]*)/g, // supports both ampersand and semicolon-delimted query string key/value pairs
 | 
						|
	
 | 
						|
	fragment_parser = /(?:^|&|;)([^&=;]*)=?([^&;]*)/g; // supports both ampersand and semicolon-delimted fragment key/value pairs
 | 
						|
	
 | 
						|
	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'] = {};
 | 
						|
		uri.param['fragment'] = {};
 | 
						|
		
 | 
						|
		uri.attr['query'].replace( querystring_parser, function ( $0, $1, $2 ){
 | 
						|
			if ($1)
 | 
						|
			{
 | 
						|
				uri.param['query'][$1] = $2;
 | 
						|
			}
 | 
						|
		});
 | 
						|
		
 | 
						|
		uri.attr['fragment'].replace( fragment_parser, function ( $0, $1, $2 ){
 | 
						|
			if ($1)
 | 
						|
			{
 | 
						|
				uri.param['fragment'][$1] = $2;
 | 
						|
			}
 | 
						|
		});
 | 
						|
				
 | 
						|
		// 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.host + (uri.attr.port ? ":"+uri.attr.port : '') : '';
 | 
						|
        
 | 
						|
		return uri;
 | 
						|
	};
 | 
						|
	
 | 
						|
	function getAttrName( elm )
 | 
						|
	{
 | 
						|
		var tn = elm.tagName;
 | 
						|
		if ( tn !== undefined ) return tag2attr[tn.toLowerCase()];
 | 
						|
		return tn;
 | 
						|
	}
 | 
						|
	
 | 
						|
	$.fn.url = function( strictMode )
 | 
						|
	{
 | 
						|
	    var url = '';
 | 
						|
	    
 | 
						|
	    if ( this.length )
 | 
						|
	    {
 | 
						|
	        url = $(this).attr( getAttrName(this[0]) ) || '';
 | 
						|
	    }
 | 
						|
	    
 | 
						|
        return $.url({ url : url, strict : strictMode });
 | 
						|
	};
 | 
						|
	
 | 
						|
	$.url = function( opts )
 | 
						|
	{
 | 
						|
	    var url     = '',
 | 
						|
	        strict  = false;
 | 
						|
 | 
						|
	    if ( typeof opts === 'string' )
 | 
						|
	    {
 | 
						|
	        url = opts;
 | 
						|
	    }
 | 
						|
	    else
 | 
						|
	    {
 | 
						|
	        opts = opts || {};
 | 
						|
	        strict = opts.strict || strict;
 | 
						|
            url = opts.url === undefined ? window.location.toString() : opts.url;
 | 
						|
	    }
 | 
						|
	    	            
 | 
						|
        return {
 | 
						|
            
 | 
						|
            data : parseUri(url, strict),
 | 
						|
            
 | 
						|
            // get various attributes from the URI
 | 
						|
            attr : function( attr )
 | 
						|
            {
 | 
						|
                attr = aliases[attr] || attr;
 | 
						|
                return attr !== undefined ? this.data.attr[attr] : this.data.attr;
 | 
						|
            },
 | 
						|
            
 | 
						|
            // return query string parameters
 | 
						|
            param : function( param )
 | 
						|
            {
 | 
						|
                return param !== undefined ? this.data.param.query[param] : this.data.param.query;
 | 
						|
            },
 | 
						|
            
 | 
						|
            // return fragment parameters
 | 
						|
            fparam : function( param )
 | 
						|
            {
 | 
						|
                return param !== undefined ? this.data.param.fragment[param] : this.data.param.fragment;
 | 
						|
            },
 | 
						|
            
 | 
						|
            // return path segments
 | 
						|
            segment : function( seg )
 | 
						|
            {
 | 
						|
                if ( 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 ( 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];                    
 | 
						|
                }
 | 
						|
            }
 | 
						|
            
 | 
						|
        };
 | 
						|
        
 | 
						|
	};
 | 
						|
	
 | 
						|
})(jQuery); |