Ugrás a tartalomhoz

„MediaWiki:Common.js” változatai közötti eltérés

Innen: MKOE wiki
Nincs szerkesztési összefoglaló
Nincs szerkesztési összefoglaló
375. sor: 375. sor:


$(document).ready(function() {
$(document).ready(function() {
     // 1. Dinamikusan injektáljuk a külső képeket a Luától kapott konténerekbe
     // 1. A külső képek dinamikus injektálása a DOM-ba
     $('.kulso-url-doboz').each(function() {
     $('.kulso-url-doboz').each(function() {
         var $doboz = $(this);
         var $doboz = $(this);
         var imgUrl = $doboz.attr('data-src');
         var imgUrl = $doboz.attr('data-src');
         var felirat = $doboz.find('.galeria-felirat').text() || '';
         var felirat = $doboz.find('.galeria-felirat').text() || '';
       
 
         // Létrehozzuk a LightGallery-kompatibilis hivatkozást és a képet
         // LightGallery-kompatibilis rögzítési pont (Anchor) létrehozása
         var $lgItem = $('<a>', {
         var $lgItem = $('<a>', {
             'href': imgUrl,
             'href': imgUrl,
388. sor: 388. sor:
             'data-sub-html': '<h4>' + felirat + '</h4>'
             'data-sub-html': '<h4>' + felirat + '</h4>'
         });
         });
          
 
         // A tényleges kép létrehozása és beágyazása
         $('<img>', {
         $('<img>', {
             'src': imgUrl,
             'src': imgUrl,
394. sor: 395. sor:
             'alt': felirat
             'alt': felirat
         }).appendTo($lgItem);
         }).appendTo($lgItem);
       
 
         // Betesszük a felirat elé
         // Betesszük a felirat elé, az ideiglenes szöveges [Link]-et pedig kitakarítjuk
         $doboz.prepend($lgItem);
         $doboz.prepend($lgItem);
        // Eltávolítjuk az ideiglenes szöveges linket
         $doboz.find('.url-link-szoveg').remove();
         $doboz.find('.url-link-szoveg').remove();
     });
     });


     // 2. A meglévő LightGallery inicializálása, kiterjesztve az új egyedi osztályunkra is
     // 2. A LightGallery inicializálása a vegyes szelektorral
     // Feltételezve, hogy a '.egyedi-galeria-container' a közös szülő
     // Így egyetlen galériaként fogja kezelni a helyi képeket és a külső hivatkozásokat is
     if (typeof $.fn.lightGallery === 'function') {
     if (typeof $.fn.lightGallery === 'function') {
         $('.egyedi-galeria-container').lightGallery({
         $('.egyedi-galeria-container').lightGallery({
             selector: '.lg-vegyes-item, .thumb a.image' // Kezeli a külső linkeket és a gyári wiki képeket is egy galériában!
             selector: '.lg-vegyes-item, .thumb a.image',
            thumbnail: true,
            animateThumb: true,
            showThumbByDefault: true
         });
         });
     }
     }
});
});

A lap 2026. június 6., 23:57-kori változata

/* LightGallery + Commons API Integráció */
(function() {
    // Csak akkor fusson, ha van galéria az oldalon
    if ($('.wiki-dynamic-gallery').length === 0) return;

    // Erőforrások betöltése mw.loader-rel
    mw.loader.addStyleTag('@import "https://cdn.jsdelivr.net/npm/lightgallery@2.4.0/css/lightgallery-bundle.min.css";');

    $.getScript('https://cdn.jsdelivr.net/npm/lightgallery@2.4.0/lightgallery.umd.min.js')
        .done(function() {
            console.log('LightGallery 2.4.0 inicializálva.');
            initWikiDynamicGallery();
        });

    function initWikiDynamicGallery() {
        $('.wiki-dynamic-gallery').each(function() {
            var $container = $(this);
            if ($container.data('initialized')) return;
            $container.data('initialized', true);

            var searchTerm = $container.data('search');
            var limit = $container.data('limit') || 3;
            var targetHeight = 200;

            var apiUrl = "https://commons.wikimedia.org/w/api.php?action=query&format=json&generator=search&gsrsearch=File:" +
                         encodeURIComponent(searchTerm) + "&gsrlimit=" + limit +
                         "&prop=imageinfo&iiprop=url|size&iiurlheight=" + targetHeight + "&origin=*";

            $.getJSON(apiUrl, function(data) {
                if (data && data.query && data.query.pages) {
                    var pages = data.query.pages;
                    var galleryHtml = '';

                    for (var id in pages) {
                        if (!pages[id].imageinfo) continue;
                        var img = pages[id].imageinfo[0];
                        var title = pages[id].title.replace('File:', '');

                        galleryHtml += '<a href="' + img.url + '" class="lg-item" data-src="' + img.url + '" data-sub-html="<h4>' + title + '</h4>">';
                        galleryHtml += '  <img src="' + img.thumburl + '" style="height:' + targetHeight + 'px; width:auto; margin:5px; border-radius:6px; cursor:pointer;" alt="' + title + '" />';
                        galleryHtml += '</a>';
                    }
                    $container.html(galleryHtml);

                    if (window.lightGallery) {
                        lightGallery($container[0], {
                            selector: '.lg-item',
                            licenseKey: '0000-0000-000-0000'
                        });
                    }
                }
            });
        });
    }
})();


