„MediaWiki:Common.js” változatai közötti eltérés
Megjelenés
Nincs szerkesztési összefoglaló |
Nincs szerkesztési összefoglaló |
||
| (62 közbenső módosítás ugyanattól a felhasználótól nincs mutatva) | |||
| 1. sor: | 1. sor: | ||
// | /** | ||
* VECTOR 2022 TELEPORT BUGFIX - DRGYZ | |||
* Létrehozza a hiányzó teleportációs célpontokat, mielőtt a skin JS elhasalna | |||
*/ | |||
(function() { | |||
function injectVectorTargets() { | |||
var targets = ['p-lang-btn', 'vector-user-links-dropdown', 'vector-toc-landmark']; | |||
targets.forEach(function(id) { | |||
if (!document.getElementById(id)) { | |||
var dummy = document.createElement('div'); | |||
dummy.id = id; | |||
dummy.className = 'vector-teleport-dummy-target'; | |||
dummy.style.display = 'none'; | |||
document.body.appendChild(dummy); | |||
} | |||
}); | |||
} | |||
injectVectorTargets(); | |||
if (document.readyState === 'loading') { | |||
document.addEventListener('DOMContentLoaded', injectVectorTargets); | |||
} | |||
})(); | |||
/** | |||
* ============================================================================ | |||
* LIGHTGALLERY GLOBÁLIS INTEGRÁCIÓ (Egyedi sablon galériák előkészítése) | |||
* ============================================================================ | |||
*/ | |||
(function() { | |||
$(function() { | |||
if ($('.wiki-dynamic-gallery').length > 0) { | |||
initWikiDynamicGallery(); | |||
} | |||
if ($('.egyedi-galeria-container').length > 0) { | |||
prePrepareEgyediGaleriak(); | |||
} | |||
}); | |||
// --- RÉGI WIKI DYNAMIC GALLERY LOGIKA --- | |||
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]; | |||
// Szebbé tesszük a címet a felugró ablakhoz | |||
var title = pages[id].title.replace('File:', '').replace(/\.[^/.]+$/, ""); | |||
// LightGallery felugró ablak felirata és az ERDETI NAGY KÉP LINKJE (img.url) | |||
var captionHtml = '<div class="lg-egyedi-felirat"><h4>' + title + '</h4>' + | |||
'<br/><span class="galeria-forras-jelzo" style="font-size:0.85em; color:#bbb; display:block; margin-top:4px;">' + | |||
'Forrás: <a href="' + img.url + '" target="_blank" rel="noopener noreferrer" style="color:#66b2ff; text-decoration:underline;">Wikimedia Commons</a> ↗' + | |||
'</span></div>'; | |||
// ÖSSZEÁLLÍTJUK A JAVÍTOTT KÁRTYA STRUKTÚRÁT | |||
galleryHtml += '<div class="galeria-elem">'; | |||
galleryHtml += ' <div class="kulso-url-doboz" data-src="' + img.url + '" data-elokeszitve="true">'; | |||
galleryHtml += ' <figure class="mw-default-size col-url-figure" style="position: relative !important; overflow: visible !important;">'; | |||
// HIBÁTLAN LIGHTGALLERY INTEGRÁCIÓ: a href és data-src attribútumba is a NAGY KÉP (img.url) megy! | |||
galleryHtml += ' <a href="' + img.url + '" class="lg-egyedi-kulso-item lg-dinamikus-item" data-src="' + img.url + '" data-sub-html="' + captionHtml.replace(/"/g, '"') + '" style="display: block !important; position: relative !important;">'; | |||
galleryHtml += ' <img src="' + img.thumburl + '" class="galeria-kep url-kep" alt="' + title + '" />'; | |||
// A FÖLDGÖMB IKONT KÖZVETLENÜL A KÉPRE (A LINKEN BELÜLRE) POZICIONÁLJUK A BAL FELSŐ SAROKBA | |||
galleryHtml += ' <div class="kulso-link-ikon" style="position: absolute !important; top: 6px !important; left: 6px !important; z-index: 10 !important; font-size: 14px !important; background: rgba(255, 255, 255, 0.85) !important; padding: 2px 4px !important; border-radius: 4px !important; box-shadow: 0 1px 3px rgba(0,0,0,0.3) !important; line-height: 1 !important; display: block !important;">🌐</div>'; | |||
galleryHtml += ' </a>'; | |||
// FIGCAPTION: Kizárólag a galéria feliratot tartalmazza, a forrás szöveg (Wikimedia Commons) KI LETT TÖRÖLVE! | |||
galleryHtml += ' <figcaption>'; | |||
galleryHtml += ' <span class="galeria-felirat">' + title + '</span>'; | |||
galleryHtml += ' </figcaption>'; | |||
galleryHtml += ' </figure>'; | |||
galleryHtml += ' </div>'; | |||
galleryHtml += '</div>'; | |||
} | |||
// Behelyezzük a kártyákat a konténerbe és megadjuk neki a globális galéria osztályt | |||
$container.addClass('egyedi-galeria-container').html(galleryHtml); | |||
} | |||
}); | |||
}); | |||
} | |||
// --- EGYEDI GALÉRIÁK ELŐKÉSZÍTÉSE (Csak a feliratokat és a DOM-ot hozzuk helyre, de nem inicializálunk LG-t) --- | |||
function prePrepareEgyediGaleriak() { | |||
$('.egyedi-galeria-container').each(function() { | |||
var $container = $(this); | |||
// 1. Külső URL és Commons dobozok formázása (MediaWiki kompatibilis <figure> struktúra) | |||
$container.find('.kulso-url-doboz').each(function() { | |||
var $doboz = $(this); | |||
if ($doboz.data('elokeszitve')) return; | |||
$doboz.data('elokeszitve', true); | |||
var eredetiUrl = $doboz.attr('data-src'); | |||
var biztonsagosUrl = eredetiUrl; | |||
// HTTPS képproxy (weserv.nl) a vegyes tartalom és a hotlink tiltás ellen | |||
if (eredetiUrl && eredetiUrl.indexOf('http://') === 0) { | |||
var tisztaUrl = eredetiUrl.replace('http://', ''); | |||
biztonsagosUrl = 'https://images.weserv.nl/?url=' + encodeURIComponent(tisztaUrl); | |||
} | |||
var forrasNev = $doboz.attr('data-forras-nev') || 'Külső forrás'; | |||
var $feliratElem = $doboz.find('.galeria-felirat'); | |||
var felirat = $feliratElem.text().trim(); | |||
if (!felirat) { | |||
var fileTitle = eredetiUrl.substring(eredetiUrl.lastIndexOf('/') + 1).split('.')[0]; | |||
felirat = decodeURIComponent(fileTitle).replace(/_/g, ' '); | |||
} | |||
// LightGallery felugró ablak felirata | |||
var forrasLinkHtml = '<br/><span class="galeria-forras-jelzo" style="font-size:0.85em; color:#bbb; display:block; margin-top:4px;">' + | |||
'Forrás: <a href="' + eredetiUrl + '" target="_blank" rel="noopener noreferrer" style="color:#66b2ff; text-decoration:underline;">' + forrasNev + '</a> ↗' + | |||
'</span>'; | |||
var captionHtml = '<div class="lg-egyedi-felirat"><h4>' + felirat + '</h4>' + forrasLinkHtml + '</div>'; | |||
// ÖSSZEÁLLÍTJUK A JAVÍTOTT, EGYSÉGES SZABVÁNYOS MEDIAWIKI STRUKTÚRÁT: | |||
var $figure = $('<figure>', { | |||
'class': 'mw-default-size col-url-figure', | |||
'style': 'position: relative !important; overflow: visible !important;' | |||
}); | |||
var $lgItem = $('<a>', { | |||
'href': biztonsagosUrl, | |||
'class': 'lg-egyedi-kulso-item', | |||
'data-src': biztonsagosUrl, | |||
'data-sub-html': captionHtml, | |||
'style': 'display: block !important; position: relative !important;' | |||
}); | |||
// A beágyazott előkép | |||
$('<img>', { | |||
'src': biztonsagosUrl, | |||
'class': 'galeria-kep url-kep', | |||
'alt': felirat | |||
}).appendTo($lgItem); | |||
// JAVÍTÁS: A FÖLDGÖMB IKON BEKERÜL A LINKEN BELÜLRE, ABSZOLÚT POZÍCIÓVAL A BAL FELSŐ SAROKBA | |||
$('<div>', { | |||
'class': 'kulso-link-ikon', | |||
'style': 'position: absolute !important; top: 6px !important; left: 6px !important; z-index: 10 !important; font-size: 14px !important; background: rgba(255, 255, 255, 0.85) !important; padding: 2px 4px !important; border-radius: 4px !important; box-shadow: 0 1px 3px rgba(0,0,0,0.3) !important; line-height: 1 !important; display: block !important;', | |||
'text': '🌐' | |||
}).appendTo($lgItem); | |||
// JAVÍTÁS: Szabványos figcaption, amiből a zárójeles forrásszöveg teljesen ki lett hagyva | |||
var $figcaption = $('<figcaption>').html( | |||
'<span class="galeria-felirat">' + felirat + '</span>' | |||
); | |||
// Egymás mögé fűzzük őket a dobozon belül | |||
$lgItem.appendTo($figure); | |||
$figcaption.appendTo($figure); | |||
$doboz.empty().append($figure); | |||
}); | |||
// 2. Belső képek noviewer osztállyal való ellátása | |||
$container.find('figure a.mw-file-description').addClass('noviewer'); | |||
}); | |||
} | |||
})(); | |||
/** | |||
* ============================================================================ | |||
* KIEGÉSZÍTŐIKONOK ÉS STÍLUSLAPOK BETÖLTÉSE | |||
* ============================================================================ | |||
*/ | |||
var link = document.createElement("link"); | var link = document.createElement("link"); | ||
link.rel = "stylesheet"; | link.rel = "stylesheet"; | ||
link.href = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css"; | link.href = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css"; | ||
document.head.appendChild(link); | document.head.appendChild(link); | ||
/* | /** | ||
* ============================================================================ | |||
* JOGOSULTSÁGKEZELÉS (Fülek elrejtése anonim felhasználóknak) | |||
* ============================================================================ | |||
*/ | |||
if (mw.config.get('wgUserName') === null) { | if (mw.config.get('wgUserName') === null) { | ||
var hideTabs = function () { | var hideTabs = function () { | ||
| 15. sor: | 204. sor: | ||
if (el2) el2.style.display = 'none'; | if (el2) el2.style.display = 'none'; | ||
if (el1 || el2) clearInterval(observer); | if (el1 || el2) clearInterval(observer); | ||
}; | }; | ||
var observer = setInterval(hideTabs, 100); | var observer = setInterval(hideTabs, 100); | ||
} | } | ||
/* | /** | ||
* ============================================================================ | |||
* KÜLSŐ LINK VISLEKEDÉS (Új lapon nyíló külső hivatkozások) | |||
* ============================================================================ | |||
*/ | |||
$(function () { | $(function () { | ||
$('a.external').attr('target', '_blank'); | |||
}); | }); | ||
/ | /** | ||
* ============================================================================ | |||
* NAVIGÁCIÓS GOMBOK (Tetejére és Vissza gomb logikája) | |||
* ============================================================================ | |||
*/ | |||
$(function() { | $(function() { | ||
var $btn = $('<button/>', { | var $btn = $('<button/>', { | ||
html: '<i class="bi bi-arrow-up-square"></i> Tetejére', | |||
id: 'backToTopBtn', | id: 'backToTopBtn', | ||
title: 'Az oldal tetejére', | title: 'Az oldal tetejére', | ||
| 43. sor: | 234. sor: | ||
padding: '10px 15px', | padding: '10px 15px', | ||
'font-size': '14px', | 'font-size': '14px', | ||
'background-color': '# | 'background-color': '#888446ff', | ||
color: 'white', | color: 'white', | ||
border: 'none', | border: 'none', | ||
'border-radius': ' | 'border-radius': '10px', | ||
cursor: 'pointer', | cursor: 'pointer', | ||
display: 'none', | display: 'none', | ||
width: '100px', | |||
'z-index': 1000 | 'z-index': 1000 | ||
}, | }, | ||
| 56. sor: | 248. sor: | ||
}); | }); | ||
var $backBtn = $('<button/>', { | var $backBtn = $('<button/>', { | ||
html: '<i class="bi bi-arrow-left-square"></i> Vissza', | |||
id: 'backBtn', | id: 'backBtn', | ||
title: 'Előző oldal', | title: 'Előző oldal', | ||
css: { | css: { | ||
position: 'fixed', | position: 'fixed', | ||
bottom: '60px', | bottom: '60px', | ||
right: '20px', | right: '20px', | ||
padding: '10px 15px', | padding: '10px 15px', | ||
'font-size': '14px', | 'font-size': '14px', | ||
'background-color': '# | 'background-color': '#547454ff', | ||
color: 'white', | color: 'white', | ||
border: 'none', | border: 'none', | ||
'border-radius': ' | 'border-radius': '10px', | ||
cursor: 'pointer', | cursor: 'pointer', | ||
display: 'none', | display: 'none', | ||
width: '100px', | |||
'z-index': 1000 | 'z-index': 1000 | ||
}, | }, | ||
| 96. sor: | 272. sor: | ||
}); | }); | ||
$('body').append($btn).append($backBtn); | |||
$('body').append($backBtn); | |||
$(window).scroll(function() { | $(window).scroll(function() { | ||
if ($(window).scrollTop() > 100) { | if ($(window).scrollTop() > 100) { | ||
$btn.fadeIn(); | |||
$backBtn.fadeIn(); | $backBtn.fadeIn(); | ||
} else { | } else { | ||
$btn.fadeOut(); | |||
$backBtn.fadeOut(); | $backBtn.fadeOut(); | ||
} | } | ||
}); | }); | ||
}); | }); | ||
/** | |||
* ============================================================================ | |||
* TAXOBOX ÉS RENDSZERTANI LINKEK KEZELÉSE | |||
* ============================================================================ | |||
*/ | |||
$(document).ready(function() { | |||
$('.taxobox-icons a').attr('target', '_blank'); | |||
}); | |||
/** | |||
* ============================================================================ | |||
* DATATABLES INTEGRÁCIÓ (Javított táblázatkezelés) | |||
* ============================================================================ | |||
*/ | |||
mw.loader.using( ['jquery', 'mediawiki.util'] ).done( function () { | |||
if ( $( '.datatable-hook' ).length > 0 ) { | |||
$.getScript( 'https://cdn.datatables.net/2.1.8/js/dataTables.min.js' ) | |||
.done( function() { | |||
$( '.datatable-hook' ).each( function() { | |||
var $table = $(this); | |||
var $headerRow = $table.find( 'tr:has(th)' ).first(); | |||
if ( $headerRow.length > 0 ) { | |||
var $thead = $( '<thead></thead>' ); | |||
$headerRow.detach().appendTo( $thead ); | |||
$table.prepend( $thead ); | |||
} | |||
$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, | |||
columnDefs: [ { targets: '_all', defaultContent: '' } ] | |||
}); | |||
}); | |||
}) | |||
.fail( function() { | |||
console.error( 'Hiba: Nem sikerült betölteni a DataTables szkriptet.' ); | |||
}); | |||
} | |||
}); | |||
/** | |||
* ============================================================================ | |||
* SZUKKULENS NÖVÉNYHATÁROZÓ KULCSOK LOGIKÁJA | |||
* ============================================================================ | |||
*/ | |||
mw.hook('wikipage.content').add(function () { | |||
const aktualisKategoriak = mw.config.get('wgCategories') || []; | |||
if (!aktualisKategoriak.includes('Szukkulens növényhatározó kulcsok')) { | |||
return; | |||
} | |||
const regexKoztespont = /^Szukkulens határozó:/; | |||
const bodyContent = document.getElementById('bodyContent'); | |||
if (!bodyContent) return; | |||
bodyContent.querySelectorAll('a').forEach(a => { | |||
const teljesNev = a.getAttribute('title') || ''; | |||
if (regexKoztespont.test(teljesNev)) { | |||
let tisztaGombSzöveg = teljesNev.replace(/\s*\(a lap nem létezik\)$/, ''); | |||
a.innerHTML = ''; | |||
const arrowSpan = document.createElement('span'); | |||
arrowSpan.className = 'arrow-prefix'; | |||
arrowSpan.textContent = '→'; | |||
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→]+$/, ''); | |||
} | |||
} | |||
}); | |||
bodyContent.querySelectorAll('li').forEach(li => { | |||
const bendoLinkek = li.querySelectorAll('a[href*="/wiki/"]:not(.external)'); | |||
bendoLinkek.forEach(link => { | |||
const title = link.getAttribute('title') || ''; | |||
if (regexKoztespont.test(title) || link.classList.contains('hatarozo-koztespont-btn')) { | |||
return; | |||
} | |||
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; | |||
} | |||
if (!elotteLevoSzo.includes('Pl.') && !elotteLevoSzo.includes('(')) { | |||
if (!link.classList.contains('hatarozo-vegpont-btn')) { | |||
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→]+$/, ''); | |||
} | |||
} | |||
}); | |||
}); | |||
}); | |||
/** | |||
* ============================================================================ | |||
* GLOBÁLIS, ÖSSZEFÜGGŐ DINAMIKUS LIGHTGALLERY (Minden képet egy galériába fűz) | |||
* ============================================================================ | |||
*/ | |||
window.addEventListener('click', function(e) { | |||
// Elkapjuk az összes lehetséges képlinket (Natív MediaWiki, Előkészített egyedi külső, és régi dinamikus galéria) | |||
var targetLink = e.target.closest('a.mw-file-description, a.image, a.lg-egyedi-kulso-item, a.lg-dinamikus-item'); | |||
if (!targetLink) return; | |||
// Fájl leíró oldalakon hagyjuk a gyári működést | |||
if (window.location.pathname.includes('/wiki/F%C3%A1jl:') || window.location.pathname.includes('/wiki/File:')) { | |||
return; | |||
} | |||
// Elfojtjuk a gyári átirányítást és eseményeket | |||
e.preventDefault(); | |||
e.stopPropagation(); | |||
e.stopImmediatePropagation(); | |||
var dynamicSlides = []; | |||
var clickedIndex = 0; | |||
// Szelektáljuk az ÖSSZES képlinket az oldalon a megjelenés sorrendjében | |||
var $mindenKepA = $('a.mw-file-description, a.image, a.lg-egyedi-kulso-item, a.lg-dinamikus-item'); | |||
$mindenKepA.each(function(index) { | |||
var $el = $(this); | |||
var $img = $el.find('img'); | |||
// JAVÍTVA: Ha külső egyedi galéria elemről van szó, nem kötelező az <img> tag jelenléte! | |||
if ($img.length === 0 && !$el.hasClass('lg-egyedi-kulso-item')) return; | |||
if ($el.is(targetLink)) { | |||
clickedIndex = dynamicSlides.length; // Pontos index elmentése a dinamikus tömbben | |||
} | |||
var origSrc = ''; | |||
var thumbSrc = $img.attr('src') || ''; | |||
var captionText = ''; | |||
// 1. ESET: Előkészített egyedi külső URL / Commons doboz kép (Nincs kötelező <img> tag!) | |||
if ($el.hasClass('lg-egyedi-kulso-item')) { | |||
origSrc = $el.attr('data-src'); | |||
thumbSrc = origSrc; // Indexképként is a külső forrást használjuk, mivel nincs helyi thumb | |||
captionText = $el.attr('data-sub-html') || ''; | |||
} | |||
// 2. ESET: Régi dinamikus (Commons search) galéria elem | |||
else if ($el.hasClass('lg-dinamikus-item')) { | |||
origSrc = $el.attr('data-src'); | |||
captionText = $el.attr('data-sub-html') || ''; | |||
} | |||
// 3. ESET: Natív cikkbeli kép (Hagyományos MediaWiki galéria vagy <figure>) | |||
else { | |||
// Intelligens URL tisztítás az eredeti képhez | |||
origSrc = thumbSrc; | |||
if (origSrc.indexOf('/thumb/') !== -1) { | |||
origSrc = origSrc.replace('/thumb/', '/'); | |||
if (origSrc.lastIndexOf('/') !== -1) { | |||
origSrc = origSrc.substring(0, origSrc.lastIndexOf('/')); | |||
} | |||
} | |||
// Képaláírás kinyerése | |||
var nativeEl = $el[0]; | |||
if (nativeEl) { | |||
var figure = nativeEl.closest('figure, .thumb'); | |||
if (figure) { | |||
var figcaption = figure.querySelector('figcaption, .thumbcaption'); | |||
if (figcaption) { | |||
captionText = figcaption.textContent.replace(/×/g, '').trim(); | |||
} | |||
} | |||
} | |||
if (!captionText) { | |||
captionText = $img.attr('alt') || $img.attr('title') || ''; | |||
} | |||
if (captionText) { | |||
captionText = '<h4>' + captionText + '</h4>'; | |||
} | |||
} | |||
dynamicSlides.push({ | |||
src: origSrc, | |||
thumb: thumbSrc, | |||
subHtml: captionText | |||
}); | |||
}); | |||
// LightGallery indítása az összesített tömbbel | |||
if (window.lightGallery && dynamicSlides.length > 0) { | |||
var container = document.createElement('div'); | |||
var dynamicGallery = lightGallery(container, { | |||
dynamic: true, | |||
dynamicEl: dynamicSlides, | |||
licenseKey: '0000-0000-000-0000', | |||
thumbnail: true, | |||
animateThumb: true, | |||
showThumbByDefault: true, | |||
index: clickedIndex, | |||
download: true, | |||
counter: dynamicSlides.length > 1, | |||
getCaptionFromTitleOrAlt: false | |||
}); | |||
dynamicGallery.openGallery(); | |||
} else { | |||
console.error("LightGallery hiba: Nem sikerült elindítani a globális galériát."); | |||
} | |||
}, true); // Capturing fázis! | |||
A lap jelenlegi, 2026. június 19., 10:25-kori változata
/**
* VECTOR 2022 TELEPORT BUGFIX - DRGYZ
* Létrehozza a hiányzó teleportációs célpontokat, mielőtt a skin JS elhasalna
*/
(function() {
function injectVectorTargets() {
var targets = ['p-lang-btn', 'vector-user-links-dropdown', 'vector-toc-landmark'];
targets.forEach(function(id) {
if (!document.getElementById(id)) {
var dummy = document.createElement('div');
dummy.id = id;
dummy.className = 'vector-teleport-dummy-target';
dummy.style.display = 'none';
document.body.appendChild(dummy);
}
});
}
injectVectorTargets();
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', injectVectorTargets);
}
})();
/**
* ============================================================================
* LIGHTGALLERY GLOBÁLIS INTEGRÁCIÓ (Egyedi sablon galériák előkészítése)
* ============================================================================
*/
(function() {
$(function() {
if ($('.wiki-dynamic-gallery').length > 0) {
initWikiDynamicGallery();
}
if ($('.egyedi-galeria-container').length > 0) {
prePrepareEgyediGaleriak();
}
});
// --- RÉGI WIKI DYNAMIC GALLERY LOGIKA ---
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];
// Szebbé tesszük a címet a felugró ablakhoz
var title = pages[id].title.replace('File:', '').replace(/\.[^/.]+$/, "");
// LightGallery felugró ablak felirata és az ERDETI NAGY KÉP LINKJE (img.url)
var captionHtml = '<div class="lg-egyedi-felirat"><h4>' + title + '</h4>' +
'<br/><span class="galeria-forras-jelzo" style="font-size:0.85em; color:#bbb; display:block; margin-top:4px;">' +
'Forrás: <a href="' + img.url + '" target="_blank" rel="noopener noreferrer" style="color:#66b2ff; text-decoration:underline;">Wikimedia Commons</a> ↗' +
'</span></div>';
// ÖSSZEÁLLÍTJUK A JAVÍTOTT KÁRTYA STRUKTÚRÁT
galleryHtml += '<div class="galeria-elem">';
galleryHtml += ' <div class="kulso-url-doboz" data-src="' + img.url + '" data-elokeszitve="true">';
galleryHtml += ' <figure class="mw-default-size col-url-figure" style="position: relative !important; overflow: visible !important;">';
// HIBÁTLAN LIGHTGALLERY INTEGRÁCIÓ: a href és data-src attribútumba is a NAGY KÉP (img.url) megy!
galleryHtml += ' <a href="' + img.url + '" class="lg-egyedi-kulso-item lg-dinamikus-item" data-src="' + img.url + '" data-sub-html="' + captionHtml.replace(/"/g, '"') + '" style="display: block !important; position: relative !important;">';
galleryHtml += ' <img src="' + img.thumburl + '" class="galeria-kep url-kep" alt="' + title + '" />';
// A FÖLDGÖMB IKONT KÖZVETLENÜL A KÉPRE (A LINKEN BELÜLRE) POZICIONÁLJUK A BAL FELSŐ SAROKBA
galleryHtml += ' <div class="kulso-link-ikon" style="position: absolute !important; top: 6px !important; left: 6px !important; z-index: 10 !important; font-size: 14px !important; background: rgba(255, 255, 255, 0.85) !important; padding: 2px 4px !important; border-radius: 4px !important; box-shadow: 0 1px 3px rgba(0,0,0,0.3) !important; line-height: 1 !important; display: block !important;">🌐</div>';
galleryHtml += ' </a>';
// FIGCAPTION: Kizárólag a galéria feliratot tartalmazza, a forrás szöveg (Wikimedia Commons) KI LETT TÖRÖLVE!
galleryHtml += ' <figcaption>';
galleryHtml += ' <span class="galeria-felirat">' + title + '</span>';
galleryHtml += ' </figcaption>';
galleryHtml += ' </figure>';
galleryHtml += ' </div>';
galleryHtml += '</div>';
}
// Behelyezzük a kártyákat a konténerbe és megadjuk neki a globális galéria osztályt
$container.addClass('egyedi-galeria-container').html(galleryHtml);
}
});
});
}
// --- EGYEDI GALÉRIÁK ELŐKÉSZÍTÉSE (Csak a feliratokat és a DOM-ot hozzuk helyre, de nem inicializálunk LG-t) ---
function prePrepareEgyediGaleriak() {
$('.egyedi-galeria-container').each(function() {
var $container = $(this);
// 1. Külső URL és Commons dobozok formázása (MediaWiki kompatibilis <figure> struktúra)
$container.find('.kulso-url-doboz').each(function() {
var $doboz = $(this);
if ($doboz.data('elokeszitve')) return;
$doboz.data('elokeszitve', true);
var eredetiUrl = $doboz.attr('data-src');
var biztonsagosUrl = eredetiUrl;
// HTTPS képproxy (weserv.nl) a vegyes tartalom és a hotlink tiltás ellen
if (eredetiUrl && eredetiUrl.indexOf('http://') === 0) {
var tisztaUrl = eredetiUrl.replace('http://', '');
biztonsagosUrl = 'https://images.weserv.nl/?url=' + encodeURIComponent(tisztaUrl);
}
var forrasNev = $doboz.attr('data-forras-nev') || 'Külső forrás';
var $feliratElem = $doboz.find('.galeria-felirat');
var felirat = $feliratElem.text().trim();
if (!felirat) {
var fileTitle = eredetiUrl.substring(eredetiUrl.lastIndexOf('/') + 1).split('.')[0];
felirat = decodeURIComponent(fileTitle).replace(/_/g, ' ');
}
// LightGallery felugró ablak felirata
var forrasLinkHtml = '<br/><span class="galeria-forras-jelzo" style="font-size:0.85em; color:#bbb; display:block; margin-top:4px;">' +
'Forrás: <a href="' + eredetiUrl + '" target="_blank" rel="noopener noreferrer" style="color:#66b2ff; text-decoration:underline;">' + forrasNev + '</a> ↗' +
'</span>';
var captionHtml = '<div class="lg-egyedi-felirat"><h4>' + felirat + '</h4>' + forrasLinkHtml + '</div>';
// ÖSSZEÁLLÍTJUK A JAVÍTOTT, EGYSÉGES SZABVÁNYOS MEDIAWIKI STRUKTÚRÁT:
var $figure = $('<figure>', {
'class': 'mw-default-size col-url-figure',
'style': 'position: relative !important; overflow: visible !important;'
});
var $lgItem = $('<a>', {
'href': biztonsagosUrl,
'class': 'lg-egyedi-kulso-item',
'data-src': biztonsagosUrl,
'data-sub-html': captionHtml,
'style': 'display: block !important; position: relative !important;'
});
// A beágyazott előkép
$('<img>', {
'src': biztonsagosUrl,
'class': 'galeria-kep url-kep',
'alt': felirat
}).appendTo($lgItem);
// JAVÍTÁS: A FÖLDGÖMB IKON BEKERÜL A LINKEN BELÜLRE, ABSZOLÚT POZÍCIÓVAL A BAL FELSŐ SAROKBA
$('<div>', {
'class': 'kulso-link-ikon',
'style': 'position: absolute !important; top: 6px !important; left: 6px !important; z-index: 10 !important; font-size: 14px !important; background: rgba(255, 255, 255, 0.85) !important; padding: 2px 4px !important; border-radius: 4px !important; box-shadow: 0 1px 3px rgba(0,0,0,0.3) !important; line-height: 1 !important; display: block !important;',
'text': '🌐'
}).appendTo($lgItem);
// JAVÍTÁS: Szabványos figcaption, amiből a zárójeles forrásszöveg teljesen ki lett hagyva
var $figcaption = $('<figcaption>').html(
'<span class="galeria-felirat">' + felirat + '</span>'
);
// Egymás mögé fűzzük őket a dobozon belül
$lgItem.appendTo($figure);
$figcaption.appendTo($figure);
$doboz.empty().append($figure);
});
// 2. Belső képek noviewer osztállyal való ellátása
$container.find('figure a.mw-file-description').addClass('noviewer');
});
}
})();
/**
* ============================================================================
* KIEGÉSZÍTŐIKONOK ÉS STÍLUSLAPOK BETÖLTÉSE
* ============================================================================
*/
var link = document.createElement("link");
link.rel = "stylesheet";
link.href = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css";
document.head.appendChild(link);
/**
* ============================================================================
* JOGOSULTSÁGKEZELÉS (Fülek elrejtése anonim felhasználóknak)
* ============================================================================
*/
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';
if (el1 || el2) clearInterval(observer);
};
var observer = setInterval(hideTabs, 100);
}
/**
* ============================================================================
* KÜLSŐ LINK VISLEKEDÉS (Új lapon nyíló külső hivatkozások)
* ============================================================================
*/
$(function () {
$('a.external').attr('target', '_blank');
});
/**
* ============================================================================
* NAVIGÁCIÓS GOMBOK (Tetejére és Vissza gomb logikája)
* ============================================================================
*/
$(function() {
var $btn = $('<button/>', {
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',
width: '100px',
'z-index': 1000
},
click: function() {
window.scrollTo({top: 0, behavior: 'smooth'});
}
});
var $backBtn = $('<button/>', {
html: '<i class="bi bi-arrow-left-square"></i> Vissza',
id: 'backBtn',
title: 'Előző oldal',
css: {
position: 'fixed',
bottom: '60px',
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();
}
});
$('body').append($btn).append($backBtn);
$(window).scroll(function() {
if ($(window).scrollTop() > 100) {
$btn.fadeIn();
$backBtn.fadeIn();
} else {
$btn.fadeOut();
$backBtn.fadeOut();
}
});
});
/**
* ============================================================================
* TAXOBOX ÉS RENDSZERTANI LINKEK KEZELÉSE
* ============================================================================
*/
$(document).ready(function() {
$('.taxobox-icons a').attr('target', '_blank');
});
/**
* ============================================================================
* DATATABLES INTEGRÁCIÓ (Javított táblázatkezelés)
* ============================================================================
*/
mw.loader.using( ['jquery', 'mediawiki.util'] ).done( function () {
if ( $( '.datatable-hook' ).length > 0 ) {
$.getScript( 'https://cdn.datatables.net/2.1.8/js/dataTables.min.js' )
.done( function() {
$( '.datatable-hook' ).each( function() {
var $table = $(this);
var $headerRow = $table.find( 'tr:has(th)' ).first();
if ( $headerRow.length > 0 ) {
var $thead = $( '<thead></thead>' );
$headerRow.detach().appendTo( $thead );
$table.prepend( $thead );
}
$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,
columnDefs: [ { targets: '_all', defaultContent: '' } ]
});
});
})
.fail( function() {
console.error( 'Hiba: Nem sikerült betölteni a DataTables szkriptet.' );
});
}
});
/**
* ============================================================================
* SZUKKULENS NÖVÉNYHATÁROZÓ KULCSOK LOGIKÁJA
* ============================================================================
*/
mw.hook('wikipage.content').add(function () {
const aktualisKategoriak = mw.config.get('wgCategories') || [];
if (!aktualisKategoriak.includes('Szukkulens növényhatározó kulcsok')) {
return;
}
const regexKoztespont = /^Szukkulens határozó:/;
const bodyContent = document.getElementById('bodyContent');
if (!bodyContent) return;
bodyContent.querySelectorAll('a').forEach(a => {
const teljesNev = a.getAttribute('title') || '';
if (regexKoztespont.test(teljesNev)) {
let tisztaGombSzöveg = teljesNev.replace(/\s*\(a lap nem létezik\)$/, '');
a.innerHTML = '';
const arrowSpan = document.createElement('span');
arrowSpan.className = 'arrow-prefix';
arrowSpan.textContent = '→';
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→]+$/, '');
}
}
});
bodyContent.querySelectorAll('li').forEach(li => {
const bendoLinkek = li.querySelectorAll('a[href*="/wiki/"]:not(.external)');
bendoLinkek.forEach(link => {
const title = link.getAttribute('title') || '';
if (regexKoztespont.test(title) || link.classList.contains('hatarozo-koztespont-btn')) {
return;
}
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;
}
if (!elotteLevoSzo.includes('Pl.') && !elotteLevoSzo.includes('(')) {
if (!link.classList.contains('hatarozo-vegpont-btn')) {
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→]+$/, '');
}
}
});
});
});
/**
* ============================================================================
* GLOBÁLIS, ÖSSZEFÜGGŐ DINAMIKUS LIGHTGALLERY (Minden képet egy galériába fűz)
* ============================================================================
*/
window.addEventListener('click', function(e) {
// Elkapjuk az összes lehetséges képlinket (Natív MediaWiki, Előkészített egyedi külső, és régi dinamikus galéria)
var targetLink = e.target.closest('a.mw-file-description, a.image, a.lg-egyedi-kulso-item, a.lg-dinamikus-item');
if (!targetLink) return;
// Fájl leíró oldalakon hagyjuk a gyári működést
if (window.location.pathname.includes('/wiki/F%C3%A1jl:') || window.location.pathname.includes('/wiki/File:')) {
return;
}
// Elfojtjuk a gyári átirányítást és eseményeket
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
var dynamicSlides = [];
var clickedIndex = 0;
// Szelektáljuk az ÖSSZES képlinket az oldalon a megjelenés sorrendjében
var $mindenKepA = $('a.mw-file-description, a.image, a.lg-egyedi-kulso-item, a.lg-dinamikus-item');
$mindenKepA.each(function(index) {
var $el = $(this);
var $img = $el.find('img');
// JAVÍTVA: Ha külső egyedi galéria elemről van szó, nem kötelező az <img> tag jelenléte!
if ($img.length === 0 && !$el.hasClass('lg-egyedi-kulso-item')) return;
if ($el.is(targetLink)) {
clickedIndex = dynamicSlides.length; // Pontos index elmentése a dinamikus tömbben
}
var origSrc = '';
var thumbSrc = $img.attr('src') || '';
var captionText = '';
// 1. ESET: Előkészített egyedi külső URL / Commons doboz kép (Nincs kötelező <img> tag!)
if ($el.hasClass('lg-egyedi-kulso-item')) {
origSrc = $el.attr('data-src');
thumbSrc = origSrc; // Indexképként is a külső forrást használjuk, mivel nincs helyi thumb
captionText = $el.attr('data-sub-html') || '';
}
// 2. ESET: Régi dinamikus (Commons search) galéria elem
else if ($el.hasClass('lg-dinamikus-item')) {
origSrc = $el.attr('data-src');
captionText = $el.attr('data-sub-html') || '';
}
// 3. ESET: Natív cikkbeli kép (Hagyományos MediaWiki galéria vagy <figure>)
else {
// Intelligens URL tisztítás az eredeti képhez
origSrc = thumbSrc;
if (origSrc.indexOf('/thumb/') !== -1) {
origSrc = origSrc.replace('/thumb/', '/');
if (origSrc.lastIndexOf('/') !== -1) {
origSrc = origSrc.substring(0, origSrc.lastIndexOf('/'));
}
}
// Képaláírás kinyerése
var nativeEl = $el[0];
if (nativeEl) {
var figure = nativeEl.closest('figure, .thumb');
if (figure) {
var figcaption = figure.querySelector('figcaption, .thumbcaption');
if (figcaption) {
captionText = figcaption.textContent.replace(/×/g, '').trim();
}
}
}
if (!captionText) {
captionText = $img.attr('alt') || $img.attr('title') || '';
}
if (captionText) {
captionText = '<h4>' + captionText + '</h4>';
}
}
dynamicSlides.push({
src: origSrc,
thumb: thumbSrc,
subHtml: captionText
});
});
// LightGallery indítása az összesített tömbbel
if (window.lightGallery && dynamicSlides.length > 0) {
var container = document.createElement('div');
var dynamicGallery = lightGallery(container, {
dynamic: true,
dynamicEl: dynamicSlides,
licenseKey: '0000-0000-000-0000',
thumbnail: true,
animateThumb: true,
showThumbByDefault: true,
index: clickedIndex,
download: true,
counter: dynamicSlides.length > 1,
getCaptionFromTitleOrAlt: false
});
dynamicGallery.openGallery();
} else {
console.error("LightGallery hiba: Nem sikerült elindítani a globális galériát.");
}
}, true); // Capturing fázis!