MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| (2 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
/* | /* | ||
* ========================================================== | * ========================================================== | ||
* GladiusRO Wiki - | * GladiusRO Wiki - Complete Interface Configuration | ||
* | * | ||
* 1. Keep Contents permanently in the left sidebar. | * 1. Keep Contents permanently in the left sidebar. | ||
* 2. Hide technical | * 2. Place Contents below Tools. | ||
* | * 3. Hide technical navigation from normal players. | ||
* 4. Hide View source and View history from normal players. | |||
* 5. Show administrative controls to administrators. | |||
* ========================================================== | * ========================================================== | ||
*/ | */ | ||
(function (mw) { | (function (mw, $) { | ||
'use strict'; | 'use strict'; | ||
var refreshTimer = null; | var refreshTimer = null; | ||
var observerStarted = false; | |||
/* | /* | ||
* | * Check whether the current account is an administrator. | ||
* MediaWiki administrators belong to the sysop group. | |||
*/ | */ | ||
function | function isAdministrator() { | ||
var userGroups = mw.config.get('wgUserGroups') || []; | |||
return userGroups.indexOf('sysop') !== -1; | |||
} | |||
/* | |||
* Find the existing left sidebar. | |||
*/ | |||
function getSidebar() { | |||
return document.getElementById('mw-panel') || | return document.getElementById('mw-panel') || | ||
document.getElementById('mw-navigation') || | document.getElementById('mw-navigation') || | ||
| Line 26: | Line 37: | ||
/* | /* | ||
* | * Move Contents permanently into the left sidebar. | ||
*/ | */ | ||
function | function moveContentsToSidebar() { | ||
var sidebar = getSidebar(); | |||
var tools = document.getElementById('p-tb'); | |||
var toc = document.getElementById('toc'); | |||
var container = | |||
document.getElementById('gladius-sidebar-toc'); | |||
if (!sidebar) { | |||
return; | |||
} | |||
/* | |||
* Do not create an empty container on pages | |||
* that do not have a Table of Contents. | |||
*/ | |||
if (!toc && !container) { | |||
return; | |||
} | |||
/* | |||
* Create the sidebar container when required. | |||
*/ | |||
if (!container) { | if (!container) { | ||
container = document.createElement('div'); | container = document.createElement('div'); | ||
| Line 49: | Line 66: | ||
container.id = 'gladius-sidebar-toc'; | container.id = 'gladius-sidebar-toc'; | ||
container.className = 'portal mw-portlet'; | container.className = 'portal mw-portlet'; | ||
container.setAttribute( | container.setAttribute( | ||
'role', | 'role', | ||
'navigation' | 'navigation' | ||
); | ); | ||
container.setAttribute( | container.setAttribute( | ||
'aria-label', | 'aria-label', | ||
'Page contents' | 'Page contents' | ||
); | ); | ||
} | } | ||
/* | /* | ||
* | * Move the original article Contents into | ||
* | * the permanent sidebar container. | ||
*/ | */ | ||
if (toc && toc.parentNode !== container) { | |||
container.appendChild(toc); | |||
if ( | |||
} | } | ||
/* | /* | ||
* | * Place Contents immediately below Tools. | ||
* | * | ||
* | * When Tools is hidden from normal players, | ||
* | * Contents will appear below Main page. | ||
*/ | */ | ||
if (container.parentNode !== sidebar) { | if (tools && tools.parentNode) { | ||
if ( | |||
container.parentNode !== tools.parentNode || | |||
container.previousElementSibling !== tools | |||
) { | |||
tools.parentNode.insertBefore( | |||
container, | |||
tools.nextSibling | |||
); | |||
} | |||
} else if (container.parentNode !== sidebar) { | |||
sidebar.appendChild(container); | sidebar.appendChild(container); | ||
} | } | ||
/* | /* | ||
* | * Hide the container on pages without Contents. | ||
*/ | */ | ||
if (container.querySelector('#toc')) { | if (container.querySelector('#toc')) { | ||
| Line 119: | Line 118: | ||
); | ); | ||
} | } | ||
} | } | ||
/* | /* | ||
* Hide | * Hide an interface element. | ||
*/ | */ | ||
function hideElement(element) { | function hideElement(element) { | ||
if ( | if (element) { | ||
element.style.setProperty( | |||
'display', | |||
'none', | |||
'important' | |||
); | |||
} | } | ||
} | } | ||
/* | /* | ||
* Restore an element | * Restore an interface element. | ||
*/ | */ | ||
function | function showElement(element) { | ||
if ( | if (element) { | ||
element.style.removeProperty('display'); | |||
} | } | ||
} | } | ||
/* | /* | ||
* Hide or show technical navigation | * Hide or show technical navigation. | ||
*/ | */ | ||
function | function updateTechnicalNavigation() { | ||
var | var administrator = isAdministrator(); | ||
var restrictedElements = [ | |||
var | |||
'n-recentchanges', | 'n-recentchanges', | ||
'n-randompage', | 'n-randompage', | ||
| Line 168: | Line 157: | ||
]; | ]; | ||
restrictedElements.forEach(function (elementId) { | |||
var element = document.getElementById( | var element = | ||
document.getElementById(elementId); | |||
if ( | if (administrator) { | ||
showElement(element); | |||
} else { | } else { | ||
hideElement(element); | hideElement(element); | ||
| Line 178: | Line 168: | ||
}); | }); | ||
var sidebar = | /* | ||
* Fallback for older or custom skins using | |||
* different navigation element IDs. | |||
*/ | |||
var sidebar = getSidebar(); | |||
if (!sidebar) { | if (!sidebar) { | ||
| Line 184: | Line 178: | ||
} | } | ||
var restrictedLinkNames = [ | |||
var | |||
'recent changes', | 'recent changes', | ||
'random page', | 'random page', | ||
| Line 194: | Line 184: | ||
'what links here', | 'what links here', | ||
'related changes', | 'related changes', | ||
'upload file', | |||
'special pages', | 'special pages', | ||
'printable version', | 'printable version', | ||
| Line 200: | Line 191: | ||
]; | ]; | ||
var links = sidebar. | var links = sidebar.querySelectorAll('a'); | ||
Array.prototype.forEach.call( | |||
links, | |||
function ( | function (link) { | ||
var | var linkText = (link.textContent || '') | ||
.replace(/\s+/g, ' ') | .replace(/\s+/g, ' ') | ||
.trim() | .trim() | ||
.toLowerCase(); | .toLowerCase(); | ||
if ( | |||
restrictedLinkNames.indexOf( | |||
linkText | |||
) === -1 | |||
) { | |||
) | |||
return; | return; | ||
} | } | ||
var row = | var row = | ||
link.closest('li') || | link.closest('li') || | ||
link.parentElement; | link.parentElement; | ||
if ( | if (administrator) { | ||
showElement(row); | |||
showElement(link); | |||
} else { | } else { | ||
hideElement(row || link); | hideElement(row || link); | ||
| Line 239: | Line 221: | ||
} | } | ||
); | ); | ||
} | |||
/* | |||
* Hide View source and View history from | |||
* everyone except administrators. | |||
*/ | |||
var | function updatePageTabs() { | ||
var administrator = isAdministrator(); | |||
var restrictedTabs = [ | |||
'ca-viewsource', | |||
'ca-history' | |||
]; | |||
restrictedTabs.forEach(function (tabId) { | |||
var tab = document.getElementById(tabId); | |||
if (administrator) { | |||
showElement(tab); | |||
} else { | |||
hideElement(tab); | |||
} | } | ||
); | }); | ||
} | } | ||
/* | /* | ||
* Apply all | * Apply all GladiusRO interface settings. | ||
* | * | ||
* Contents is | * Contents must be moved before Tools is hidden. | ||
*/ | */ | ||
function | function applyGladiusInterface() { | ||
moveContentsToSidebar(); | |||
updateTechnicalNavigation(); | |||
updatePageTabs(); | |||
} | } | ||
/* | /* | ||
* | * Automatically correct Contents if MediaWiki | ||
* recreates it inside the article. | |||
* | |||
*/ | */ | ||
function | function startInterfaceObserver() { | ||
if ( | if ( | ||
observerStarted || | |||
!document.body || | !document.body || | ||
typeof MutationObserver === 'undefined' | typeof MutationObserver === 'undefined' | ||
| Line 304: | Line 270: | ||
} | } | ||
observerStarted = true; | |||
var observer = new MutationObserver(function () { | var observer = new MutationObserver(function () { | ||
| Line 310: | Line 276: | ||
refreshTimer = window.setTimeout( | refreshTimer = window.setTimeout( | ||
applyGladiusInterface, | |||
100 | 100 | ||
); | ); | ||
| Line 322: | Line 288: | ||
/* | /* | ||
* Initial | * Initial startup. | ||
*/ | */ | ||
function | function initialiseGladiusInterface() { | ||
applyGladiusInterface(); | |||
startInterfaceObserver(); | |||
/* | /* | ||
* Additional checks for | * Additional checks for delayed skin components. | ||
*/ | */ | ||
window.setTimeout( | window.setTimeout( | ||
applyGladiusInterface, | |||
250 | 250 | ||
); | ); | ||
window.setTimeout( | window.setTimeout( | ||
applyGladiusInterface, | |||
800 | 800 | ||
); | ); | ||
window.setTimeout( | window.setTimeout( | ||
applyGladiusInterface, | |||
1600 | 1600 | ||
); | ); | ||
} | } | ||
if (document.readyState === 'loading') { | if (document.readyState === 'loading') { | ||
document.addEventListener( | document.addEventListener( | ||
'DOMContentLoaded', | 'DOMContentLoaded', | ||
initialiseGladiusInterface | |||
); | ); | ||
} else { | } else { | ||
initialiseGladiusInterface(); | |||
} | } | ||
window.addEventListener( | window.addEventListener( | ||
'load', | 'load', | ||
applyGladiusInterface | |||
); | ); | ||
/* | /* | ||
* | * Reapply after MediaWiki updates article content. | ||
*/ | */ | ||
if (mw.hook) { | if (mw.hook) { | ||
mw. | mw.hook('wikipage.content').add(function () { | ||
window.setTimeout | window.setTimeout( | ||
applyGladiusInterface, | |||
100 | 100 | ||
); | |||
}); | }); | ||
} | } | ||
}(mediaWiki) | }(mediaWiki, jQuery)); | ||
Latest revision as of 06:42, 2 August 2026
/*
* ==========================================================
* GladiusRO Wiki - Complete Interface Configuration
*
* 1. Keep Contents permanently in the left sidebar.
* 2. Place Contents below Tools.
* 3. Hide technical navigation from normal players.
* 4. Hide View source and View history from normal players.
* 5. Show administrative controls to administrators.
* ==========================================================
*/
(function (mw, $) {
'use strict';
var refreshTimer = null;
var observerStarted = false;
/*
* Check whether the current account is an administrator.
* MediaWiki administrators belong to the sysop group.
*/
function isAdministrator() {
var userGroups = mw.config.get('wgUserGroups') || [];
return userGroups.indexOf('sysop') !== -1;
}
/*
* Find the existing left sidebar.
*/
function getSidebar() {
return document.getElementById('mw-panel') ||
document.getElementById('mw-navigation') ||
document.querySelector('.sidebar');
}
/*
* Move Contents permanently into the left sidebar.
*/
function moveContentsToSidebar() {
var sidebar = getSidebar();
var tools = document.getElementById('p-tb');
var toc = document.getElementById('toc');
var container =
document.getElementById('gladius-sidebar-toc');
if (!sidebar) {
return;
}
/*
* Do not create an empty container on pages
* that do not have a Table of Contents.
*/
if (!toc && !container) {
return;
}
/*
* Create the sidebar container when required.
*/
if (!container) {
container = document.createElement('div');
container.id = 'gladius-sidebar-toc';
container.className = 'portal mw-portlet';
container.setAttribute(
'role',
'navigation'
);
container.setAttribute(
'aria-label',
'Page contents'
);
}
/*
* Move the original article Contents into
* the permanent sidebar container.
*/
if (toc && toc.parentNode !== container) {
container.appendChild(toc);
}
/*
* Place Contents immediately below Tools.
*
* When Tools is hidden from normal players,
* Contents will appear below Main page.
*/
if (tools && tools.parentNode) {
if (
container.parentNode !== tools.parentNode ||
container.previousElementSibling !== tools
) {
tools.parentNode.insertBefore(
container,
tools.nextSibling
);
}
} else if (container.parentNode !== sidebar) {
sidebar.appendChild(container);
}
/*
* Hide the container on pages without Contents.
*/
if (container.querySelector('#toc')) {
container.style.removeProperty('display');
} else {
container.style.setProperty(
'display',
'none',
'important'
);
}
}
/*
* Hide an interface element.
*/
function hideElement(element) {
if (element) {
element.style.setProperty(
'display',
'none',
'important'
);
}
}
/*
* Restore an interface element.
*/
function showElement(element) {
if (element) {
element.style.removeProperty('display');
}
}
/*
* Hide or show technical navigation.
*/
function updateTechnicalNavigation() {
var administrator = isAdministrator();
var restrictedElements = [
'n-recentchanges',
'n-randompage',
'n-help',
'n-help-mediawiki',
'n-helppage',
'p-tb'
];
restrictedElements.forEach(function (elementId) {
var element =
document.getElementById(elementId);
if (administrator) {
showElement(element);
} else {
hideElement(element);
}
});
/*
* Fallback for older or custom skins using
* different navigation element IDs.
*/
var sidebar = getSidebar();
if (!sidebar) {
return;
}
var restrictedLinkNames = [
'recent changes',
'random page',
'help about mediawiki',
'what links here',
'related changes',
'upload file',
'special pages',
'printable version',
'permanent link',
'page information'
];
var links = sidebar.querySelectorAll('a');
Array.prototype.forEach.call(
links,
function (link) {
var linkText = (link.textContent || '')
.replace(/\s+/g, ' ')
.trim()
.toLowerCase();
if (
restrictedLinkNames.indexOf(
linkText
) === -1
) {
return;
}
var row =
link.closest('li') ||
link.parentElement;
if (administrator) {
showElement(row);
showElement(link);
} else {
hideElement(row || link);
}
}
);
}
/*
* Hide View source and View history from
* everyone except administrators.
*/
function updatePageTabs() {
var administrator = isAdministrator();
var restrictedTabs = [
'ca-viewsource',
'ca-history'
];
restrictedTabs.forEach(function (tabId) {
var tab = document.getElementById(tabId);
if (administrator) {
showElement(tab);
} else {
hideElement(tab);
}
});
}
/*
* Apply all GladiusRO interface settings.
*
* Contents must be moved before Tools is hidden.
*/
function applyGladiusInterface() {
moveContentsToSidebar();
updateTechnicalNavigation();
updatePageTabs();
}
/*
* Automatically correct Contents if MediaWiki
* recreates it inside the article.
*/
function startInterfaceObserver() {
if (
observerStarted ||
!document.body ||
typeof MutationObserver === 'undefined'
) {
return;
}
observerStarted = true;
var observer = new MutationObserver(function () {
window.clearTimeout(refreshTimer);
refreshTimer = window.setTimeout(
applyGladiusInterface,
100
);
});
observer.observe(document.body, {
childList: true,
subtree: true
});
}
/*
* Initial startup.
*/
function initialiseGladiusInterface() {
applyGladiusInterface();
startInterfaceObserver();
/*
* Additional checks for delayed skin components.
*/
window.setTimeout(
applyGladiusInterface,
250
);
window.setTimeout(
applyGladiusInterface,
800
);
window.setTimeout(
applyGladiusInterface,
1600
);
}
if (document.readyState === 'loading') {
document.addEventListener(
'DOMContentLoaded',
initialiseGladiusInterface
);
} else {
initialiseGladiusInterface();
}
window.addEventListener(
'load',
applyGladiusInterface
);
/*
* Reapply after MediaWiki updates article content.
*/
if (mw.hook) {
mw.hook('wikipage.content').add(function () {
window.setTimeout(
applyGladiusInterface,
100
);
});
}
}(mediaWiki, jQuery));