Jump to content

User:Bakertheacre/my alt duplink.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//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
//Borrowed by me to see if I can fix this and try to automate it
$( function($) {
	var namespaceNumber = mw.config.get('wgNamespaceNumber');
	// only check links in mainspace, and userspace (for userspace drafts), and draftspace
	var isCorrectNamespace = namespaceNumber === 0 || namespaceNumber === 2 || namespaceNumber === 118;
    if (!isCorrectNamespace) {
        return;
    }
    mw.loader.using('mediawiki.util').then(function(){
	    var portletlink = mw.util.addPortletLink('p-tb', '#', 'Highlight duplicate links', 'ca-findduplicatelinks');
	    $(portletlink).click( function(e) {
	        e.preventDefault();
	        // create a separate div surrounding the lead
	        // first get the element immediately surrounding the article text. Unfortunately, MW doesn't seem to provide a non-fragile way for that.
	        // also check if VisualEditor is being used - the element surrounding text is different in VE
	        var href = window.location.href;
	        if(href.search("veaction")>0) { var content = ".ve-ce-documentNode.ve-ce-branchNode"; }
	      //  else { var content = ".mw-parser-output"; }
//	        $(content).prepend(document.createElement('div'));
//	        var lead = $(content).children()[0];
	        $(lead).attr('id', 'lead');
//	        $(content).children().each( function() {
	            if(this.nodeName.toLowerCase() == 'h2') {
	                return false;
	            }
	            if($(this).attr('id') != 'lead') {
	                $(lead).append(this);
	            }
	            return true;
	        });
	 
	        // detect duplicate links
	        mw.util.addCSS(".duplicate-link { border: 3px solid red; }");
	        mw.util.addCSS(".duplicated-link { border: 3px dashed green; }");
	        var finddups = function() {
	            var href = $(this).attr('href');
	            if(href !== undefined && href.indexOf('#') !== 0) {
	                if(seen[href]) {
	                    $(this).addClass("duplicate-link");
	                    duplicated[href] = true;
	                }
	                else {
	                    seen[href] = true;
	                  }
	            }
	            return true;
	        };
	        // mark duplicated links
	        var markdups = function() {
	            var href = $(this).attr('href');
	            if(href !== undefined && href.indexOf('#') !== 0) {
	                if(duplicated[href]) {
	                    $(this).addClass("duplicated-link");
	                    duplicated[href] = '';
	                }
	            }
	            return true;
	        };
	        // arrays to keep track of whether we've seen a link before, and which links are duplicated
	        var seen = [];
	        var duplicated = [];
	        mw.util.$content.find('p a').not('#lead *, .infobox *, .navbox *').each(finddups);
	        mw.util.$content.find('p a').not('#lead *, .infobox *, .navbox *').each(markdups);
//	        var seen = [];
//	        var 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);
        });
  });