MediaWiki:Common.js: Difference between revisions

From Another Chance Wiki
Jump to navigation Jump to search
No edit summary
Tag: Manual revert
No edit summary
Tag: Reverted
Line 3: Line 3:
/* Allows images within galleries to be spoiled if "spoiler:" is put at the start of its caption*/
/* Allows images within galleries to be spoiled if "spoiler:" is put at the start of its caption*/
mw.hook('wikipage.content').add(function ($content) {
mw.hook('wikipage.content').add(function ($content) {
     $content.find('ul.gallery li.gallerybox').each(function () {
     $content.find('ul.gallery').each(function () {
        var $box = $(this);
        var $gallery = $(this);
        var $caption = $box.find('.gallerytext');
        var isWholeGallerySpoiler = $gallery.hasClass('spoiler-image');
         var captionText = $caption.text().trim().toLowerCase();
        var hasAnySpoiler = isWholeGallerySpoiler;
 
        $gallery.find('li.gallerybox').each(function () {
            var $box = $(this);
            var captionText = $box.find('.gallerytext').text().trim().toLowerCase();
            var imgSrc = ($box.find('img').attr('src') || '') + ' ' +
                        ($box.find('img').attr('alt') || '');
 
            var isIndividualSpoiler = captionText.indexOf('spoiler:') === 0;
 
            if (isWholeGallerySpoiler || isIndividualSpoiler) {
                $box.addClass('spoiler-image');
                hasAnySpoiler = true;
 
                if (isIndividualSpoiler) {
                    $box.find('.gallerytext').html(function (i, html) {
                        return html.replace('spoiler: ', '');
                    });
                }
            }
        });
 
         if (hasAnySpoiler) {
            var $btn = $('<button type="button">')
                .text('Reveal all spoilers');
 
            $btn.on('click', function () {
                $gallery.addClass('spoiler-image revealed');
                $gallery.find('.gallerybox.spoiler-image').addClass('revealed');
                $gallery.find('.mw-gallery-slideshow-img-container img')
                        .css('filter', 'none')
                        .removeClass('spoiler-image');
                $btn.remove();
            });


        if (captionText.startsWith('spoiler:')) {
             $gallery.before($btn);
             $box.addClass('spoiler-image thumb');
            $caption.html($caption.html().replace('spoiler: ', ''));
         }
         }
     });
     });


     $content.find('ul.mw-gallery-slideshow').each(function () {
     function applySpoilerToLargeImage($gallery) {
         var $gallery = $(this);
        if ($gallery.hasClass('spoiler-image revealed')) {
            return;
         }


         function updateLargeImage() {
         var $current = $gallery.find('.gallerybox.slideshow-current');
            var $current = $gallery.find('.gallerybox.slideshow-current');
        if (!$current.length) {
            if (!$current.length) {
            $current = $gallery.find('.gallerybox').first();
                $current = $gallery.find('.gallerybox').first();
        }
            }


            var $container = $gallery.find('.mw-gallery-slideshow-img-container');
        var $container = $gallery.find('.mw-gallery-slideshow-img-container');
        var $largeImg = $container.find('img');


            if ($current.hasClass('spoiler-image') && !$current.hasClass('revealed')) {
        if ($current.hasClass('spoiler-image') && !$current.hasClass('revealed')) {
                $container.addClass('spoiler-image');
            $largeImg.addClass('spoiler-image')'
            } else {
        } else {
                $container.removeClass('spoiler-image revealed');
            $largeImg.removeClass('spoiler-imgage');
            }
            $container.removeClass('spoiler-image');
         }
         }
    }
    $content.find('ul.mw-gallery-slideshow').each(function () {
        var $gallery = $(this);


         updateLargeImage();
         applySpoilerToLargeImage($gallery);
        setTimeout(function () { applySpoilerToLargeImage($gallery); }, 150);
        setTimeout(function () { applySpoilerToLargeImage($gallery); }, 500);


         var observer = new MutationObserver(function () {
         var observer = new MutationObserver(function () {
             updateLargeImage();
             applySpoilerToLargeImage($gallery);
         });
         });
         observer.observe($gallery[0], {
         observer.observe($gallery[0], {
            childList: true,
            subtree: true,
             attributes: true,
             attributes: true,
             attributeFilter: ['class'],
             attributeFilter: ['class', 'src']
            subtree: true,
            childList: true
         });
         });
     });
     });


     $content.on('click', '.gallerybox.spoiler', function () {
     $content.on('click', '.gallerybox.spoiler-image', function () {
         $(this).addClass('spoiler-image revealed');
         $(this).addClass('revealed');
        var $gallery = $(this).closest('ul.gallery');
        applySpoilerToLargeImage($gallery);
     });
     });


     $content.on('click', '.mw-gallery-slideshow-img-container.spoiler-image', function (e) {
     $content.on('click', '.mw-gallery-slideshow-img-container.spoiler-image, .mw-gallery-slideshow-img-container', function (e) {
         if ($(e.target).closest('.oo-ui-buttonElement, button, a.oo-ui-buttonElement-button').length) {
         if ($(e.target).closest('.oo-ui-buttonElement, button').length) {
             return;
             return;
         }
         }


         var $container = $(this);
         var $container = $(this).closest('.mw-gallery-slideshow-img-container');
        var $gallery = $container.closest('ul.gallery');
        var $img = $container.find('img');


         if (!$container.hasClass('revealed')) {
         if ($container.hasClass('spoiler-image')) {
             e.preventDefault();
             e.preventDefault();
             e.stopPropagation();
             e.stopPropagation();


             $container.addClass('revealed');
            $img.removeClass('spoiler-image').css('filter', 'none');
             $container.removeClass('spoiler-image');


             $container.closest('ul.gallery')
             $gallery.find('.gallerybox.slideshow-current').addClass('revealed');
                      .find('.gallerybox.slideshow-current')
 
                      .addClass('revealed');
            if ($gallery.hasClass('spoiler-image')) {
                $gallery.addClass('spoiler-image revealed');
                $gallery.find('.gallerybox.spoiler-image').addClass('revealed');
            }
         }
         }
     });
     });
});
});

