MediaWiki:Common.js
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/*
* ==========================================================
* 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));