User:Xover/EasyLinks.js
Appearance
Note: After saving, changes may not occur immediately. Click here to learn how to bypass your browser's cache.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Cmd-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (Cmd-Shift-R on a Mac)
- Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Clear the cache in Tools → Preferences
For details and instructions about other browsers, see Wikipedia:Bypass your cache.
Code that you insert on this page could contain malicious content capable of compromising your account. If you are unsure whether code you are adding to this page is safe, you can ask at the central discussion page, Scriptorium. The code will be executed when previewing this page under some skins, including Monobook. You can in the interim if you wish to refresh the content sooner under another skin. |
Documentation for this script can be added at User:Xover/EasyLinks. |
// Make sure the modules we need are loaded (will only load if not already)
mw.loader.using(['mediawiki.api', 'mediawiki.util'], () => {
// Wait for the page to be parsed
$(() => {
// TODO: Check for special pages and abort or…
// TODO: …only whitelist namespaces known to make sense.
// Let's at least disable Special:-pages by default to start.
if (mw.config.get('wgCanonicalNamespace') === 'Special') {
return;
}
// And on the Main Page
if (mw.config.get('wgIsMainPage')) {
return;
}
// Disable completely on mobile (and desktop users with Minerva)
if ($('body').hasClass('skin-minerva')) {
return;
}
// If URL params include &diff= then this is a diff page, so add diffLink portlet
if (mw.util.getParamValue('diff')) {
let diffPortlet = mw.util.addPortletLink(
'p-cactions', '#', 'Get diff link', 'ca-getdiffwl', 'Get a wikilink to this diff'
);
$(diffPortlet).on('click', (e) => {
e.preventDefault();
doGetDiffWL();
});
}
// Add permalink portlet unconditionally; if &oldid= is missing we use the
// latest version of the page.
let permalinkPortlet = mw.util.addPortletLink(
'p-cactions', '#', 'Get permalink', 'ca-getpermalink', 'Get a permanent wikilink to this page'
);
$(permalinkPortlet).on('click', (e) => {
e.preventDefault();
doGetPermaWL();
});
// Add section link and permalink links to all headings (except page title)
$('.mw-heading').each((i, h) => {
let headline = $(h).children('h2, h3, h4, h5, h6');
let editsection = $(h).children('.mw-editsection');
let openbracket = $('<span>[ </span>');
let closebracket = $('<span> ]</span>');
let divider = $('<span> | </span>');
let wlspan = $('<a class="getwikilink" href="#">link</a>').on('click', (e) => {
e.preventDefault();
doGetSectionWL($(headline).attr('id'));
});
let permaspan = $('<a class="getpermalink" href="#">permalink</span>').on('click', (e) => {
e.preventDefault();
doGetPermaSectionWL($(headline).attr('id'));
});
let containerspan = $('<span class="mw-editsection getlinks"></span>');
$(containerspan).append(openbracket, wlspan, divider, permaspan, closebracket);
if ($(editsection).length > 0) {
$(containerspan).insertAfter(editsection);
} else {
$(containerspan).insertAfter(headline);
}
});
}); // END: $(document).ready()
}); // END: mw.loader.using()
// Common utility function to put the link(s) on the user's clipboard,
// and pop up a notification that it happened.
function copyAndNotify(description, data) {
navigator.clipboard.writeText(data);
mw.notify(
description + ' was automatically copied to your clipboard.',
{title: 'Link copied', type: 'info', tag: 'EasyLinksCopied'}
);
} // END: copyAndNotify()
// Get the diff id from URL params and create a diff wikilink to that rev.
function doGetDiffWL() {
const diff = mw.config.get('wgDiffNewId');
let diffLink = '[[Special:Diff/' + diff + '|' + diff + ']]';
copyAndNotify('The wikilink for this diff', diffLink);
} // END: doGetDiffWL()
// Get the old rev id from URL params, if present, or the latest rev otherwise.
function doGetPermaWL() {
let oldid;
let kind = '';
if (mw.util.getParamValue('oldid')) {
oldid = mw.util.getParamValue('oldid');
kind = 'this';
} else {
oldid = mw.config.get('wgCurRevisionId');
kind = 'the latest';
}
let oldidLink = '[[Special:PermanentLink/' + oldid + '|' + oldid + ']]';
copyAndNotify('A permanent wikilink to ' + kind + ' revision', oldidLink);
} // END: doGetPermaWL()
const aliases = {
'Wikisource:Bot_requests': 'WS:BR',
'Wikisource:Proposed_deletions': 'WS:PD',
'Wikisource:Copyright_discussions': 'WS:CV',
'Wikisource:Scriptorium': 'WS:S',
'Wikisource:Scriptorium/Help': 'WS:S/H',
};
// Creare a wikilink to a section, irrespective of namespace.
function doGetSectionWL(headlineid) {
let h = $('#' + $.escapeSelector(headlineid));
let title = $(h).text();
let page = mw.config.get('wgPageName');
const alias = aliases[page];
if (alias) {
title = alias + '#' + title;
}
let sectionLink = '[[' + page + '#' + headlineid + '|' + title + ']]';
copyAndNotify(
'A wikilink to this section',
sectionLink
);
} // END: doGetSectionWL()
// Create a permalink to a specific section.
function doGetPermaSectionWL(headlineid) {
let h = $('#' + $.escapeSelector(headlineid));
let title = $(h).text();
let oldid;
// If url contains &oldid= then this is a specific revision of the page,
// otherwise grab the latest revision and use that.
let kind = '';
if (mw.util.getParamValue('oldid')) {
oldid = mw.util.getParamValue('oldid');
kind = 'this';
} else {
oldid = mw.config.get('wgCurRevisionId');
kind = 'the latest';
}
const alias = aliases[mw.config.get('wgPageName')];
if (alias) {
title = alias + '#' + title;
}
let permaSectionLink = '[[Special:PermanentLink/' + oldid + '#' + headlineid + '|' + title + ']]';
copyAndNotify(
'A wikilink to this section at ' + kind + ' revision',
permaSectionLink
);
} // END: doGetPermaSectionWL()