// Fix URLs to oldids and diffs and etc, and replace them with wikilinks to Special:Permalink or Special:Diff.
// Examples which should work:
// [https://en.wikipedia.org/w/index.php?oldid=1239040342 Le epin link text]
// [https://en.wikipedia.org/w/index.php?oldid=1239040342 ]
// [https://en.wikipedia.org/w/index.php?oldid=1239040342]
// [https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&diff=next&oldid=1239040342 Le epin link text]
// [https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&diff=cur&oldid=1239040342 Le epin link text]
// [https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&diff=prev&oldid=1239040342 Le epin link text]
// [https://en.wikipedia.org/w/index.php?title=Main_Page&oldid=prev&diff=1223300368 Le epin link text]
// [https://en.wikipedia.org/w/index.php?title=Main_Page&oldid=next&diff=1223300368 Le epin link text]
// [https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&oldid=1239040342 Le epin link text]
// [https://en.wikipedia.org/w/index.php?title=Talk:River&oldid=1236201671 Le epin link text]
// [https://en.wikipedia.org/?diff=624372972 Le epin link text]
// These should NOT work because there's no way to make them work with pure regex or by formatting special links:
// [https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&direction=next&oldid=1239040342 Le epin link text]
// [https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&direction=prev&oldid=1239040342 Le epin link text]
function formatLink(txt) {
try {
console.log("trying to format diff");
let diff = 0;
if(txt.indexOf("Special%3ADiff") !== -1){ diff = 1;}
if(txt.indexOf("Special:Diff") !== -1){ diff = 1;}
if(txt.indexOf("Special%3APermalink") !== -1){diff = 1;}
if(txt.indexOf("Special:Permalink") !== -1){ diff = 1;}
if(txt.indexOf("diff=") !== -1){ diff = 1;}
if(txt.indexOf("oldid=") !== -1){ diff = 1;}
if(diff == 0){return txt;}
// If we don't recognize it as being a diff/permalink URL, just return it unmodified.
if(txt.indexOf(":Permalink/") !== -1){return txt;}
if(txt.indexOf(":Diff/") !== -1){ return txt;}
// For some reason this script loves to chew up already-formatted diff links.
var url = txt.split(" ")[0];
// txt is something like:
// https://en.wikipedia.org/w/index.php?oldid=1239040342 Link text
// url will be:
// https://en.wikipedia.org/w/index.php?oldid=1239040342
if(url == txt){txt += " link";}
// if there's no link text
console.log(txt);
console.log(url);
var output = ""
var done = 0;
// Extra-special snowflake cases that can't be resolved by formatting (Special:Permalink doesn't support /next or /prev suffices)
// If we see these we just abort trying to process the link at all.
// https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&direction=next&oldid=1239040342
// Gives revid 1239041264!
// https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&direction=prev&oldid=1239040342
// Gives revid 1237707685!
if ((done == 0) && (url.indexOf("direction=next&oldid=") !== -1)) {
console.log("not parsing, weird url");
return txt;
}
if ((done == 0) && (url.indexOf("direction=prev&oldid=") !== -1)) {
console.log("not parsing, weird url");
return txt;
}
// Special snowflake case: diff and oldid with IDs for both.
// https://en.wikipedia.org/w/index.php?title=Death_from_laughter&diff=1232650458&oldid=1218331300
// if "diff= [digits]" and "oldid = [digits]" are in the link, then format it like "[[Special:Diff/1218331300/1232650458]]"
const diffOldidRegex = /[?&]diff=(\d+)&oldid=(\d+)/;
if ((done == 0) && (diffOldidRegex.test(url))) {
const matches = url.match(diffOldidRegex);
const diff = matches[1];
const oldid = matches[2];
output = `Special:Diff/${oldid}/${diff}`;
console.log("parsed 01");
done = 1;
}
const oldidDiffRegex = /[?&]oldid=(\d+)&diff=(\d+)/;
if ((done == 0) && (oldidDiffRegex.test(url))) {
const matches = url.match(oldidDiffRegex);
const diff = matches[1];
const oldid = matches[2];
output = `Special:Diff/${oldid}/${diff}`;
console.log("parsed 02");
done = 1;
}
// https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&diff=next&oldid=1239040342
// https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&diff=cur&oldid=1239040342
// https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&diff=prev&oldid=1239040342
if ((done == 0) && (url.indexOf("diff=prev&oldid=") !== -1)) {
output = `Special:Diff/` + url.split("oldid=")[1] + `/prev`
console.log("parsed 02");
done = 1;
}
if ((done == 0) && (url.indexOf("diff=next&oldid=") !== -1)) {
output = `Special:Diff/` + url.split("oldid=")[1] + `/next`
console.log("parsed 03");
done = 1;
}
if ((done == 0) && (url.indexOf("diff=cur&oldid=") !== -1)) {
output = `Special:Diff/` + url.split("oldid=")[1] + `/cur`
console.log("parsed 04");
done = 1;
}
// https://en.wikipedia.org/w/index.php?title=Main_Page&oldid=prev&diff=1223300368
// https://en.wikipedia.org/w/index.php?title=Main_Page&oldid=next&diff=1223300368
if ((done == 0) && (url.indexOf("oldid=prev&diff=") !== -1)) {
output = `Special:Diff/` + url.split("diff=")[1]; done = 1;}
if ((done == 0) && (url.indexOf("oldid=next&diff=") !== -1)) {
output = `Special:Diff/` + url.split("diff=")[1]; done = 1;}
if ((done == 0) && (url.indexOf("oldid=next&diff=") !== -1)) {
output = `Special:Diff/` + url.split("diff=")[1]; done = 1;}
// https://en.wikipedia.org/w/index.php?title=Environmental_impact_of_aviation&oldid=1239040342
// https://en.wikipedia.org/w/index.php?title=Talk:River&oldid=1236201671
if ((done == 0) && (url.indexOf("oldid=") !== -1)) {
output = `Special:Permalink/` + url.split("oldid=")[1]; done = 1;}
if ((done == 0) && (url.indexOf("diff=") !== -1)) {
output = `Special:Diff/` + url.split("diff=")[1]; done = 1;}
// Weird link formats that, frankly, shouldn't even work, but do somehow -- usually if someone types in a diff URL manually
// https://en.wikipedia.org/?diff=624372972
if ((done == 0) && (url.indexOf("https://en.wikipedia.org/?diff=") !== -1)) {
console.log("weird"); output = `Special:Diff/` + url.split("?diff=")[1]; done = 1;}
// https://en.wikipedia.org/?oldid=624372972
if ((done == 0) && (url.indexOf("https://en.wikipedia.org/?oldid=") !== -1)) {
console.log("weird"); output = `Special:Permalink/` + url.split("?oldid=")[1]; done = 1;}
if ((done == 0) && (url.indexOf("https://en.wikipedia.org/w/index.php?diff=") !== -1)) {
console.log("weird"); output = `Special:Diff/` + url.split("?diff=")[1]; done = 1;}
if ((done == 0) && (url.indexOf("https://en.wikipedia.org/w/index.php?oldid=") !== -1)) {
console.log("weird"); output = `Special:Permalink/` + url.split("?oldid=")[1]; done = 1;}
if ((done == 0) && (url.indexOf("action=view&diff=") !== -1)) {
console.log("weird"); output = `Special:Diff/` + url.split("?diff=")[1]; done = 1;}
if ((done == 0) && (url.indexOf("action=view&oldid=") !== -1)) {
console.log("weird"); output = `Special:Permalink/` + url.split("?oldid=")[1]; done = 1;}
if ((done == 0) && (url.indexOf("type=revision&diff=") !== -1)) {
console.log("weird"); output = `Special:Diff/` + url.split("?diff=")[1]; done = 1;}
if ((done == 0) && (url.indexOf("type=revision&oldid=") !== -1)) {
console.log("weird"); output = `Special:Permalink/` + url.split("?oldid=")[1]; done = 1;}
output = output + "|"
console.log("returning output");
return "[" + txt.replace(url, output).replace(" ", " ").replace("| ", "|") + "]"
} catch(e) {console.log(e); return txt;}
}
function doDifformat() {
//alert("This part works");
tbox = String(document.editform.wpTextbox1.value);
// Get the text from the edit box and store it as "tbox".
let startIndex, endIndex, prevIndex;
console.log("doing stuff 00");
while ((startIndex = tbox.indexOf("[", prevIndex)) !== -1) {
endIndex = tbox.indexOf("]", startIndex);
console.log("doing stuff 01");
// If there's no closing bracket, exit the loop
if (endIndex === -1) {
console.log("doing stuff 02");
break;
}
const substring = tbox.substring(startIndex + 1, endIndex);
var processed = formatLink(substring);
console.log("doing stuff 03");
processed = "[" + processed + "]";
processed = processed.replace("|]]", "|link]]");
tbox = tbox.substring(0, startIndex) + processed + tbox.substring(endIndex + 1);
console.log("doing stuff 04");
prevIndex = startIndex + 2;
}
document.editform.wpTextbox1.value = tbox;
document.editform.wpSummary.value += " Automatically formatted diff/permalink URLs into wikilinks with [[User:JPxG/Difformatter.js]] V1.0";
} // function to replace the stuff with the other stuff
addOnloadHook(function() {
if (document.editform) {
mw.util.addPortletLink("p-cactions", "javascript:doDifformat()", "Difformat", "ca-difformat", "Fix diff/permalinks", "");
}
}); // onloadhook
// </nowiki>