// Bootstrap Icons betöltése
var link = document.createElement("link");
link.rel = "stylesheet";
//link.href = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css";
link.href = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css";
document.head.appendChild(link);

/* Az ide elhelyezett JavaScript kód minden felhasználó számára lefut az oldalak betöltésekor. */
// Fülek elrejtése anonim felhasználók számára
if (mw.config.get('wgUserName') === null) {
    var hideTabs = function () {
        var el1 = document.querySelector('#ca-history');
        var el2 = document.querySelector('#ca-viewsource');
        if (el1) el1.style.display = 'none';
        if (el2) el2.style.display = 'none';

        // Ha mindkét elem megtalálható, leállítjuk az ismétlést
        if (el1 || el2) clearInterval(observer);
    };

    // 100ms-onként ellenőrizzük, hogy megjelentek-e a fülek
    var observer = setInterval(hideTabs, 100);
}

/* MediaWikiben az alapértelmezett viselkedés az, hogy a külső hivatkozások (pl. [https://példa.hu link szövege]) ugyanazon a lapon nyílnak meg.
Ahhoz, hogy ezek új lapon nyíljanak meg:*/
$(function () {
  $('a.external').attr('target', '_blank');
});

// Egy "Tetejére" gomb megjelenítése és kattintáskor scrollozás az oldal tetejére
$(function() {
    // Létrehozzuk a gombot
    var $btn = $('<button/>', {
        //text: '⬆ Tetejére',
        html: '<i class="bi bi-arrow-up-square"></i> Tetejére',
        id: 'backToTopBtn',
        title: 'Az oldal tetejére',
        css: {
            position: 'fixed',
            bottom: '20px',
            right: '20px',
            padding: '10px 15px',
            'font-size': '14px',
            'background-color': '#888446ff',
            color: 'white',
            border: 'none',
            'border-radius': '10px',
            cursor: 'pointer',
            display: 'none',   // alapból rejtve
            width: '100px',
            'z-index': 1000
        },
        click: function() {
            window.scrollTo({top: 0, behavior: 'smooth'});
        }
    });

    // A body végére tesszük a gombot
    $('body').append($btn);

    // Megjelenítés, ha az oldal le van görgetve 100px-nél
    $(window).scroll(function() {
        if ($(window).scrollTop() > 100) {
            $btn.fadeIn();
        } else {
            $btn.fadeOut();
        }
    });
});

// Egy "Vissza" gomb megjelenítése, ami az előző oldalra mutat
$(function() {
    // Vissza gomb létrehozása
    var $backBtn = $('<button/>', {
//      text: '⬅ Vissza',
        html: '<i class="bi bi-arrow-left-square"></i> Vissza',
        id: 'backBtn',
        title: 'Előző oldal',
        css: {
            position: 'fixed',
            bottom: '60px',  // a "Tetejére" gomb fölé kerül
            right: '20px',
            padding: '10px 15px',
            'font-size': '14px',
            'background-color': '#547454ff',
            color: 'white',
            border: 'none',
            'border-radius': '10px',
            cursor: 'pointer',
            display: 'none',
            width: '100px',
            'z-index': 1000
        },
        click: function() {
            window.history.back();
        }
    });

    // Hozzáadás a DOM-hoz
    $('body').append($backBtn);

    // Megjelenítés görgetés után
    $(window).scroll(function() {
        if ($(window).scrollTop() > 100) {
            $backBtn.fadeIn();
        } else {
            $backBtn.fadeOut();
        }
    });
});

/* Taxobox ikonok megnyitása új lapon */
$(document).ready(function() {
    $('.taxobox-icons a').attr('target', '_blank');
});

/**
 * DataTables 2.1.8 integráció - MediaWiki javított verzió
 */
