Diferencia entre revisiones de «MediaWiki:Common.js»

De Documentación UNED

PaolaArias (discusión | contribs.)
Página creada con «Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página: // MediaWiki:Common.js mw.hook('wikipage.content').add(function ($content) { $content.find('.mw-gallery-slideshow').each(function () { var $buttons = $(this).find('.mw-gallery-slideshow-buttons'); if (!$buttons.length) return; // Busca un botón que abra el carrusel de miniaturas. // Según la versión/skin, el botón puede tener distintos…»
 
PaolaArias (discusión | contribs.)
Sin resumen de edición
 
Línea 1: Línea 1:
/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */
/* 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
*/


// MediaWiki:Common.js
(function () {
mw.hook('wikipage.content').add(function ($content) {
   // === CONFIGURACIÓN BÁSICA ===
   $content.find('.mw-gallery-slideshow').each(function () {
  // Si querés que aplique a todo el wiki, dejá esta lista vacía.
    var $buttons = $(this).find('.mw-gallery-slideshow-buttons');
  // Si querés que aplique SOLO a ciertas páginas, agrega sus títulos exactos:
    if (!$buttons.length) return;
  // ej.: var PAGES_WHITELIST = ['Galeria', 'Documentación/Proyectos/GaleriaA'];
  var PAGES_WHITELIST = []; // <= lista vacía = aplicar en todas


    // Busca un botón que abra el carrusel de miniaturas.
  // Heurística para ubicar el botón que alterna la tira de miniaturas
     // Según la versión/skin, el botón puede tener distintos labels o clases;
  function findToggleButton($root) {
     // por eso probamos varias heurísticas seguras.
    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 $toggle = $buttons.find('button, a').filter(function () {
       var $el = $(this);
       var $el = $(this);
       var aria = ($el.attr('aria-label') || '').toLowerCase();
       var aria = ($el.attr('aria-label') || '').toLowerCase();
       var title = ($el.attr('title') || '').toLowerCase();
       var title = ($el.attr('title') || '').toLowerCase();
       var cls  = $el.attr('class') || '';
       var cls  = ($el.attr('class') || '').toLowerCase();
       return aria.includes('miniaturas') || aria.includes('thumbnails') ||
 
            title.includes('miniaturas') || title.includes('thumbnails') ||
       return (
            cls.includes('toggle') || cls.includes('thumb');
        aria.includes('miniaturas') || aria.includes('thumbnails') ||
        title.includes('miniaturas') || title.includes('thumbnails') ||
        cls.includes('toggle') || cls.includes('thumb')
      );
     }).first();
     }).first();


     if ($toggle.length) {
    // Si no se identificó por heurística, devolver el botón central si hay 3
       // Si las miniaturas aún no están visibles, simula el clic.
     if (!$toggle.length) {
       // (El propio componente evita duplicados si ya está abierto.)
       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');
       $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);
   });
   });
});
})();

Revisión actual - 10:41 4 mar 2026

/* 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);
  });
})();