MediaWiki:Gadget-stickyToc.js

De Wiki Calamity Mod Oficial
Ir a la navegación Ir a la búsqueda
Limpiar la caché

Nota: Después de guardar, quizás necesites actualizar la caché de tu navegador para ver los cambios.

  • Firefox/Safari: Mantén presionada la tecla Mayús mientras pulsas el botón Actualizar, o presiona Ctrl+F5 o Ctrl+R (⌘+R en Mac)
  • Google Chrome: presiona Ctrl+Shift+R (⌘+Mayús+R en Mac)
  • Microsoft Edge: presiona la combinación Ctrl+Shift+R
  • Opera: vacía la caché en Herramientas → Preferencias
// Original Code Minecraft Wiki (minecraft.wiki)
// Code adapted to work correctly by Dark
$(function(){
    if (!$('#toc').length) {
        return;
    }
    var i18n = {
        header: 'Índice',
        top: '(Ir Arriba)'
    };

    var tocCollapsed = (localStorage.getItem("sidebar_vector_c_p-toc") !== "n");
    $('<nav id="p-toc" class="vector-menu mw-portlet mw-portlet-toc vector-menu-portal portal" aria-labelledby="p-toc-label" role="navigation">').append(
        $('<h3 id="p-toc-label" class="vector-menu-heading" tabindex="0">').append(
            $('<span class="vector-menu-heading-label">').text(i18n.header)
        ).on("keypress", function(event) {
            if (event.which == 13) {
                $(this).trigger("click");
                event.stopImmediatePropagation()
            }
        }).on("click", function(event) {
            var $el = $(this).parent();
            event.stopPropagation();
            $el.toggleClass("collapsed");
            if($el.hasClass("collapsed")){
                localStorage.setItem("sidebar_vector_c_p-toc", "y");
                $el.find(".vector-menu-content").slideUp("fast");
                $el.css({'margin-right': '', 'margin-left': ''});
            }
            else{
                localStorage.setItem("sidebar_vector_c_p-toc", "n");
                $el.find(".vector-menu-content").slideDown("fast");
                var $toc = $el.find(".vector-menu-content-list")[0];
                if ($toc.clientWidth < $toc.scrollWidth) {
                    $el.css({'margin-right': '0', 'margin-left': '0'});
                }
                if (window.innerWidth >= 982 && $toc.clientWidth < $toc.scrollWidth) {
                    $el.css({'margin-right': '-0.5em', 'margin-left': '-0.5em'});
                }
            }
        }),
        $('<div class="vector-menu-content">').append(
            $('<ul class="vector-menu-content-list">').append(
                $('<li class="toclevel-1 tocsection-0">').append($('<a href="#">').append(
                    $('<span class="toctext">').text(i18n.top)
                )),
                $('#toc > ul').children().clone()
            )
        ).addClass($('#toc').parent().prop('class').split(/\s+/).filter(function(classname) {
            return classname.startsWith('toc-');
        }).join(' ')).css('display', tocCollapsed ? 'none' : '')
    ).addClass(tocCollapsed ? 'collapsed' : '').appendTo('#mw-panel');

    mw.loader.using( ['ext.gadget.sectionObserver'], function(require) {
        var initSectionObserver = require('ext.gadget.sectionObserver');
        var allSections = document.querySelectorAll('#firstHeading, .mw-headline');
        var sectionObserver = initSectionObserver({topMargin: 20, onIntersection: onIntersection})
        sectionObserver.setElements(allSections);
        sectionObserver.calcIntersection();

        allSections = Array.from(allSections);
        var tocList = $('#p-toc .vector-menu-content-list')[0];
        var tocSections = $('#p-toc .vector-menu-content-list li');
        var baseOffset = $('#p-toc .tocsection-0 .toctext')[0].offsetTop;

        function onIntersection(section) {
            var index = allSections.indexOf(section);
            $('#p-toc .tocsection-current').removeClass('tocsection-current');
            var tocSection = tocSections.eq(index).addClass('tocsection-current');
            if ( tocSection.is(':hidden') && index > 0 ) return onIntersection(allSections[index - 1]);
            var tocSectionPos = tocSection[0].offsetTop - baseOffset;
            if ( tocSectionPos < tocList.scrollTop + (tocList.clientHeight * 0.15) ) {
                tocList.scrollTo({top: tocSectionPos - (tocList.clientHeight * 0.3)});
            }
            else if ( tocSectionPos > tocList.scrollTop + (tocList.clientHeight * 0.85) ) {
                tocList.scrollTo({top: tocSectionPos - (tocList.clientHeight * 0.7)});
            }
        }
    } );
});