User:The Transhumanist/redlinkstest.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:The Transhumanist/redlinkstest. |
/* OLUtils.js: "Outline Utilities", with features optimized for outlines.
The initial function of this script is to strip redlinks
Fork of December 26, 2016 15:05 version of User:AlexTheWhovian/script-redlinks.js
It worked when the lastest version did not, but it has worked intermittently since.
That script already does the last 2 steps needed for outlines:
remove redlink categories,
and delink all remaining unprocessed redlinks.
For more detailed comments than those included below, see the Explanatory notes section on the talk page.
*/
// /////////////////////////// PROCESS READ PAGE ////////////////////////////////////
// Start off with a bodyguard function (see Explanatory notes on talk page), also call mw library
( function ( mw, $) {
// we can now rely on $ within the safety of our “bodyguard” function
// below is jQuery short-hand for $(document).ready(function() { ... });
$(function() {
// Create linked menu item
var portletlink = mw.util.addPortletLink('p-tb', '#', 'Remove red links');
// Bind click handler
$(portletlink).click( function(e) {
e.preventDefault();
// Do some stuff when clicked...
// Default parameters, and begin script on regular view of article
var loc = window.location.href;
var redlinks; var i;
// Gather all redlinks with class "new"
redlinks = [];
var a = document.getElementsByTagName('a');
for (i = 0; i < a.length; i++) {
if (a[i].getAttribute('class') == "new") {
redlinks[redlinks.length] = a[i].href.replace('https://en.wikipedia.org/w/index.php?title=','').replace('&action=edit&redlink=1','');
redlinks[redlinks.length-1] = redlinks[redlinks.length-1].replace(/_/g,' ');
redlinks[redlinks.length-1] = decodeURIComponent(redlinks[redlinks.length-1]);
}
}
// Save all redlinks
if (redlinks.length > 0) {
var jsonString = JSON.stringify(redlinks);
localStorage.OLUtils_redlinks = jsonString;
// If we are in the edit page, then remove redlinks automatically; if we are on the reading page, then go to the edit page
if (window.location.href.indexOf('action') >= 0) {
// (do nothing - it already does it above)
} else {
window.location = window.location.href.substr(0, window.location.href.indexOf('#'))+"?action=edit";
}
} else {
alert('No redlinks!');
}
}); // end of function(e) (click handler)
});
// //////////////////////////// PROCESS EDIT PAGE ////////////////////////////////
// The ready() event listener/handler, to "defer" a functon while the page loads (the function is the handler),
// ensures that the function is called only after all the DOM elements of the page are ready to be used:
$(document).ready( function () {
// Invoke a function by its name; this one checks the script's localStorage slot
// (The function itself is defined down the page a little, using the word "function").
check_storage();
});
function check_storage() {
// Check to see if anything is in storage, and if there is, invoke redlinks removal
if (localStorage.OLUtils_redlinks !== "") {
// Invoke a function by its name (it is defined further down the page).
// This one removes redlinks, if they exist:
redlinks_removal();
}
}
// Automatic removal of redlinks when stored.
function redlinks_removal() {
// Gather saved redlinks
var redlinks = JSON.parse(localStorage.OLUtils_redlinks);
// Regular expression to escape special characters
var totalredlinks = 0;
RegExp.quote = function(str) { return str.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&"); };
var wpTextbox1 = document.getElementById('wpTextbox1');
// REMOVE REDLINKED END NODES (PROCESS OUTLINE ENTRIES)
// Development note: Run this section if "Outline of" is in the page title
// Development note: initialize incrementer
// Development note: Loop/nested-loop pair
// Development note: While incrementer > 0, do nested loop
// Development note: Nested loop is modified version of the for loop from
// "remove embedded redlinks" section below, using the same array
// Development note: Use modified regexes to match whole entry (with array term), sans annotation, plus next line.
// That is, do not match entries that have annotations.
// Development note: Save that match
// Development note: Within the saved match, match parent/child
// Development note: If parent/child match fails, remove whole entry (with array term)
// Development note: if match/replace successful, add 1 to incrementer
for (i = 0; i < redlinks.length; i++) {
// Regular expression for piped links and direct links
var reglink1 = new RegExp('\\[\\[\\s*'+RegExp.quote(redlinks[i])+'\\s*\\|\\s*([^\\]]*)\\s*\\]\\]','gi');
var reglink2 = new RegExp('\\[\\[\\s*'+RegExp.quote(redlinks[i])+'\\s*\\]\\]','gi');
// Add total number of matches for both
if (wpTextbox1.value.match(reglink1) !== null) totalredlinks += wpTextbox1.value.match(reglink1).length;
if (wpTextbox1.value.match(reglink2) !== null) totalredlinks += wpTextbox1.value.match(reglink2).length; // Includes categories
// Remove redlinks and convert to unlinked text
wpTextbox1.value = wpTextbox1.value.replace(reglink1,"$1");
wpTextbox1.value = wpTextbox1.value.replace(reglink2,redlinks[i]);
}
// Development note: after for loop, still within while loop, at end of loop, subtract 1 from incrementer.
// (If that drops the incrementer down to zero, the while loop should terminate).
// (Which means, if the for loop goes through the whole array without any replaces, the while loop terminates).
// REMOVE EMBEDDED REDLINKS
for (i = 0; i < redlinks.length; i++) {
// Regular expression for piped links and direct links
var reglink3 = new RegExp('\\[\\[\\s*'+RegExp.quote(redlinks[i])+'\\s*\\|\\s*([^\\]]*)\\s*\\]\\]','gi');
var reglink4 = new RegExp('\\[\\[\\s*'+RegExp.quote(redlinks[i])+'\\s*\\]\\]','gi');
// Add total number of matches for both
if (wpTextbox1.value.match(reglink3) !== null) totalredlinks += wpTextbox1.value.match(reglink3).length;
if (wpTextbox1.value.match(reglink4) !== null) totalredlinks += wpTextbox1.value.match(reglink4).length; // Includes categories
// Remove category rather than simply convert it to unlinked text
if (redlinks[i].substr(0,9) == "Category:") {
var reglink5 = new RegExp('\\[\\[\\s*('+RegExp.quote(redlinks[i])+')\\s*\\]\\]\\n','gi');
wpTextbox1.value = wpTextbox1.value.replace(reglink5,"");
}
// Remove redlinks and convert to unlinked text
wpTextbox1.value = wpTextbox1.value.replace(reglink3,"$1");
wpTextbox1.value = wpTextbox1.value.replace(reglink4,redlinks[i]);
}
// Alert for summary of removed redlinks; total in edit summary
if (totalredlinks > 0) {
document.getElementById('wpSummary').value += "Removed "+totalredlinks+" redlink"+(totalredlinks==1?"":"s")+" via [[User talk:The Transhumanist/OLUtils.js|script]].";
alert("Automatically removed "+totalredlinks+" redlink"+(totalredlinks==1?"":"s")+"!");
} else {
// Redlinks were seen in the article but none were found in the wikicode - check the nevigational boxes for these redlinks
alert('No redlinks in the article! (Check the navigational boxes.)');
}
// Remove the template(s)
wpTextbox1.value = wpTextbox1.value.replace(/\{\{[C|c]leanup red links[^\}]*\}\}/g, "");
wpTextbox1.value = wpTextbox1.value.replace(/\{\{[C|c]leanup Red Link[^\}]*\}\}/g, "");
wpTextbox1.value = wpTextbox1.value.replace(/\{\{[C|c]leanup redlinks[^\}]*\}\}/g, "");
wpTextbox1.value = wpTextbox1.value.replace(/\{\{[C|c]leanup-redlinks[^\}]*\}\}/g, "");
wpTextbox1.value = wpTextbox1.value.replace(/\{\{[T|t]oo many red links[^\}]*\}\}/g, "");
// Clear all saved redlinks
localStorage.OLUtils_redlinks = '';
}
}) ( mediaWiki, jQuery ); //the end of bodyguard function
// END OF PROGRAM