MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| (12 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
/* | |||
* ========================================================== | |||
* 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; | return; | ||
} | } | ||
/* | /* | ||
* | * Do not create an empty container on pages | ||
* | * that do not have a Table of Contents. | ||
* | */ | ||
* .sidebar | 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 { | |||
document. | 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) { | if (!sidebar) { | ||
| Line 22: | Line 178: | ||
} | } | ||
var | 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)); | |||
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));