User:Acagastya/double.js
Note: After saving, you may have to bypass your browser's cache to see the changes. Mozilla / Firefox / Safari: hold down Shift while clicking Reload, or press Ctrl-Shift-R (Cmd-Shift-R on Apple Mac); IE: hold Ctrl while clicking Refresh, or press Ctrl-F5; Konqueror: simply click the Reload button, or press F5; Opera users may need to completely clear their cache in Tools→Preferences. — More skins
$.when(mw.loader.using(['mediawiki.util']), $.ready).done(function() {
if (
mw.config.get('wgNamespaceNumber') == 0 ||
mw.config.get('wgNamespaceNumber' == 2)
) {
// only check links in mainspace and userspace (for userspace drafts)
return;
}
const portletlink = mw.util.addPortletLink(
'p-article-tools',
'#',
'Highlight duplicate links',
'ca-findduplicatelinks',
'Highlight duplicate links',
'd'
);
$(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.
const content = '.mw-content-ltr';
$(content).prepend(document.createElement('div'));
const 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 { background: gold; color:#000; border: 1px solid red !important}'
);
const finddups = function() {
const href = $(this).attr('href');
if (href !== undefined && href.indexOf('#') !== 0) {
if (seen[href]) {
$(this).addClass('duplicate-link');
count++;
console.log(this.title);
} else {
seen[href] = true;
}
}
return true;
};
// array to keep track of whether we've seen a link before
const seen = [];
let count = 0;
mw.util.$content
.find('p a')
.not('#lead *, .infobox *, .navbox *, .mobile-only *')
.each(finddups);
seen.length = 0;
mw.util.$content
.find('#lead p a')
.not('.infobox *, .navbox *, .sourceTemplate *, .mobile-only *')
.each(finddups);
if (count) alert(`${count} dublicate links found.`);
count = 0;
});
});