User:The Transhumanist/P-link.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:The Transhumanist/P-link. |
// <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.wikipedia.org/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>