Jump to content

User:Opencooper/domainRedirect.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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);