// <syntaxhighlight lang="javascript">
/*
P-link.js
Development notes:
What this script will do is create 3 menu items:
P link on category - if on category edit page it places corresponding portal link,
if on category page it starts category edit page,
otherwise it jumps to like-named category page
P link on template - if on template edit page it places corresponding portal link,
if on template page it starts template edit page,
otherwise it jumps to like-named template page
P link on root - if on article edit page it places corresponding portal link,
if on article page it starts article edit page,
otherwise jumps to like-named article page
The script will work on portal, category, template, and article pages.
This is a rudimentary version, and so it will require that the desired menu item be clicked on as a separate action
up to 3 times.
*/
// ============== Set up ==============
// Start off with a bodyguard function to reserve the aliases mw and $ within
// the scope of this function, so that we can rely on them meaning "mediawiki"
// and "jQuery", respectively: these alias definitions follow this function's
// closing curly bracket at the end of the script.
( function ( mw, $ ) {
// ============== Load dependencies ==============
// For support of mw.util.addPortletLink
mw.loader.using( ['mediawiki.util'], function () {
// ============== ready() event listener/handler ==============
// below is jQuery short-hand for $(document).ready(function() { ... });
// it makes the rest of the script wait until the page's DOM is loaded and ready
$(function() {
// ============== End of set up ==============
// ============== CORE PROGRAM ==============
// ============== Conditionals ==============
// ============== Check program status ===========
// Development notes:
// if on category edit page and local storage says status 1
// jumpAndEdit()
// else if on category page and local storage says status 2
// jumpAndEdit()
// else if on non-category page and local storage says status 3
// jumpAndEdit()
// ============== When started fresh (not a reiteration)
if ((document.title.indexOf("Portal:") != -1) || (document.title.indexOf("Category:") != -1) || (document.title.indexOf("Template:") != -1) || (mw.config.get('wgNamespaceNumber') === 0)) {
pLinkOnTemp();
pLinkOnRoot();
pLinkOnCat();
}
// ============== End of conditionals ==============
// ============== END OF CORE PROGRAM ==============
} );
} );
// ============== Subroutines ==============
function pLinkOnCat() {
//Create linked menu item on side bar menu (in toolbox section)
var menuItemCat = mw.util.addPortletLink( 'p-tb', '', 'P link on category', 'tbPLinkOnCat', 'on category page places portal link, otherwise jumps to like-named category page', '', 'tbPLinkOnRoot');
// Bind click handler
$( menuItemCat ).click( function ( event ) {
event.preventDefault();
// above line prevents any default action,
// as we want only the following action to run:
// Do some stuff when clicked...
jumpAndEdit();
});
}
function pLinkOnRoot() {
//Create linked menu item on side bar menu (in toolbox section)
var menuItemRoot = mw.util.addPortletLink( 'p-tb', '', 'P link on root', 'tbPLinkOnRoot', 'on article page places portal link, otherwise jumps to like-named article page', '', 'tbPLinkOnTemp');
// Bind click handler
$( menuItemRoot ).click( function ( event ) {
event.preventDefault();
// above line prevents any default action,
// as we want only the following action to run:
// Do some stuff when clicked...
if (mw.config.get('wgNamespaceNumber') === 0) {
// Invoke a function by its name
// (The function itself is defined further down the page, using the word "function").
insertPLinkOnRoot();
} else if (document.title.indexOf("Category:") === 0) {
// Invoke a function by its name; this one is like clicking "edit source"
// (The function itself is defined further down the page, using the word "function").
invokeEditPage();
// If in root namespace, jump to like-named category page, otherwise replace prefix and jump
// We have to handle two kinds of pages: articles (no prefix) and prefixed (Portal: or Template:)
} else if (mw.config.get('wgNamespaceNumber') === 0) {
jumpToCatFromRoot();
} else {
jumptoCatFromPrefix();
}
});
}
function pLinkOnTemp() {
//Create linked menu item on side bar menu (in toolbox section)
var menuItemCat = mw.util.addPortletLink( 'p-tb', '', 'P link on template', 'tbPLinkOnTemp', 'on template page places portal link, otherwise jumps to like-named template page', '', 't-whatlinkshere');
// Bind click handler
$( menuItemCat ).click( function ( event ) {
event.preventDefault();
// above line prevents any default action,
// as we want only the following action to run:
// Do some stuff when clicked...
jumpAndEdit();
});
}
function jumpAndEdit() {
if (document.title.indexOf("Editing Category:") != -1) {
// Invoke a function by its name
// (The function itself is defined further down the page, using the word "function").
insertPLinkOnCat();
} else if (document.title.indexOf("Category:") === 0) {
// Invoke a function by its name; this one is like clicking "edit source"
// (The function itself is defined further down the page, using the word "function").
invokeEditPage();
// If in root namespace, jump to like-named category page, otherwise replace prefix and jump
// We have to handle two kinds of pages: articles (no prefix) and prefixed (Portal: or Template:)
} else if (mw.config.get('wgNamespaceNumber') === 0) {
jumpToCatFromRoot();
} else {
jumptoCatFromPrefix();
}
}
function insertPLinkOnCat() {
var wpTextbox1 = document.getElementById('wpTextbox1');
// Insert portal box into the editing box
// The following is a modification from "Your first script" in
// https://en.wiki.x.io/w/index.php?title=Wikipedia:User_scripts/Guide&oldid=852316213
document.editform.wpTextbox1.value = "{" + "{Portal|" + "{" + "{subst:PAGENAME}}}}" + wpTextbox1.value;
// fill edit summary
document.getElementById('wpSummary').value += "add portal link";
// Generate a preview of the page.
$('#wpPreviewWidget > input').click();
}
function insertPLinkOnRoot() {
var wpTextbox1 = document.getElementById('wpTextbox1');
// Using regex, insert portal box into the editing box
// (See redlinkremover on how to do this, or figure out another way)
// ?????? Development note: This needs to replace ==See also== and the
// material that follows it with material including the new list item
// Developoment note: See AWB for the regexes used
document.editform.wpTextbox1.value = "{" + "{Portal|" + "{" + "{subst:PAGENAME}}}}" + wpTextbox1.value;
// fill edit summary
document.getElementById('wpSummary').value += "add inline list item portal link";
// Generate a preview of the page.
$('#wpPreviewWidget > input').click();
}
function invokeEditPage() {
// Get edit page on screen
window.location = window.location.href.substr(0, window.location.href.indexOf('#'))+"?action=edit";
}
function jumpToCatFromRoot() {
var currentPath = location.pathname;
var regex = /wiki\//;
var newPath = currentPath.replace(regex, 'wiki/Category:');
window.location.assign(location.protocol + "//" + location.host + newPath);
}
function jumptoCatFromPrefix() {
var currentPath2 = location.pathname;
var regex2 = /wiki\/.*?:/;
var newPath2 = currentPath2.replace(regex2, 'wiki/Category:');
window.location.assign(location.protocol + "//" + location.host + newPath2);
}
// ============== End of Subroutines ==============
}) ( mediaWiki, jQuery ); //the end of bodyguard function
// END OF PROGRAM
// </syntaxhighlight>