JSFiddle - React, Tailwind, and code Playground
by Michaël van de Weerd
HTML
<a id="test" href="//:80">World</a>
JavaScript
(function(context) {
context.directDoc = directDoc;
function directDoc() {
var as = document.getElementsByTagName("a");
var local = window.href;
for (var i = 0; i < as.length; i++) {
var remote = as[i].href;
as[i].href = direct(remote, local);
}
}
function direct(remote, local) {
var parsedRemote = parseURI(remote);
var parsedLocal = parseURI(local);
var dri = "";
if (parsedRemote.scheme) {
dri += parsedRemote.scheme;
} else if (parsedLocal.scheme) {
dri += parsedLocal.scheme;
}
if (parsedRemote.auhtority || parsedRemote.authority) {
dri += "//";
if (parsedRemote.userinfo) {
dri += parsedRemote.authority.userinfo;
} else if (parsedLocal.authority.userinfo) {
dri += parsedLocal.authority.userinfo;
}
if (parsedRemote.host) {
dri += parsedRemote.authority.host;
} else if (parsedLocal.authority.host) {
dri += parsedLocal.authority.host;
}
if (parsedRemote.port) {
dri += parsedRemote.authority.port;
} else if (parsedLocal.authority.port) {
dri += parsedLocal.authority.port;
}
}
if (parsedRemote.path) {
dri += parsedRemote.path;
} else if (parsedLocal.path) {
dri += parsedLocal.path;
}
if (parsedRemote.query) {
dri += parsedRemote.query;
} else if (parsedLocal.query) {
dri += parsedLocal.query;
}
if (parsedRemote.fragment) {
dri += parsedRemote.fragment;
} else if (parsedLocal.fragment) {
dri += parsedLocal.fragment;
}
return dri;
}
function parseURI(uri) {
var pattern = new RegExp("^([^:/?#]*:)?(\/\/([^@:/?#]*@)?([^:/?#]*)?(:[^/?#]*)?)(\/[^?#]*)?(\?[^#]*)?(#.*)?$");
var match = pattern.exec(uri);
return {
scheme: match[1],
authority: match[2],
userinfo: match[3],
host: match[4],
port: match[5]
path: match[6],
query: match[7],
...