mw.loader.using( ['jquery', 'mediawiki.util'] ).done( function () {

    if ( $( '.datatable-hook' ).length > 0 ) {

        // DataTables JS betöltése
        $.getScript( 'https://cdn.datatables.net/2.1.8/js/dataTables.min.js' )
            .done( function() {

                $( '.datatable-hook' ).each( function() {
                    var $table = $(this);

                    // 1. LÉPÉS: A MediaWiki hibás struktúrájának javítása
                    // Megkeressük az első sort, amiben TH (fejléc) cellák vannak
                    var $headerRow = $table.find( 'tr:has(th)' ).first();

                    if ( $headerRow.length > 0 ) {
                        // Létrehozunk egy THEAD-et és belemozgatjuk a fejléc sort
                        var $thead = $( '<thead></thead>' );
                        $headerRow.detach().appendTo( $thead );
                        $table.prepend( $thead );
                    }

                    // 2. LÉPÉS: Inicializálás a javított táblázaton
                    $table.DataTable({
                        language: {
                            url: '//cdn.datatables.net/plug-ins/2.1.8/i18n/hu.json'
                        },
                        layout: {
                            topStart: 'pageLength',
                            topEnd: 'search',
                            bottomStart: 'info',
                            bottomEnd: 'paging'
                        },
                        pageLength: 10,
                        // Biztonsági beállítás: ne álljon le hibával, ha mégis eltérés lenne
                        columnDefs: [ { targets: '_all', defaultContent: '' } ]
                    });
                });

            })
            .fail( function() {
                console.error( 'Hiba: Nem sikerült betölteni a DataTables szkriptet.' );
            });
    }
});

mw.hook('wikipage.content').add(function () {

    // --- 0. LÉPÉS: BIZTONSÁGI SZŰRÉS (GUARD CLAUSE) ---
    // Csak akkor futunk tovább, ha az oldal ténylegesen a határozókulcsok közé tartozik.
    const aktualisKategoriak = mw.config.get('wgCategories') || [];
    if (!aktualisKategoriak.includes('Szukkulens növényhatározó kulcsok')) {
        return;
    }

    const regexKoztespont = /^Szukkulens határozó:/;

    // Megkeressük a MediaWiki fő tartalomgyűjtő divjét
    const bodyContent = document.getElementById('bodyContent');

    // Ha az adott oldalon valamiért nem létezik a div, leállítjuk a futást, hogy ne legyen hiba
    if (!bodyContent) return;

    // --- ELSŐ LOGIKA: Köztes határozó oldalak linkjei (Nyíl beemeléssel) ---
    bodyContent.querySelectorAll('a').forEach(a => {
        const teljesNev = a.getAttribute('title') || '';

        if (regexKoztespont.test(teljesNev)) {
            // Nem vágjuk le a "Szukkulens határozó:" részt, csak a piros linkek MediaWiki üzenetét
            let tisztaGombSzöveg = teljesNev.replace(/\s*\(a lap nem létezik\)$/, '');

            a.innerHTML = ''; // Kiürítjük a link belsejét

            const arrowSpan = document.createElement('span');
            arrowSpan.className = 'arrow-prefix';
            arrowSpan.textContent = '→';

            // Szóköz beszúrása a nyíl után külön textNode-ként
            const spaceNode = document.createTextNode(' ');
            const textNode = document.createTextNode(tisztaGombSzöveg);

            a.appendChild(arrowSpan);
            a.appendChild(spaceNode);
            a.appendChild(textNode);

            a.className = "new hatarozo-koztespont-btn";

            let previousNode = a.previousSibling;
            if (previousNode && previousNode.nodeType === Node.TEXT_NODE) {
                previousNode.textContent = previousNode.textContent.replace(/[→\s\xA0&rarr;]+$/, '');
            }
        }
    });

    // --- MÁSODIK LOGIKA: Határozó kulcs valódi végpontjai (Példák kizárása) ---
    bodyContent.querySelectorAll('li').forEach(li => {
        const bendoLinkek = li.querySelectorAll('a[href*="/wiki/"]:not(.external)');

        bendoLinkek.forEach(link => {
            const title = link.getAttribute('title') || '';

            // Ha ez egy köztes pont, az első logika már elintézte, lépjünk tovább
            if (regexKoztespont.test(title) || link.classList.contains('hatarozo-koztespont-btn')) {
                return;
            }

            // Példafajok kiszűrése (zárójeles "Pl." részek)
            let vizsgaltNode = link.previousSibling;
            if (link.parentElement.tagName.toLowerCase() === 'i') {
                vizsgaltNode = link.parentElement.previousSibling;
            }

            let elotteLevoSzo = "";
            if (vizsgaltNode && vizsgaltNode.nodeType === Node.TEXT_NODE) {
                elotteLevoSzo = vizsgaltNode.textContent;
            }

            // Ha nem példafaj, akkor ez egy igazi végpont (konkrét növény szócikk)
            if (!elotteLevoSzo.includes('Pl.') && !elotteLevoSzo.includes('(')) {

                if (!link.classList.contains('hatarozo-vegpont-btn')) {
                    // Csak a szöveg ELEJÉRŐL és VÉGÉRŐL takarítjuk el a nyilakat/szóközöket, a közepét békén hagyjuk!
                    const tisztaFajnev = link.textContent.replace(/^[→\s\xA0]+/, '').replace(/[→\s\xA0]+$/, '').trim() || title;

                    link.innerHTML = `<span class="arrow-prefix">→ </span><span class="botanical-name">${tisztaFajnev}</span>`;
                    link.classList.add("hatarozo-vegpont-btn");

                    if (link.parentElement.tagName.toLowerCase() === 'i') {
                        link.parentElement.style.fontStyle = "normal";
                    }
                }

                if (vizsgaltNode && vizsgaltNode.nodeType === Node.TEXT_NODE) {
                    vizsgaltNode.textContent = vizsgaltNode.textContent.replace(/[→\s\xA0&rarr;]+$/, '');
                }
            }
        });
    });
});

