User:Opencooper/domainRedirect.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// Determines whether or not the current article has a redirect from its URL pointing to it

// License: CC0

// FIXME: isn't case insensitive; see [[The Psycho Ex-Wife]]
// FIXME: Doesn't work with TLDs like .co.uk

function setup() {
    // If we're not reading an article, do nothing
    if (!(mw.config.get("wgAction") === "view"
          && mw.config.get("wgIsArticle")
          && !location.search.split('oldid=')[1]
          && !mw.config.get("wgIsMainPage"))) {
        return;
    }
    
    // Make sure we have somewhere to put result
    if (!$("#contentSub").length) {
        return;
    }
    
    getWikidata();
}

// First try to get the official site off Wikidata
function getWikidata() {
    var wikidataId = mw.config.get( 'wgWikibaseItemId' );
    if (wikidataId === null) {
        getInfobox();
        return;
    }

    // API docs: https://www.wikidata.org/w/api.php?action=help&modules=wbgetclaims
    var url;
    $.ajax({
        url: "https://www.wikidata.org/w/api.php",
        data: {
            action: "wbgetclaims",
            entity: wikidataId,
            property: "P856",
            languages: "en",
            format: "json",
            origin: "*"
        },
        success: function(response) {
            if (typeof response.claims.P856 != "undefined") {
                wikidataUrl = response.claims.P856[0].mainsnak.datavalue.value;
                retrievalMethod = "Wikidata";
                checkRedirect(wikidataUrl);
            } else {
                // console.log("domainRedirect.js: Wikidata failed");
                getInfobox();
            }
        }
    });
}

// Then try getting a website in the infobox
function getInfobox() {
    var infoboxUrl;

    // Get {{Url|}}
    infoboxUrl = $(".infobox .url a").last().attr("href");    
    if (infoboxUrl) {
        retrievalMethod = "{{Url}}";
        checkRedirect(infoboxUrl);
        return;
    } else {
        // console.log("domainRedirect.js: Infobox {{Url}} failed");
    }

    // Get |website= 
    $(".infobox tr").each(function() {
        if ($(this).children("th").text() == "Website") {
            infoboxUrl = $(this).children("td").children("a").attr("href");
            return false;
        }
    });
    
    if (infoboxUrl) {
        retrievalMethod = "website=";
        checkRedirect(infoboxUrl);
    } else {
        // console.log("domainRedirect.js: Infobox website= failed");
        getExternals();
    }
}

// Finally, try to get it from the external links
function getExternals() {
    // First try getting {{official website}}
    var officialUrl = $(".official-website a").first().attr("href");
    if (officialUrl) {
        retrievalMethod = "{{official site}}";
        checkRedirect(officialUrl);
        return;
    } else {
        // console.log("domainRedirect.js: No official site");
    }
    
    // Then try the external links section and the first link that says official
    var externalUrl = $("h2").has("#External_links").nextUntil("h2")
                             .find("li a.external").first();
    if (externalUrl && /Official/i.test(externalUrl.text())) {
        var externalHref = externalUrl.attr("href");
        retrievalMethod = "§External_links";
        checkRedirect(externalHref);
    } else {
        // console.log("domainRedirect.js: No external links list found");
        console.info("domainRedirect.js: No candidates found");
    }
}

function checkRedirect(candidateUrl) {
    var parser = new URL(candidateUrl);
    var candidateDomain = parser.hostname;
    candidateDomain = candidateDomain.replace(/^w+\d*\./, ""); // get rid of www
    
    // API docs: https://www.mediawiki.org/wiki/API:Query
    var apiUrl = location.origin + "/w/api.php";
    $.ajax({
        url: apiUrl,
        data: {
            action: "query",
            format: "json",
            titles: candidateDomain,
        },
        success: function(response) {
            if (response.query.pages["-1"]) {
                displayCandidate(candidateUrl);
            } else {
                console.info("domainRedirect.js: Domain redirect already present: "
                             + candidateDomain);
                return;
            }
        }
    });
}

function displayCandidate(candidateUrl) {
    var pageTitle = mw.config.get("wgTitle");
    pageTitle = encodeURIComponent(pageTitle).replace(/'/g, "%27");

    var parser = new URL(candidateUrl);
    var candidateDomain = parser.hostname;
    candidateDomain = candidateDomain.replace(/^w+\d*\./, ""); // get rid of www

	$("#contentSub").append("<span class='mw-redirectedfrom' id='domainRedirect'></span>");

    var domainType = "domain";
    if (candidateDomain.split(".").length-1 >= 2) {
        domainType = "subdomain";
    } else if (parser.pathname != "/") {
        domainType = "subpage";
    } 

	if (domainType != "domain") {
		console.info("domainRedirect.js: Ignoring " + domainType + " redirect: "
                     + candidateDomain);
        $("#domainRedirect").hide();
	}

    var createUrl = "https://en.wikipedia.org/w/index.php?title="
                    + candidateDomain + "&action=edit";
    var editSummary = "Create redirect (using "
                      + "[[User:Opencooper/domainRedirect|domainRedirect.js]])";
    var editSummaryEncoded = encodeURIComponent(editSummary);
    createUrl += "&preload=User:Opencooper/domainRedirectPreloads.js&preloadparams[]="
                  + pageTitle + "&summary=" + editSummaryEncoded;

    var domainMarkup = "<a title='via " + retrievalMethod + "' href='"
                       + parser.origin + "'>" + candidateDomain + "</a>";
    var candidateText = "Possible " + domainType + " redirect: " + domainMarkup;
    var createLink = "<a href='" + createUrl + "' title='Create Redirect'>"
                     + " +</a>";

    var visitLink = "";
    if (candidateUrl.replace(/\/$/, "") != parser.origin) {
        visitLink = "<a href='" + candidateUrl + "' title='Visit Original Link'>"
                    + " →</a>";
    }

    $("#domainRedirect").append("&nbsp;&nbsp;(" + candidateText + createLink
                                + visitLink + ")");
}

var retrievalMethod;
$(setup);
Retrieved from "https://en.wikipedia.org/w/index.php?title=User:Opencooper/domainRedirect.js&oldid=1021987939"