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],
     ...