/* Új Vegyes Galéria LightGallery Integráció */
(function() {
    // Csak akkor fusson, ha az új típusú galéria megtalálható az oldalon
    if ($('.egyedi-galeria-container').length === 0) return;

    // Megvárjuk, amíg a LightGallery betöltődik (kihasználjuk, hogy a másik script már letölti)
    var checkCount = 0;
    var interval = setInterval(function() {
        if (window.lightGallery) {
            clearInterval(interval);
            initVegyesGaleria();
        }
        // Biztonsági fék, ha 5 másodpercig nem töltene be a cdn, ne fusson végtelenül
        if (++checkCount > 50) clearInterval(interval);
    }, 100);

    function initVegyesGaleria() {
        $('.egyedi-galeria-container').each(function() {
            var $container = $(this);
            if ($container.data('vegyes-initialized')) return;
            $container.data('vegyes-initialized', true);

            // 1. Előkészítjük a MediaWiki által generált helyi/commons képeket a LightGallery számára
            $container.find('.thumbimage').each(function() {
                var $img = $(this);
                // A MediaWiki az <a> tag href-jébe a leíró lapot rakja, de a nagy kép URL-je az img src-jében van (vagy felbontástól függően alakítható)
                // Hogy a nagy képet nyissa meg, kivesszük az img src-t és levágjuk a thumb részt ha szükséges
                var imgSrc = $img.attr('src');

                // Ha a kép egy átméretezett thumb, visszafejtjük az eredeti fájl URL-jét
                var origSrc = imgSrc;
                if (imgSrc.indexOf('/thumb/') !== -1) {
                    origSrc = imgSrc.replace('/thumb/', '/').substring(0, imgSrc.replace('/thumb/', '/').lastIndexOf('/'));
                }

                var $a = $img.closest('a');
                var $caption = $a.closest('.thumbinner').find('.thumbcaption');
                var captionHtml = $caption.length ? '<h4>' + $caption.text().trim() + '</h4>' : '';

                // Átalakítjuk a linket LightGallery kompatibilissé
                $a.addClass('lg-vegyes-item')
                  .attr('data-src', origSrc)
                  .attr('data-sub-html', captionHtml)
                  .on('click', function(e) {
                      e.preventDefault(); // Megakadályozzuk, hogy átnavigáljon a Fájl: lapra
                  });
            });

            // 2. Aktiváljuk a LightGallery-t az új konténerre
            lightGallery($container[0], {
                // Kiválasztjuk a külső linkeket ÉS a MediaWiki belső linkjeit is
                selector: '.lg-vegyes-item',
                licenseKey: '0000-0000-000-0000'
            });
        });
    }
})();

$(document).ready(function() {
    // 1. A külső képek dinamikus injektálása a DOM-ba
    $('.kulso-url-doboz').each(function() {
        var $doboz = $(this);
        var imgUrl = $doboz.attr('data-src');
        var felirat = $doboz.find('.galeria-felirat').text() || '';

        // LightGallery-kompatibilis rögzítési pont (Anchor) létrehozása
        var $lgItem = $('<a>', {
            'href': imgUrl,
            'class': 'lg-vegyes-item',
            'data-src': imgUrl,
            'data-sub-html': '<h4>' + felirat + '</h4>'
        });

        // A tényleges kép létrehozása és beágyazása
        $('<img>', {
            'src': imgUrl,
            'class': 'galeria-kep url-kep',
            'alt': felirat
        }).appendTo($lgItem);

        // Betesszük a felirat elé, az ideiglenes szöveges [Link]-et pedig kitakarítjuk
        $doboz.prepend($lgItem);
        $doboz.find('.url-link-szoveg').remove();
    });

    // 2. A LightGallery inicializálása a vegyes szelektorral
    // Így egyetlen galériaként fogja kezelni a helyi képeket és a külső hivatkozásokat is
    if (typeof $.fn.lightGallery === 'function') {
        $('.egyedi-galeria-container').lightGallery({
            selector: '.lg-vegyes-item, .thumb a.image',
            thumbnail: true,
            animateThumb: true,
            showThumbByDefault: true
        });
    }
});