Revision as of 18:35, 20 August 2026

/* Any JavaScript here will be loaded for all users on every page load. */

/* Allows images within galleries to be spoiled if "spoiler:" is put at the start of its caption*/
mw.hook('wikipage.content').add(function ($content) {
    $content.find('ul.gallery').each(function () {
        var $gallery = $(this);
        var isWholeGallerySpoiler = $gallery.hasClass('spoiler-image');
        var hasAnySpoiler = isWholeGallerySpoiler;

        $gallery.find('li.gallerybox').each(function () {
            var $box = $(this);
            var captionText = $box.find('.gallerytext').text().trim().toLowerCase();
            var imgSrc = ($box.find('img').attr('src') || '') + ' ' +
                         ($box.find('img').attr('alt') || '');

            var isIndividualSpoiler = captionText.indexOf('spoiler:') === 0;

            if (isWholeGallerySpoiler || isIndividualSpoiler) {
                $box.addClass('spoiler-image');
                hasAnySpoiler = true;

                if (isIndividualSpoiler) {
                    $box.find('.gallerytext').html(function (i, html) {
                        return html.replace('spoiler: ', '');
                    });
                }
            }
        });

        if (hasAnySpoiler) {
            var $btn = $('<button type="button">')
                .text('Reveal all spoilers');

            $btn.on('click', function () {
                $gallery.addClass('spoiler-image revealed');
                $gallery.find('.gallerybox.spoiler-image').addClass('revealed');
                $gallery.find('.mw-gallery-slideshow-img-container img')
                        .css('filter', 'none')
                        .removeClass('spoiler-image');
                $btn.remove();
            });

            $gallery.before($btn);
        }
    });

    function applySpoilerToLargeImage($gallery) {
        if ($gallery.hasClass('spoiler-image revealed')) {
            return;
        }

        var $current = $gallery.find('.gallerybox.slideshow-current');
        if (!$current.length) {
            $current = $gallery.find('.gallerybox').first();
        }

        var $container = $gallery.find('.mw-gallery-slideshow-img-container');
        var $largeImg = $container.find('img');

        if ($current.hasClass('spoiler-image') && !$current.hasClass('revealed')) {
            $largeImg.addClass('spoiler-image')'
        } else {
            $largeImg.removeClass('spoiler-imgage');
            $container.removeClass('spoiler-image');
        }
    }

    $content.find('ul.mw-gallery-slideshow').each(function () {
        var $gallery = $(this);

        applySpoilerToLargeImage($gallery);
        setTimeout(function () { applySpoilerToLargeImage($gallery); }, 150);
        setTimeout(function () { applySpoilerToLargeImage($gallery); }, 500);

        var observer = new MutationObserver(function () {
            applySpoilerToLargeImage($gallery);
        });
        observer.observe($gallery[0], {
            childList: true,
            subtree: true,
            attributes: true,
            attributeFilter: ['class', 'src']
        });
    });

    $content.on('click', '.gallerybox.spoiler-image', function () {
        $(this).addClass('revealed');
        var $gallery = $(this).closest('ul.gallery');
        applySpoilerToLargeImage($gallery);
    });

    $content.on('click', '.mw-gallery-slideshow-img-container.spoiler-image, .mw-gallery-slideshow-img-container', function (e) {
        if ($(e.target).closest('.oo-ui-buttonElement, button').length) {
            return;
        }

        var $container = $(this).closest('.mw-gallery-slideshow-img-container');
        var $gallery = $container.closest('ul.gallery');
        var $img = $container.find('img');

        if ($container.hasClass('spoiler-image')) {
            e.preventDefault();
            e.stopPropagation();

            $img.removeClass('spoiler-image').css('filter', 'none');
            $container.removeClass('spoiler-image');

            $gallery.find('.gallerybox.slideshow-current').addClass('revealed');

            if ($gallery.hasClass('spoiler-image')) {
                $gallery.addClass('spoiler-image revealed');
                $gallery.find('.gallerybox.spoiler-image').addClass('revealed');
            }
        }
    });
});