64 lines
2.3 KiB
JavaScript
64 lines
2.3 KiB
JavaScript
// from https://gist.github.com/Yaffle/1088850
|
|
(function(global) {
|
|
function URLPolyfill(url, baseURL) {
|
|
if (typeof url != 'string')
|
|
throw new TypeError('URL must be a string');
|
|
var m = String(url).replace(/^\s+|\s+$/g, "").match(/^([^:\/?#]+:)?(?:\/\/(?:([^:@\/?#]*)(?::([^:@\/?#]*))?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/);
|
|
if (!m)
|
|
throw new RangeError('Invalid URL format');
|
|
var protocol = m[1] || "";
|
|
var username = m[2] || "";
|
|
var password = m[3] || "";
|
|
var host = m[4] || "";
|
|
var hostname = m[5] || "";
|
|
var port = m[6] || "";
|
|
var pathname = m[7] || "";
|
|
var search = m[8] || "";
|
|
var hash = m[9] || "";
|
|
if (baseURL !== undefined) {
|
|
var base = baseURL instanceof URLPolyfill ? baseURL : new URLPolyfill(baseURL);
|
|
var flag = !protocol && !host && !username;
|
|
if (flag && !pathname && !search)
|
|
search = base.search;
|
|
if (flag && pathname[0] !== "/")
|
|
pathname = (pathname ? (((base.host || base.username) && !base.pathname ? "/" : "") + base.pathname.slice(0, base.pathname.lastIndexOf("/") + 1) + pathname) : base.pathname);
|
|
// dot segments removal
|
|
var output = [];
|
|
pathname.replace(/^(\.\.?(\/|$))+/, "")
|
|
.replace(/\/(\.(\/|$))+/g, "/")
|
|
.replace(/\/\.\.$/, "/../")
|
|
.replace(/\/?[^\/]*/g, function (p) {
|
|
if (p === "/..")
|
|
output.pop();
|
|
else
|
|
output.push(p);
|
|
});
|
|
pathname = output.join("").replace(/^\//, pathname[0] === "/" ? "/" : "");
|
|
if (flag) {
|
|
port = base.port;
|
|
hostname = base.hostname;
|
|
host = base.host;
|
|
password = base.password;
|
|
username = base.username;
|
|
}
|
|
if (!protocol)
|
|
protocol = base.protocol;
|
|
}
|
|
|
|
// convert URLs to use / always
|
|
pathname = pathname.replace(/\\/g, '/');
|
|
|
|
this.origin = host ? protocol + (protocol !== "" || host !== "" ? "//" : "") + host : "";
|
|
this.href = protocol + (protocol && host || protocol == "file:" ? "//" : "") + (username !== "" ? username + (password !== "" ? ":" + password : "") + "@" : "") + host + pathname + search + hash;
|
|
this.protocol = protocol;
|
|
this.username = username;
|
|
this.password = password;
|
|
this.host = host;
|
|
this.hostname = hostname;
|
|
this.port = port;
|
|
this.pathname = pathname;
|
|
this.search = search;
|
|
this.hash = hash;
|
|
}
|
|
global.URLPolyfill = URLPolyfill;
|
|
})(typeof self != 'undefined' ? self : global); |