MediaWiki:Common.js: Difference between revisions

From GladiusRO Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
/*
/*
  * GladiusRO permanent sidebar configuration.
* ==========================================================
  * 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.
* ==========================================================
  */
  */


jQuery(function ($) {
(function (mw, $) {
     'use strict';
     'use strict';


     function configureGladiusSidebar() {
    var refreshTimer = null;
         var $toc = $('#toc');
    var observerStarted = false;
         var $tools = $('#p-tb');
 
         var $sidebar = $('#mw-panel');
    /*
    * 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;
        }


         /*
         /*
         * Move Contents into the left sidebar.
         * Create the sidebar container when required.
         */
         */
         if ($toc.length && $sidebar.length) {
         if (!container) {
             var $container = $('#gladius-sidebar-toc');
             container = document.createElement('div');


             if (!$container.length) {
             container.id = 'gladius-sidebar-toc';
                $container = $('<div>', {
            container.className = 'portal mw-portlet';
                    id: 'gladius-sidebar-toc',
 
                    class: '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'
            );
        }
    }


             $container.append($toc);
    /*
    * Hide an interface element.
    */
    function hideElement(element) {
        if (element) {
             element.style.setProperty(
                'display',
                'none',
                'important'
            );
        }
    }


            /*
    /*
            * Place Contents below Tools.
    * Restore an interface element.
            * If Tools cannot be found, place Contents
    */
            * at the bottom of the sidebar.
    function showElement(element) {
            */
        if (element) {
             if ($tools.length) {
            element.style.removeProperty('display');
                 $container.insertAfter($tools);
        }
    }
 
    /*
    * 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 {
             } else {
                 $container.appendTo($sidebar);
                 hideElement(element);
             }
             }
         }
         });


         /*
         /*
         * Hide technical links from logged-out players.
         * Fallback for older or custom skins using
         * Logged-in administrators can still see everything.
         * different navigation element IDs.
         */
         */
         if (mw.config.get('wgUserName') === null) {
         var sidebar = getSidebar();
            $('#p-tb').hide();
            $('#n-recentchanges').hide();
            $('#n-randompage').hide();
            $('#n-help').hide();


            /*
        if (!sidebar) {
            * Fallback for this older MediaWiki skin.
            return;
            */
        }
            $('#mw-panel a').each(function () {
                var $link = $(this);
                var text = $.trim($link.text()).toLowerCase();


                var hiddenLinks = [
        var restrictedLinkNames = [
                    'recent changes',
            'recent changes',
                    'random page',
            'random page',
                    'help about mediawiki',
            'help about mediawiki',
                    'what links here',
            'what links here',
                    'related changes',
            'related changes',
                    'special pages',
            'upload file',
                    'printable version',
            'special pages',
                    'permanent link',
            'printable version',
                    'page information'
            'permanent link',
                ];
            'page information'
        ];


                if ($.inArray(text, hiddenLinks) !== -1) {
        var links = sidebar.querySelectorAll('a');
                    var $row = $link.closest('li');


                     if ($row.length) {
        Array.prototype.forEach.call(
                        $row.hide();
            links,
                     } else {
            function (link) {
                         $link.hide();
                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
    );


     /*
     /*
     * Apply immediately and repeat after the older
     * Reapply after MediaWiki updates article content.
    * MediaWiki skin has finished loading.
     */
     */
     configureGladiusSidebar();
     if (mw.hook) {
        mw.hook('wikipage.content').add(function () {
            window.setTimeout(
                applyGladiusInterface,
                100
            );
        });
    }


    window.setTimeout(configureGladiusSidebar, 250);
}(mediaWiki, jQuery));
    window.setTimeout(configureGladiusSidebar, 1000);
});

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));