MediaWiki:Common.js

De Documentación UNED

Nota: Después de publicar, quizás necesite actualizar la caché de su navegador para ver los cambios.

  • Firefox/Safari: Mantenga presionada la tecla Shift mientras pulsa el botón Actualizar, o presiona Ctrl+F5 o Ctrl+R (⌘+R en Mac)
  • Google Chrome: presione Ctrl+Shift+R (⌘+Shift+R en Mac)
  • Edge: mantenga presionada Ctrl mientras pulsa Actualizar, o presione Ctrl+F5
/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */

/**
 * Auto-abrir miniaturas en <gallery mode="slideshow">
 * Colocar en: MediaWiki:Common.js
 * Autor: Paola + TI
 */

(function () {
  // === CONFIGURACIÓN BÁSICA ===
  // Si querés que aplique a todo el wiki, dejá esta lista vacía.
  // Si querés que aplique SOLO a ciertas páginas, agrega sus títulos exactos:
  // ej.: var PAGES_WHITELIST = ['Galeria', 'Documentación/Proyectos/GaleriaA'];
  var PAGES_WHITELIST = []; // <= lista vacía = aplicar en todas

  // Heurística para ubicar el botón que alterna la tira de miniaturas
  function findToggleButton($root) {
    var $buttons = $root.find('.mw-gallery-slideshow-buttons');
    if (!$buttons.length) return $();

    // Buscar botón/enlace por atributos accesibles y clases comunes
    var $toggle = $buttons.find('button, a').filter(function () {
      var $el = $(this);
      var aria = ($el.attr('aria-label') || '').toLowerCase();
      var title = ($el.attr('title') || '').toLowerCase();
      var cls   = ($el.attr('class') || '').toLowerCase();

      return (
        aria.includes('miniaturas') || aria.includes('thumbnails') ||
        title.includes('miniaturas') || title.includes('thumbnails') ||
        cls.includes('toggle') || cls.includes('thumb')
      );
    }).first();

    // Si no se identificó por heurística, devolver el botón central si hay 3
    if (!$toggle.length) {
      var $candidatos = $buttons.find('button, a');
      if ($candidatos.length === 3) {
        $toggle = $($candidatos.get(1)); // el central
      }
    }
    return $toggle;
  }

  // Intentar abrir las miniaturas de UN slideshow
  function openThumbnails($gallery) {
    // Evitar reentradas
    if ($gallery.data('thumbs-opened')) return;

    var $toggle = findToggleButton($gallery);
    if ($toggle && $toggle.length) {
      // Simular clic solo si aún no está abierto.
      // Muchos skins añaden un estado "activo" al botón; si no, el propio
      // componente evita duplicados.
      $toggle.trigger('click');
      $gallery.data('thumbs-opened', true);
    }
  }

  // Aplicar a todos los slideshows presentes en un contenedor
  function applyToContainer($container) {
    $container.find('.mw-gallery-slideshow').each(function () {
      openThumbnails($(this));
    });
  }

  // Verificar whitelist (si se configuró)
  function isWhitelisted() {
    if (!PAGES_WHITELIST.length) return true;
    var title = mw.config.get('wgPageName') || '';
    // Comparar con títulos como se ven en la URL (espacios = _)
    return PAGES_WHITELIST.some(function (t) {
      return t.replace(/ /g, '_') === title;
    });
  }

  // Salir si no corresponde
  if (!isWhitelisted()) return;

  // 1) Ejecutar cuando se cargue el contenido de la página
  mw.hook('wikipage.content').add(function ($content) {
    applyToContainer($content);

    // 2) Observer: por si el DOM del slideshow se inyecta con retardo
    var target = $content.get(0);
    if (!target) return;

    var observer = new MutationObserver(function (mutations) {
      var shouldCheck = mutations.some(function (m) {
        // Si se agregan nodos que puedan contener el slideshow
        return (m.addedNodes && m.addedNodes.length);
      });
      if (shouldCheck) {
        applyToContainer($content);
      }
    });

    observer.observe(target, { childList: true, subtree: true });

    // 3) Apagar el observer tras unos segundos para no dejarlo eterno
    setTimeout(function () {
      observer.disconnect();
    }, 7000);
  });
})();