1//Powerful URL Tools 2 3$.ajaxSettings.contentType = "application/x-www-form-urlencoded;charset=UTF-8"; 4jQuery.purl = function() { 5 var segments = {}; 6 var parsed = {}; 7 var options = { 8 url : window.location, 9 strictMode : false, 10 key : [ "source", "protocol", "authority", "userInfo", "user", 11 "password", "host", "port", "relative", "path", "directory", 12 "file", "query", "anchor" ], 13 q : { 14 name : "queryKey", 15 parser : /(?:^|&)([^&=]*)=?([^&]*)/g 16 }, 17 parser : { 18 strict : /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, 19 loose : /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ 20 } 21 }; 22 var parseUri = function() { 23 str = options.url; 24// str = decodeURI(options.url); 25 var m = options.parser[options.strictMode ? "strict" : "loose"] 26 .exec(str); 27 var uri = {}; 28 var i = 14; 29 while (i--) { 30 uri[options.key[i]] = m[i] || "" 31 } 32 uri[options.q.name] = {}; 33 uri[options.key[12]].replace(options.q.parser, function($0, $1, $2) { 34 if ($1) { 35 uri[options.q.name][$1] = $2 36 } 37 }); 38 for(var i in parsed.queryKey){ 39 try{ 40 parsed.queryKey[i] = decodeURIComponent(parsed.queryKey[i]); 41 }catch(err){ 42 } 43 } 44 45 return uri 46 }; 47 var key = function(key) { 48 if (!parsed.length) { 49 setUp() 50 } 51 if (key == "base") { 52 if (parsed.port !== null && parsed.port !== "") { 53 return parsed.protocol + "://" + parsed.host + ":" 54 + parsed.port + "/" 55 } else { 56 return parsed.protocol + "://" + parsed.host + "/" 57 } 58 } 59 return (parsed[key] === "") ? null : parsed[key] 60 }; 61 var param = function(item) { 62 if (!parsed.length) { 63 setUp() 64 } 65 return (parsed.queryKey[item] === null) ? null : parsed.queryKey[item] 66 }; 67 68 var params = function(){ 69 if (!parsed.length) { 70 setUp() 71 } 72 return parsed.queryKey; 73 }; 74 75 var setUp = function() { 76 parsed = parseUri(); 77 getSegments() 78 }; 79 80 var getSegments = function() { 81 var p = parsed.path; 82 segments = []; 83 segments = parsed.path.length == 1 ? {} 84 : (p.charAt(p.length - 1) == "/" ? p.substring(1, p.length - 1) 85 : path = p.substring(1)).split("/") 86 }; 87 88 return { 89 setMode : function(mode) { 90 strictMode = mode == "strict" ? true : false; 91 return this 92 }, 93 setUrl : function(newUri) { 94 options.url = newUri === undefined ? window.location : newUri; 95 setUp(); 96 return this 97 }, 98 segment : function(pos) { 99 if (!parsed.length) { 100 setUp() 101 } 102 if (pos === undefined) { 103 return segments.length 104 } 105 return (segments[pos] === "" || segments[pos] === undefined) ? null 106 : segments[pos] 107 }, 108 attr : key, 109 param : param, 110 params : params, 111 submit : function(action,data,method){ 112 if(method == null || method == "") 113 method = "GET"; 114 115 var fm = document.createElement('form'); 116 fm.method = method; 117 fm.action = action; 118 $("body").append(fm); 119 for(var i in data){ 120 var fd = document.createElement("input"); 121 fd.type = "hidden"; 122 fd.name = i; 123 fd.value = data[i]; 124 fm.appendChild(fd); 125 } 126 fm.submit(); 127 }, 128 129 query : function(params){ 130 var query = ""; 131 var first = true; 132 for(var i in params){ 133 var p = params[i]; 134 try{ 135 p = decodeURIComponent(p); 136 p = encodeURIComponent(p); 137 }catch(err){ 138 } 139 140 if(first){ 141 first = false; 142 query += i + "=" + params[i]; 143 }else{ 144 query += "&" + i + "=" + params[i]; 145 } 146 } 147 return query; 148 }, 149 150 /** 151 * var options 152 */ 153 submit: function(path,params){ 154 155 $("body").append("<form id='purl-goto' action='"+path+"' ></form>"); 156 157 for(var i in params){ 158 if(params[i]){ 159 $("#purl-goto").append("<input type='hidden' name='"+i+"' value='"+params[i]+"' />"); 160 } 161 } 162 163 $("#purl-goto").submit(); 164 $("#purl-goto").remove(); 165 } 166 } 167}();
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.