User:JPxG/Difformatter.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:JPxG/Difformatter. |
// 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>