User:Aaron Liu/duplinks.js

//This script uses material from Wikipedia user Ucucha's script "duplinks" ( https://en.wikipedia.org/wiki/User:Ucucha/duplinks.js ), which is released under the Creative Commons Attribution-Share-Alike License 3.0 ( http://creativecommons.org/licenses/by-sa/3.0/ )

//See also https://en.wikipedia.org/wiki/User:Ucucha/duplinks for documentation of the original script

// oh uh it also uses User:Evad37/duplinks-alt which had the above notice, this thing adds config "autoDuplinks=true" to automatically highlihgt™

function highlightDuplinks(e = new Event("click")){

e.preventDefault();

// Check if VisualEditor is being used - the element surrounding text is different in VE

let isVisualEditor = window.location.href.search("veaction")>0;

// Get the element immediately surrounding the article text.

let $content = isVisualEditor ? $(".ve-ce-documentNode.ve-ce-branchNode") : $($(".mw-parser-output", "#mw-content-text")[0]);

// Create a separate div to conatin the lead

$lead = $("

").prependTo($content);

// Move the elements containing the lead content into this newly-created div

$lead.nextAll().each( function() {

if (this.classList.contains(".mw-heading2")) {

// Reached the first heading after the lead.

// Returning false breaks out of the jQuery .each() loop early

return false;

}

$lead.append(this);

return true;

});

// Objects to keep track of whether we've seen a link before, and which links are duplicated

let seen = {};

let duplicated = {};

let hasDuplicatedLinks = false;

// Styles

mw.util.addCSS(".duplicate-link { border: 1px solid red; }\n.duplicated-link { border: 1px dashed green; }");

// Detect and mark links which are duplicates

let finddups = function() {

let href = this.attributes.href && this.attributes.href.value;

if (href != undefined && href.indexOf('#') != 0) {

if (seen[href]) {

this.classList.add("duplicate-link");

duplicated[href] = true;

hasDuplicatedLinks = true;

}

else {

seen[href] = true;

}

}

return true;

};

// Detect and mark the first occurance of duplicated links

let markdups = function() {

let href = this.attributes.href && this.attributes.href.value;

if(href != undefined && href.indexOf('#') != 0) {

if(duplicated[href]) {

this.classList.add("duplicated-link");

duplicated[href] = '';

}

}

return true;

};

// Process sections after the lead

mw.util.$content.find('p a').not('#lead *, .infobox *, .navbox *').each(finddups);

mw.util.$content.find('p a').not('#lead *, .infobox *, .navbox *').each(markdups);

// Reset tracking objects, process lead section

seen = {};

duplicated = {};

mw.util.$content.find('#lead p a').not('.infobox *, .navbox *').each(finddups);

mw.util.$content.find('#lead p a').not('.infobox *, .navbox *').each(markdups);

// Show a notice if no duplicates were found

if (!hasDuplicatedLinks && !autoDuplinks) {

mw.notify('No duplicated links were detected');

}

if(autoDuplinks)

autoDuplinks=false; // continue toast after button presses after we've auto'd it

}

$( function($) {

let namespaceNumber = mw.config.get('wgNamespaceNumber');

// only check links in mainspace, userspace (for userspace drafts), and draftspace

let isCorrectNamespace = namespaceNumber === 0 || namespaceNumber === 2 || namespaceNumber === 118;

if (!isCorrectNamespace) {

return;

}

if(typeof autoDuplinks === 'undefined'){

autoDuplinks = false; //out of scope behavior required

}

if(autoDuplinks) highlightDuplinks();

mw.loader.using('mediawiki.util').then(function(){

let portletlink = mw.util.addPortletLink('p-tb', '#', 'Highlight duplicate links', 'ca-findduplicatelinks');

$(portletlink).click( highlightDuplinks );

});

});