User:Opencooper/domainRedirect.js: Difference between revisions

Content deleted Content added
add check
m remove space from click target
 
(44 intermediate revisions by the same user not shown)
Line 1:
/*/ DetermineDetermines 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() {
Line 5 ⟶ 10:
if (!(mw.config.get("wgAction") === "view"
&& mw.config.get("wgIsArticle")
&& !___location.search.split('oldid=')[1]
&& mw.config.get("wgRevisionId") === mw.config.get("wgCurRevisionId")
&& !mw.config.get("wgPageNamewgIsMainPage") !== "Main_Page")) {
return;
}
// Make sure we have somewhere to put result
if (!$("#contentSub").length) {
return;
}
Line 15 ⟶ 25:
// First try to get the official site off Wikidata
function getWikidata() {
var wikidataId = mw.config.get( 'wgWikibaseItemId' );
if (wikidataId === null) {
getInfobox();
return;
}
Line 34 ⟶ 45:
success: function(response) {
if (typeof response.claims.P856 != "undefined") {
wikidataUrl = response.claims.P856[0].mainsnak.datavalue.value;
console.log("domainRedirect.js: Found Url via wikidata:retrievalMethod = " + wikidataUrl)Wikidata";
getRedirects checkRedirect(wikidataUrl);
} else {
// console.log("domainRedirect.js: Wikidata failed");
getInfobox();
}
}
Line 47 ⟶ 58:
// Then try getting a website in the infobox
function getInfobox() {
var infoboxUrl;
 
$(".infobox tr").each(function() {
// 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");
Line 56 ⟶ 79:
if (infoboxUrl) {
retrievalMethod = "website=";
console.log("domainRedirect.js: Found Url via infobox: " + infoboxUrl);
getRedirectscheckRedirect(infoboxUrl);
} else {
// console.log("domainRedirect.js: Infobox website= failed");
getExternals();
}
}
 
// Finally, try to get it from the external links section
function getExternals() {
// First try getting {{official website}}
var officialUrl = $(".official-website a").first().attr("href");
if (officialUrl) {
console.log("domainRedirect.js:retrievalMethod Found Url via= "{{official site}}: " + officialUrl);
getRedirectscheckRedirect(officialUrl);
return;
} else {
// console.log("domainRedirect.js: No official site");
}
// Then try the external links section and grab the first link wethat says findofficial
var externalUrl = $("h2").has("#External_links").nextUntil("h2")
.find("li a.external").first().attr("href");
if (externalUrl && /Official/i.test(externalUrl.text())) {
var externalHref = externalUrl.attr("href");
console.log("domainRedirect.js: Found Url via External links section: " + externalUrl);
retrievalMethod = "§External_links";
getRedirects(externalUrl);
checkRedirect(externalHref);
} else {
// console.log("domainRedirect.js: No external links list found");
console.loginfo("domainRedirect.js: No candidates found");
}
}
 
function getRedirectscheckRedirect(candidateUrl) {
var parser = new URL(candidateUrl);
// API docs: https://www.mediawiki.org/wiki/API:Redirects
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: "https://en.wikipedia.org/w/api.php"apiUrl,
data: {
action: "query",
prop: "redirects",
format: "json",
titles: mw.config.get("wgPageName")candidateDomain,
rdprop: "title",
rdshow: "!fragment",
rdlimit: "max"
},
success: function(response) {
var pageId = mw if (response.configquery.get(pages["wgArticleId-1"]); {
displayCandidate(candidateUrl);
var redirects = response.query.pages[pageId].redirects;
} else {
checkRedirectExistence(redirects, candidateUrl);
console.info("domainRedirect.js: Domain redirect already present: "
+ candidateDomain);
return;
}
}
});
}
 
function checkRedirectExistencedisplayCandidate(redirects, candidateUrl) {
var pageTitle = mw.config.get("wgTitle");
for (var r of redirects) {
pageTitle = encodeURIComponent(pageTitle).replace(/'/g, "%27");
var title = r.title;
if (!/\./.test(title)) {
continue;
}
 
var parser = new URL(candidateUrl);
console.log("domainRedirect.js: Comparing " + candidateUrl + " to " + title);
var candidateDomain = parser.hostname;
candidateDomain = candidateDomain.replace(/^w+\d*\./, ""); // get rid of www
 
$("#contentSub").append("<span class='mw-redirectedfrom' id='domainRedirect'></span>");
var titleEscaped = mw.RegExp.escape(title);
var re = new RegExp(titleEscaped, "i");
 
var domainType = "___domain";
if (re.test(candidateUrl)) {
if (candidateDomain.split(".").length-1 >= 2) {
console.log("domainRedirect.js: Domain redirect present: " + title);
domainType = "subdomain";
return;
} 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="
// displayCandidate(candidateDomain);
+ 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);