„Modul:Taxonbox2” változatai közötti eltérés
Megjelenés
Nincs szerkesztési összefoglaló |
Nincs szerkesztési összefoglaló |
||
| (13 közbenső módosítás ugyanattól a felhasználótól nincs mutatva) | |||
| 8. sor: | 8. sor: | ||
local TaxonData = require('Modul:TaxonokData') | local TaxonData = require('Modul:TaxonokData') | ||
---------------------------------------------------------------------------------------------------------------- | |||
-- Segédfüggvény: Kinyeri a nemzetség nevét a fajnévből | -- Segédfüggvény: Kinyeri a nemzetség nevét a fajnévből | ||
local function extract_genus(full_species_name) | local function extract_genus(full_species_name) | ||
if not full_species_name then return "" end | if not full_species_name then return "" end | ||
local genus_name = full_species_name:match("([ | -- Kezelje a hibrid jelet is a nemzetség elején | ||
local genus_name = full_species_name:match("^(×?%s?[%a%-]+)") | |||
return genus_name or "" | return genus_name or "" | ||
end | end | ||
---------------------------------------------------------------------------------------------------------------- | |||
-- Segédfüggvény: Dőlt betűs taxonnév alapformázása (szükséges a clean funkcióhoz is) | -- Segédfüggvény: Dőlt betűs taxonnév alapformázása (szükséges a clean funkcióhoz is) | ||
local function format_name(name) | local function format_name(name) | ||
| 35. sor: | 38. sor: | ||
end | end | ||
---------------------------------------------------------------------------------------------------------------- | |||
-- Segédfüggvény: Teljes formázás rangokkal és sec. megjegyzésekkel (A FEJLÉCHEZ) | -- Segédfüggvény: Teljes formázás rangokkal és sec. megjegyzésekkel (A FEJLÉCHEZ) | ||
local function format_taxon_full(text, rank) | local function format_taxon_full(text, rank) | ||
| 68. sor: | 72. sor: | ||
end | end | ||
-- 3. Magasabb rangok formázása ( | -- 3. Magasabb rangok formázása (Csak félkövér, NEM dőlt) | ||
local high_ranks = { ["Rend"]=true, ["Család"]=true, ["Alcsalád"]=true, ["Nemzetségcsoport"]=true, ["Alnemzetség-csoport"]=true } | -- Bővítve a "Klád" típussal is! | ||
local high_ranks = { ["Klád"]=true, ["Rend"]=true, ["Család"]=true, ["Alcsalád"]=true, ["Nemzetségcsoport"]=true, ["Alnemzetség-csoport"]=true } | |||
-- Speciális kivétel: Core Eudicots és hasonlók ne legyenek dőltek | |||
if main_part:find("Core Eudicots") or main_part:find("Eudicots") then | |||
return "'''" .. main_part .. "'''" .. sec_formatted | |||
end | |||
if rank and high_ranks[rank] then | if rank and high_ranks[rank] then | ||
local name, rest = main_part:match("^([%a%-]+)%s*(.*)$") | local name, rest = main_part:match("^([%a%-]+)%s*(.*)$") | ||
| 76. sor: | 87. sor: | ||
-- 4. Infraspecifikus taxonok (subsp., var., f.) kezelése | -- 4. Infraspecifikus taxonok (subsp., var., f.) kezelése | ||
local low_ranks = { "subsp%.", "var%.", "f%." } | local low_ranks = { "subsp%.", "var%.", "f%." } | ||
for _, r_pattern in ipairs(low_ranks) do | for _, r_pattern in ipairs(low_ranks) do | ||
local g, s, | -- A [^%s]+ mintát használjuk a nevekhez, hogy a hibrid jelet (×) is átvigye | ||
local g, s, rank_found, e, rest = main_part:match("^([%a%-]+)%s+([^%s]+)%s+("..r_pattern..")%s+([^%s]+)%s*(.*)$") | |||
if g then | if g then | ||
return "'''''" .. g .. " " .. s .. "'' " .. | -- Formázás: | ||
-- '''''Genus species''''' (félkövér+dőlt) | |||
-- var. (álló) | |||
-- '''''epithet''''' (félkövér+dőlt) | |||
return "'''''" .. g .. " " .. s .. "'' " .. rank_found .. " ''" .. e .. "''''' " .. (rest or "") .. sec_formatted | |||
end | end | ||
end | end | ||
| 88. sor: | 103. sor: | ||
local infra_gen_ranks = { "gen%.", "subgen%.", "sect%.", "subsect%.", "ser%.", "subser%.", "sp%." } | local infra_gen_ranks = { "gen%.", "subgen%.", "sect%.", "subsect%.", "ser%.", "subser%.", "sp%." } | ||
for _, r_pattern in ipairs(infra_gen_ranks) do | for _, r_pattern in ipairs(infra_gen_ranks) do | ||
local g, | local g, rank_found, e, rest = main_part:match("^([%a%-]+)%s+("..r_pattern..")%s+([%a%-]+)%s*(.*)$") | ||
if g then | if g then | ||
return "'''''" .. g .. "'' " .. | return "'''''" .. g .. "'' " .. rank_found .. " ''" .. e .. "''''' " .. (rest or "") .. sec_formatted | ||
end | |||
end | |||
-- 6. Speciális cultivar kezelés (ELŐRE HOZVA) | |||
-- Ha van benne idézőjel, azt azonnal kezeljük le | |||
if main_part:match("'.+'") or main_part:match('".+"') then | |||
local base, cv = main_part:match("^(.-)%s+(['\"].+['\"])$") | |||
if base and cv then | |||
-- A nemzetség/faj dőlt és félkövér (5 aposztróf), a cultivar csak félkövér, de álló (3 aposztróf) | |||
return "'''''" .. base .. "''''' '''" .. cv .. "'''" .. sec_formatted | |||
end | end | ||
end | end | ||
-- | -- 7. Binomiális név (Faj) vs. Monomiális név (Nemzetség + Szerző) | ||
-- | -- Ez már csak akkor fut le, ha NEM kultivárról van szó | ||
local first, second, rest = main_part:match("^([%a%-]+)%s+([^%s]+)%s*(.*)$") | local first, second, rest = main_part:match("^([%a%-]+)%s+([^%s]+)%s*(.*)$") | ||
if first and second then | if first and second then | ||
if second:match("^[a-z]") or second:find("^×") or second:find("^\195\151") then | |||
if second:match("^[a-z]") then | -- FAJ: Nemzetség + faji jelző dőlt és félkövér | ||
-- | |||
return "'''''" .. first .. " " .. second .. "''''' " .. (rest or "") .. sec_formatted | return "'''''" .. first .. " " .. second .. "''''' " .. (rest or "") .. sec_formatted | ||
else | else | ||
-- | -- NEMZETSÉG + SZERZŐ: Csak a nemzetség dőlt és félkövér | ||
return "'''''" .. first .. "''''' " .. second .. " " .. (rest or "") .. sec_formatted | return "'''''" .. first .. "''''' " .. second .. " " .. (rest or "") .. sec_formatted | ||
end | end | ||
end | end | ||
-- | -- 8. Alapeset (egy szó): '''''Taxon''''' | ||
local single_name, rest2 = main_part:match("^([%a%-]+)%s*(.*)$") | local single_name, rest2 = main_part:match("^([%a%-]+)%s*(.*)$") | ||
return "'''''" .. (single_name or "") .. "''''' " .. (rest2 or "") .. sec_formatted | return "'''''" .. (single_name or "") .. "''''' " .. (rest2 or "") .. sec_formatted | ||
end | end | ||
---------------------------------------------------------------------------------------------------------------- | |||
-- Segédfüggvény: Csak a tiszta, dőlt nevet adja vissza sallangok nélkül (A TÁBLÁZATHOZ) | -- Segédfüggvény: Csak a tiszta, dőlt nevet adja vissza sallangok nélkül (A TÁBLÁZATHOZ) | ||
local function format_taxon_clean(text) | local function format_taxon_clean(text) | ||
if not text or text == "" then return "", "" end | if not text or text == "" then return "", "" end | ||
-- 1. | -- 1. Alapvető tisztítás | ||
local input_text = text:gsub("''", ""):match("^%s*(.-)%s*$") | |||
local | |||
-- 2. SZERZŐK ÉS "SEC." RADIKÁLIS ELTÁVOLÍTÁSA (Zárójelek, sec, évszámok) | |||
-- Ez kulcsfontosságú, hogy ne zavarja be a későbbi mintákat | |||
local clean_base = input_text:gsub("%s*[%(].*$", "") | |||
clean_base = clean_base:gsub("%s+[Ss]ec%.%s+.*$", "") | |||
clean_base = clean_base:gsub("%s+[0-9].*$", "") | |||
-- Ha maradt benne "in Cactaceae..." szerű hivatkozás, azt is pucoljuk le | |||
clean_base = clean_base:gsub("%s+in%s+.*$", "") | |||
-- Szavak kinyerése | |||
local words = {} | |||
for w in clean_base:gmatch("([^%s]+)") do | |||
if #words < 4 then table.insert(words, w) end | |||
end | end | ||
if #words == 0 then return "", "" end | |||
-- | |||
if | -- 3. ELŐSZÖR: Infraspecifikus (4 szó) | ||
if #words >= 4 and (words[3] == "subsp." or words[3] == "var." or words[3] == "f.") then | |||
local plain = words[1] .. " " .. words[2] .. " " .. words[3] .. " " .. words[4] | |||
local formatted = "''" .. words[1] .. " " .. words[2] .. "'' " .. words[3] .. " ''" .. words[4] .. "''" | |||
return formatted, plain | |||
end | end | ||
local | -- 4. MÁSODSZOR: Binomiális (2 szó) | ||
if #words >= 2 then | |||
if words[2]:match("^[a-z]") or words[2]:match("^×") or words[2]:match("^\195\151") then | |||
local plain = words[1] .. " " .. words[2] | |||
local formatted = "''" .. words[1] .. " " .. words[2] .. "''" | |||
return formatted, plain | |||
end | |||
end | |||
-- | -- 5. HARMADSZOR: Magasabb rangok végződés alapján | ||
local | local endings = {"ales", "aceae", "oideae", "eae", "inae"} | ||
for _, end_str in ipairs(endings) do | |||
if words[1]:match(end_str .. "$") then | |||
-- Itt NINCS dőlt betű (visszaadjuk tisztán) | |||
return words[1], words[1] | |||
end | |||
end | |||
-- 6. NEGYEDSZER: Fix adatbázis nevek, Kládok és speciális gyűjtőnevek | |||
-- Megnézzük, hogy a teljes megtisztított bázis szerepel-e az adatbázisban dőlés nélkül | |||
if TaxonData[clean_base] then | |||
return clean_base, clean_base | |||
end | end | ||
-- | -- -- 7. ALAPESET: Monomiális (1 szó) | ||
-- -- Csak akkor dőltetünk, ha nem találtuk meg az adatbázisban fix névként | |||
-- local plain = clean_base | |||
-- local formatted = "''" .. plain .. "''" | |||
-- 7. ALAPESET: Monomiális (1 szó) | |||
local plain = clean_base | |||
-- Ha az adatbázisban dőlés nélkül van benne (pl. Nemzetség vagy Klád), akkor ne dőltessük | |||
if TaxonData[plain] then | |||
return plain, plain | |||
end | end | ||
-- | -- -- Ha az adatbázisban dőlés nélkül van benne (pl. Nemzetség), akkor a dőltetlent adjuk vissza | ||
-- if TaxonData[plain] then | |||
-- return plain, plain | |||
-- end | |||
-- Minden más esetben dőlt (fajok, nemzetségek, amik nincsenek az adatbázisban) | |||
local formatted = "''" .. plain .. "''" | |||
return formatted, plain | return formatted, plain | ||
end | end | ||
---------------------------------------------------------------------------------------------------------------- | |||
function p.buildTaxonbox(frame) | function p.buildTaxonbox(frame) | ||
local args = frame:getParent().args | local args = frame:getParent().args | ||
-- Miért nem elég a sima local acceptedName = args.accepted? | |||
-- A MediaWiki sablonoknál ha a szerkesztő ezt írja: | accepted = , az a Lua számára egy üres karakterlánc (""), nem pedig "semmi". | |||
-- A sima args.accepted esetén a programod azt hinné, van ott valami, és megpróbálná formázni az ürességet, ami hibához vezetne. | |||
-- Ezzel a logikával viszont eléred, hogy ha üres a mező, a program úgy kezelje, mintha ott se lenne (nil). | |||
local acceptedName = (args.accepted ~= '' and args.accepted) or nil | local acceptedName = (args.accepted ~= '' and args.accepted) or nil | ||
local synonymName = (args.synonym ~= '' and args.synonym) or nil | local synonymName = (args.synonym ~= '' and args.synonym) or nil | ||
| 188. sor: | 232. sor: | ||
local taxonImage = args.image or '' | local taxonImage = args.image or '' | ||
local imageTitle = args.imageTitle or '' | local imageTitle = args.imageTitle or '' | ||
local synHomoBoo = false | |||
-- Végignézzük az összes paramétert | |||
for k, v in pairs(args) do | |||
-- 1. Csak a szöveges értékeket nézzük (v) | |||
-- 2. Megtisztítjuk az esetleges szóközöktől és újsoroktól | |||
if type(v) == "string" then | |||
local cleanV = v:match("^%s*(.-)%s*$") | |||
if cleanV == 'synhomo' then | |||
synHomoBoo = true | |||
break | |||
elseif cleanV == 'synhetero' then | |||
synHomoBoo = false | |||
break | |||
end | |||
end | |||
end | |||
local output = "" | local output = "" | ||
-- | -- Deklaráljuk előre a közös változókat, hogy minden blokk lássa őket | ||
local clean_formatted_acceptedName = "" | |||
-- | local clean_plain_acceptedName = "" | ||
-- ... a többi args kezdetű változód (acceptedName, synonymName stb.) | |||
-- acceptedName ---------------------------------- | -- acceptedName ---------------------------------- | ||
if acceptedName then | if acceptedName then | ||
-- 1. ELŐSZÖR formázzuk meg a fő nevet! | |||
clean_formatted_acceptedName, clean_plain_acceptedName = format_taxon_clean(acceptedName) | |||
local hierarchy = {} | local hierarchy = {} | ||
local taxonName = acceptedName | local taxonName = acceptedName | ||
local parentOverride = parentName | local parentOverride = parentName | ||
while taxonName and taxonName ~= " | -- 2. HIERARCHIA ÉPÍTÉSE | ||
-- | |||
local _, | while taxonName and taxonName ~= "" do | ||
local data = TaxonData[ | -- Tisztítjuk a nevet a kereséshez | ||
local _, lookupName = format_taxon_clean(taxonName) | |||
-- Keresés az adatbázisban | |||
local data = TaxonData[lookupName] | |||
if data then | if data then | ||
table.insert(hierarchy, { rank = data.rank, name = | table.insert(hierarchy, { rank = data.rank, name = lookupName }) | ||
-- Fontos: a szülő nevét is tisztítsuk meg a biztonság kedvéért a következő körre | |||
taxonName = data.parent | taxonName = data.parent | ||
else | else | ||
-- Ha nincs az adatbázisban, | -- Ha nincs az adatbázisban, megpróbáljuk felismerni (Faj/Alfaj) | ||
local g, s, r, e = lookupName:match("^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+([^%s]+)") | |||
local | |||
if | if g and (r == "subsp." or r == "var." or r == "f.") then | ||
table.insert(hierarchy, { rank = (r == "subsp." and "Alfaj" or (r == "var." and "Változat" or "Forma")), name = lookupName }) | |||
table.insert(hierarchy, { rank = " | taxonName = g .. " " .. s -- Az alfaj szülője a faj | ||
taxonName = | |||
else | else | ||
-- Ha | local f, spec = lookupName:match("^([^%s]+)%s+([^%s]+)") | ||
if f and spec and (spec:match("^[a-z]") or spec:match("^×")) then | |||
table.insert(hierarchy, { rank = "Faj", name = lookupName }) | |||
taxonName = f -- A faj szülője a nemzetség | |||
else | |||
-- Ha csak egy szó maradt, és nincs az adatbázisban, megnézzük nemzetségként | |||
local firstW = lookupName:match("^([^%s]+)") | |||
if firstW and TaxonData[firstW] then | |||
taxonName = firstW | |||
else | |||
break -- Itt a vége | |||
end | |||
end | |||
end | end | ||
end | end | ||
| 230. sor: | 309. sor: | ||
end | end | ||
-- | -- 3. TÁBLÁZAT GENERÁLÁSA | ||
output = output .. '{| class="infobox biota acc"\n' | |||
output = output ..'{| class="infobox biota acc"\n' | |||
output = output .. "|-\n" | output = output .. "|-\n" | ||
-- Itt használjuk a legelső tisztítás eredményét! | |||
output = output .. '! class="taxonnev" colspan="2" | ' .. clean_formatted_acceptedName .. "\n" | output = output .. '! class="taxonnev" colspan="2" | ' .. clean_formatted_acceptedName .. "\n" | ||
output = output .. "|-\n" | output = output .. "|-\n" | ||
output = output .. '! class="suha-svg" colspan="2"|[[Fájl:acc.svg|x160px|link=]]<br>Érvényes, elfogadott név.\n' | output = output .. '! class="suha-svg" colspan="2"|[[Fájl:acc.svg|x160px|link=]]<br>Érvényes, elfogadott név.\n' | ||
| 262. sor: | 339. sor: | ||
else | else | ||
-- Megkeressük az alapnevet a kategória linkhez (szerzők nélkül) | -- Megkeressük az alapnevet a kategória linkhez (szerzők nélkül) | ||
local category_target = item.name:match("^([%a%-%.% | local category_target = item.name:match("^([%a%-%.%s×]+)") or item.name -- ide nem biztos, hogy kell a × jel | ||
if item.rank == "Nemzetség" then | if item.rank == "Nemzetség" then | ||
-- A nemzetség kategória linkhez a clean_formatted változót használjuk | -- A nemzetség kategória linkhez a clean_formatted változót használjuk | ||
| 281. sor: | 358. sor: | ||
if hierarchy[1] and hierarchy[1].rank == "Faj" then | if hierarchy[1] and hierarchy[1].rank == "Faj" then | ||
local encodedTerm = mw.uri.encode( | local encodedTerm = mw.uri.encode(clean_plain_acceptedName) | ||
-- local encodedTerm = mw.uri.encode(clean_plain) | |||
output = output .. '|-\n' | output = output .. '|-\n' | ||
output = output .. '!colspan="2" class="taxobox-icons" |' | output = output .. '!colspan="2" class="taxobox-icons" |' | ||
| 318. sor: | 396. sor: | ||
synType = "Nomenklatúrális (homotipikus)" | synType = "Nomenklatúrális (homotipikus)" | ||
synHeteroBoo = false | synHeteroBoo = false | ||
end | |||
if synHomoBoo then | |||
synType = "Nomenklatúrális (homotipikus)" | |||
synHeteroBoo = false | |||
else -- synHomoBoo == false | |||
synType = "Taxonómiai (heterotipikus)" | |||
synHeteroBoo = true | |||
end | end | ||
end | end | ||
| 423. sor: | 509. sor: | ||
end | end | ||
---------------------------------------------------------------------------------------------------------------- | |||
function p.format_tudomanyos_nev(frame) | function p.format_tudomanyos_nev(frame) | ||
local args = frame:getParent().args | local args = frame:getParent().args | ||
| 432. sor: | 519. sor: | ||
} | } | ||
output = '== Tudományos név ==\n' | local output = '== Tudományos név ==\n' | ||
output = output .. '<div class="tn">\n' | output = output .. '<div class="tn">\n' | ||
for _, n in ipairs(names) do | for _, n in ipairs(names) do | ||
| 446. sor: | 533. sor: | ||
-- OFFLINE TESZTELŐ SZAKASZ | -- OFFLINE TESZTELŐ SZAKASZ | ||
-- ========================================================== | -- ========================================================== | ||
if arg then | -- if arg then | ||
mw = { uri = { encode = function(s) return s:gsub(" ", "%%20") end } } | -- mw = { uri = { encode = function(s) return s:gsub(" ", "%%20") end } } | ||
local mock_frame = { | -- local mock_frame = { | ||
getParent = function() | -- getParent = function() | ||
return { | -- return { | ||
args = { | -- args = { | ||
accepted = arg[1] or "Lophophora williamsii (Lem. ex Salm-Dyck) J.M.Coult. in Contr. U.S. Natl. Herb. 3(2): 131. 1894 sec. Parfitt & Gibson 2003", | -- accepted = arg[1] or "Echinocereus sciurus subsp. floresii (Schwarz ex Backeb.) N.P.Taylor in Cactaceae Consensus Init. 3: 10. 1997 sec. Guzmán Cruz & al. 2003", | ||
synonym = arg[2] or "Lophophora alberto-vojtechii Šnicer, Bohata & Mysák, 2008", | -- synonym = arg[1] or "Echinocereus sciurus subsp. floresii (Schwarz ex Backeb.) N.P.Taylor in Cactaceae Consensus Init. 3: 10. 1997 sec. Guzmán Cruz & al. 2003", | ||
-- accepted = arg[1] or "Acanthocalycium leucanthum (Gillies ex Salm-Dyck) Schlumpb. in Cactaceae Syst. Init. 28: 29. 2012. Sec. Schlumpberger (2012)", | -- -- accepted = arg[1] or "Astrophytum coahuilense (H.Moeller) K.Kayser in Kakteen-Freund 1: 59. 1932. Sec. Vázquez-Lobo & al. (2015)", | ||
-- synonym = arg[2] or "Echinopsis leucantha (Gillies ex Salm-Dyck) Walp., Repert. Bot. Syst. 2: 324. 1843", | -- -- synonym = arg[2] or "Astrophytum myriostigma var. coahuilense (H.Moeller) K.Kayser in Borg, Cacti, ed. 1: 251. 1937 syn. sec. Arias (2021)", | ||
-- unresolved = arg[3] or "Lobivia kuehhasii Rausch in Kakteen And. Sukk. 60: 320. 2009. Sec. WFO 2019", | -- -- accepted = arg[1] or "Echinocereus ×roetteri (Engelm.) Engelm. ex Rümpler, Handb. Cacteenk., ed. 2, 2(16): 829. 1886. Sec. Hunt (2016)", | ||
image = "test.jpg", | -- -- synonym = arg[2] or "Echinocereus ×roetteri var. lloydii (Britton & Rose) Backeb., Cactaceae 4: 2027. 1960", | ||
imageTitle = "Teszt kép" | -- -- accepted = arg[1] or "Lophophora williamsii (Lem. ex Salm-Dyck) J.M.Coult. in Contr. U.S. Natl. Herb. 3(2): 131. 1894 sec. Parfitt & Gibson 2003", | ||
} | -- -- synonym = arg[2] or "Lophophora alberto-vojtechii Šnicer, Bohata & Mysák, 2008", | ||
} | -- -- accepted = arg[1] or "Acanthocalycium leucanthum (Gillies ex Salm-Dyck) Schlumpb. in Cactaceae Syst. Init. 28: 29. 2012. Sec. Schlumpberger (2012)", | ||
end | -- -- synonym = arg[2] or "Echinopsis leucantha (Gillies ex Salm-Dyck) Walp., Repert. Bot. Syst. 2: 324. 1843", | ||
} | -- -- unresolved = arg[3] or "Lobivia kuehhasii Rausch in Kakteen And. Sukk. 60: 320. 2009. Sec. WFO 2019", | ||
-- -- "synhomo", | |||
-- -- "synhetero", | |||
-- image = "test.jpg", | |||
-- imageTitle = "Teszt kép" | |||
-- } | |||
-- } | |||
-- end | |||
-- } | |||
-- print("\n--- TAXONBOX GENERÁLT WIKITEXT ---") | |||
-- local success, result = pcall(p.buildTaxonbox, mock_frame) | |||
-- print(success and result or "HIBA: " .. result) | |||
-- print("\n--- TUDOMÁNYOS NÉV SZAKASZ ---") | |||
-- local success2, result2 = pcall(p.format_tudomanyos_nev, mock_frame) | |||
-- print(success2 and result2 or "HIBA: " .. result2) | |||
-- end | |||
-- ========================================================== | |||
-- ONLINE HASZNÁLAT | |||
-- ========================================================== | |||
-- {{Taxonbox | |||
-- | accepted = Astrophytum coahuilense | |||
-- | synonym = Astrophytum myriostigma var. coahuilense | |||
-- | synhomo v. synhetero | |||
-- | image = test.jpg | |||
-- | imageTitle = "Teszt kép" | |||
-- }} | |||
-- Ezt kell beszúrni a Taxonbox2.lua végére, a return p elé, így lesz publikus a cultivarboxnak | |||
p.extract_genus = extract_genus | |||
p.format_taxon_clean = format_taxon_clean | |||
p.format_taxon_full = format_taxon_full | |||
-- p.buildTaxonbox = p.buildTaxonbox -- Ez valószínűleg már ott van, ha a p.build... formát használtad | |||
return p | return p | ||
A lap jelenlegi, 2026. március 15., 00:25-kori változata
A modult a Modul:Taxonbox2/doc lapon tudod dokumentálni
-- ==========================================================
-- TaxonokRawData.lua > TaxonokRawDataConvert.lua > Taxonbox.lua > Sablon:Taxonbox.wiki
-- ==========================================================
local p = {}
-- Betölti a központi adatmodult, amiben a hierarchia szerepel.
local TaxonData = require('Modul:TaxonokData')
----------------------------------------------------------------------------------------------------------------
-- Segédfüggvény: Kinyeri a nemzetség nevét a fajnévből
local function extract_genus(full_species_name)
if not full_species_name then return "" end
-- Kezelje a hibrid jelet is a nemzetség elején
local genus_name = full_species_name:match("^(×?%s?[%a%-]+)")
return genus_name or ""
end
----------------------------------------------------------------------------------------------------------------
-- Segédfüggvény: Dőlt betűs taxonnév alapformázása (szükséges a clean funkcióhoz is)
local function format_name(name)
if not name or name == '' then return "" end
local formattedName = name
-- Rangjelzők dőltté tétele (a rangjelző sp., var. stb. álló marad)
if string.match(name, "subsp%.") or string.match(name, "var%.") or string.match(name, "f%.") then
local minta = "([%a%-]+)%s+([%a%-]+)%s+([%a%.]+)%s+([%a%-]+)"
local csere = "''%1 %2'' %3 ''%4''"
formattedName = string.gsub(name, minta, csere)
elseif string.match(name, "[%a%-]+%s+[%a%-]+") then
local minta = "([%a%-]+)%s+([%a%-]+)"
local csere = "''%1 %2''"
formattedName = string.gsub(name, minta, csere)
else
formattedName = "''" .. name .. "''"
end
return formattedName
end
----------------------------------------------------------------------------------------------------------------
-- Segédfüggvény: Teljes formázás rangokkal és sec. megjegyzésekkel (A FEJLÉCHEZ)
local function format_taxon_full(text, rank)
if not text or text == "" then return "" end
local main_part = text
local sec_part = ""
-- 1. "sec." rész leválasztása
local lower_text = text:lower()
local start_index = lower_text:find("sec%.")
if start_index then
local syn_index = lower_text:find("syn%.%s+sec%.")
if syn_index then start_index = syn_index end
main_part = text:sub(1, start_index - 1):gsub("%s+$", "")
sec_part = text:sub(start_index)
end
local sec_formatted = (sec_part ~= "") and (' <span class="sec">' .. sec_part .. '</span>') or ""
-- 2. Automatikus rang-felismerés végződések alapján (ha nincs megadva)
if not rank or rank == "" then
local first_word = main_part:match("^([%a%-]+)")
if first_word then
if first_word:match("ales$") then rank = "Rend"
elseif first_word:match("aceae$") then rank = "Család"
elseif first_word:match("oideae$") then rank = "Alcsalád"
elseif first_word:match("eae$") then rank = "Nemzetségcsoport"
elseif first_word:match("inae$") then rank = "Alnemzetség-csoport"
end
end
end
-- 3. Magasabb rangok formázása (Csak félkövér, NEM dőlt)
-- Bővítve a "Klád" típussal is!
local high_ranks = { ["Klád"]=true, ["Rend"]=true, ["Család"]=true, ["Alcsalád"]=true, ["Nemzetségcsoport"]=true, ["Alnemzetség-csoport"]=true }
-- Speciális kivétel: Core Eudicots és hasonlók ne legyenek dőltek
if main_part:find("Core Eudicots") or main_part:find("Eudicots") then
return "'''" .. main_part .. "'''" .. sec_formatted
end
if rank and high_ranks[rank] then
local name, rest = main_part:match("^([%a%-]+)%s*(.*)$")
return "'''" .. (name or main_part) .. "''' " .. (rest or "") .. sec_formatted
end
-- 4. Infraspecifikus taxonok (subsp., var., f.) kezelése
local low_ranks = { "subsp%.", "var%.", "f%." }
for _, r_pattern in ipairs(low_ranks) do
-- A [^%s]+ mintát használjuk a nevekhez, hogy a hibrid jelet (×) is átvigye
local g, s, rank_found, e, rest = main_part:match("^([%a%-]+)%s+([^%s]+)%s+("..r_pattern..")%s+([^%s]+)%s*(.*)$")
if g then
-- Formázás:
-- '''''Genus species''''' (félkövér+dőlt)
-- var. (álló)
-- '''''epithet''''' (félkövér+dőlt)
return "'''''" .. g .. " " .. s .. "'' " .. rank_found .. " ''" .. e .. "''''' " .. (rest or "") .. sec_formatted
end
end
-- 5. Infragenerikus taxonok (sect., ser. stb.) kezelése
local infra_gen_ranks = { "gen%.", "subgen%.", "sect%.", "subsect%.", "ser%.", "subser%.", "sp%." }
for _, r_pattern in ipairs(infra_gen_ranks) do
local g, rank_found, e, rest = main_part:match("^([%a%-]+)%s+("..r_pattern..")%s+([%a%-]+)%s*(.*)$")
if g then
return "'''''" .. g .. "'' " .. rank_found .. " ''" .. e .. "''''' " .. (rest or "") .. sec_formatted
end
end
-- 6. Speciális cultivar kezelés (ELŐRE HOZVA)
-- Ha van benne idézőjel, azt azonnal kezeljük le
if main_part:match("'.+'") or main_part:match('".+"') then
local base, cv = main_part:match("^(.-)%s+(['\"].+['\"])$")
if base and cv then
-- A nemzetség/faj dőlt és félkövér (5 aposztróf), a cultivar csak félkövér, de álló (3 aposztróf)
return "'''''" .. base .. "''''' '''" .. cv .. "'''" .. sec_formatted
end
end
-- 7. Binomiális név (Faj) vs. Monomiális név (Nemzetség + Szerző)
-- Ez már csak akkor fut le, ha NEM kultivárról van szó
local first, second, rest = main_part:match("^([%a%-]+)%s+([^%s]+)%s*(.*)$")
if first and second then
if second:match("^[a-z]") or second:find("^×") or second:find("^\195\151") then
-- FAJ: Nemzetség + faji jelző dőlt és félkövér
return "'''''" .. first .. " " .. second .. "''''' " .. (rest or "") .. sec_formatted
else
-- NEMZETSÉG + SZERZŐ: Csak a nemzetség dőlt és félkövér
return "'''''" .. first .. "''''' " .. second .. " " .. (rest or "") .. sec_formatted
end
end
-- 8. Alapeset (egy szó): '''''Taxon'''''
local single_name, rest2 = main_part:match("^([%a%-]+)%s*(.*)$")
return "'''''" .. (single_name or "") .. "''''' " .. (rest2 or "") .. sec_formatted
end
----------------------------------------------------------------------------------------------------------------
-- Segédfüggvény: Csak a tiszta, dőlt nevet adja vissza sallangok nélkül (A TÁBLÁZATHOZ)
local function format_taxon_clean(text)
if not text or text == "" then return "", "" end
-- 1. Alapvető tisztítás
local input_text = text:gsub("''", ""):match("^%s*(.-)%s*$")
-- 2. SZERZŐK ÉS "SEC." RADIKÁLIS ELTÁVOLÍTÁSA (Zárójelek, sec, évszámok)
-- Ez kulcsfontosságú, hogy ne zavarja be a későbbi mintákat
local clean_base = input_text:gsub("%s*[%(].*$", "")
clean_base = clean_base:gsub("%s+[Ss]ec%.%s+.*$", "")
clean_base = clean_base:gsub("%s+[0-9].*$", "")
-- Ha maradt benne "in Cactaceae..." szerű hivatkozás, azt is pucoljuk le
clean_base = clean_base:gsub("%s+in%s+.*$", "")
-- Szavak kinyerése
local words = {}
for w in clean_base:gmatch("([^%s]+)") do
if #words < 4 then table.insert(words, w) end
end
if #words == 0 then return "", "" end
-- 3. ELŐSZÖR: Infraspecifikus (4 szó)
if #words >= 4 and (words[3] == "subsp." or words[3] == "var." or words[3] == "f.") then
local plain = words[1] .. " " .. words[2] .. " " .. words[3] .. " " .. words[4]
local formatted = "''" .. words[1] .. " " .. words[2] .. "'' " .. words[3] .. " ''" .. words[4] .. "''"
return formatted, plain
end
-- 4. MÁSODSZOR: Binomiális (2 szó)
if #words >= 2 then
if words[2]:match("^[a-z]") or words[2]:match("^×") or words[2]:match("^\195\151") then
local plain = words[1] .. " " .. words[2]
local formatted = "''" .. words[1] .. " " .. words[2] .. "''"
return formatted, plain
end
end
-- 5. HARMADSZOR: Magasabb rangok végződés alapján
local endings = {"ales", "aceae", "oideae", "eae", "inae"}
for _, end_str in ipairs(endings) do
if words[1]:match(end_str .. "$") then
-- Itt NINCS dőlt betű (visszaadjuk tisztán)
return words[1], words[1]
end
end
-- 6. NEGYEDSZER: Fix adatbázis nevek, Kládok és speciális gyűjtőnevek
-- Megnézzük, hogy a teljes megtisztított bázis szerepel-e az adatbázisban dőlés nélkül
if TaxonData[clean_base] then
return clean_base, clean_base
end
-- -- 7. ALAPESET: Monomiális (1 szó)
-- -- Csak akkor dőltetünk, ha nem találtuk meg az adatbázisban fix névként
-- local plain = clean_base
-- local formatted = "''" .. plain .. "''"
-- 7. ALAPESET: Monomiális (1 szó)
local plain = clean_base
-- Ha az adatbázisban dőlés nélkül van benne (pl. Nemzetség vagy Klád), akkor ne dőltessük
if TaxonData[plain] then
return plain, plain
end
-- -- Ha az adatbázisban dőlés nélkül van benne (pl. Nemzetség), akkor a dőltetlent adjuk vissza
-- if TaxonData[plain] then
-- return plain, plain
-- end
-- Minden más esetben dőlt (fajok, nemzetségek, amik nincsenek az adatbázisban)
local formatted = "''" .. plain .. "''"
return formatted, plain
end
----------------------------------------------------------------------------------------------------------------
function p.buildTaxonbox(frame)
local args = frame:getParent().args
-- Miért nem elég a sima local acceptedName = args.accepted?
-- A MediaWiki sablonoknál ha a szerkesztő ezt írja: | accepted = , az a Lua számára egy üres karakterlánc (""), nem pedig "semmi".
-- A sima args.accepted esetén a programod azt hinné, van ott valami, és megpróbálná formázni az ürességet, ami hibához vezetne.
-- Ezzel a logikával viszont eléred, hogy ha üres a mező, a program úgy kezelje, mintha ott se lenne (nil).
local acceptedName = (args.accepted ~= '' and args.accepted) or nil
local synonymName = (args.synonym ~= '' and args.synonym) or nil
local unresolvedName = (args.unresolved ~= '' and args.unresolved) or nil
local hybridName = (args.hybrid ~= '' and args.hybrid) or nil
local parentName = (args.parent ~= '' and args.parent) or nil
local taxonImage = args.image or ''
local imageTitle = args.imageTitle or ''
local synHomoBoo = false
-- Végignézzük az összes paramétert
for k, v in pairs(args) do
-- 1. Csak a szöveges értékeket nézzük (v)
-- 2. Megtisztítjuk az esetleges szóközöktől és újsoroktól
if type(v) == "string" then
local cleanV = v:match("^%s*(.-)%s*$")
if cleanV == 'synhomo' then
synHomoBoo = true
break
elseif cleanV == 'synhetero' then
synHomoBoo = false
break
end
end
end
local output = ""
-- Deklaráljuk előre a közös változókat, hogy minden blokk lássa őket
local clean_formatted_acceptedName = ""
local clean_plain_acceptedName = ""
-- ... a többi args kezdetű változód (acceptedName, synonymName stb.)
-- acceptedName ----------------------------------
if acceptedName then
-- 1. ELŐSZÖR formázzuk meg a fő nevet!
clean_formatted_acceptedName, clean_plain_acceptedName = format_taxon_clean(acceptedName)
local hierarchy = {}
local taxonName = acceptedName
local parentOverride = parentName
-- 2. HIERARCHIA ÉPÍTÉSE
while taxonName and taxonName ~= "" do
-- Tisztítjuk a nevet a kereséshez
local _, lookupName = format_taxon_clean(taxonName)
-- Keresés az adatbázisban
local data = TaxonData[lookupName]
if data then
table.insert(hierarchy, { rank = data.rank, name = lookupName })
-- Fontos: a szülő nevét is tisztítsuk meg a biztonság kedvéért a következő körre
taxonName = data.parent
else
-- Ha nincs az adatbázisban, megpróbáljuk felismerni (Faj/Alfaj)
local g, s, r, e = lookupName:match("^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+([^%s]+)")
if g and (r == "subsp." or r == "var." or r == "f.") then
table.insert(hierarchy, { rank = (r == "subsp." and "Alfaj" or (r == "var." and "Változat" or "Forma")), name = lookupName })
taxonName = g .. " " .. s -- Az alfaj szülője a faj
else
local f, spec = lookupName:match("^([^%s]+)%s+([^%s]+)")
if f and spec and (spec:match("^[a-z]") or spec:match("^×")) then
table.insert(hierarchy, { rank = "Faj", name = lookupName })
taxonName = f -- A faj szülője a nemzetség
else
-- Ha csak egy szó maradt, és nincs az adatbázisban, megnézzük nemzetségként
local firstW = lookupName:match("^([^%s]+)")
if firstW and TaxonData[firstW] then
taxonName = firstW
else
break -- Itt a vége
end
end
end
end
end
if #hierarchy == 0 then
return '<div style="color:red;">Taxonbox hiba: Nem található adat a "' .. tostring(acceptedName) .. '" taxonhoz.</div>'
end
-- 3. TÁBLÁZAT GENERÁLÁSA
output = output .. '{| class="infobox biota acc"\n'
output = output .. "|-\n"
-- Itt használjuk a legelső tisztítás eredményét!
output = output .. '! class="taxonnev" colspan="2" | ' .. clean_formatted_acceptedName .. "\n"
output = output .. "|-\n"
output = output .. '! class="suha-svg" colspan="2"|[[Fájl:acc.svg|x160px|link=]]<br>Érvényes, elfogadott név.\n'
if taxonImage ~= '' then
output = output .. '|-\n'
output = output .. '! class="suha-svg" colspan="2"|[[Fájl:' .. taxonImage .. '|340px|' .. imageTitle .. ']]\n'
end
output = output .. '|-\n'
output = output .. '! class="besorolas" colspan="2"|Rendszertani besorolás\n'
for i = #hierarchy, 1, -1 do
local item = hierarchy[i]
local rank_display = item.rank
-- Itt kapja meg a két értéket
local clean_formatted, clean_plain = format_taxon_clean(item.name)
local name_display = ""
-- Kategória hivatkozás tisztított névvel
if item.rank == "Faj" then
name_display = clean_formatted
else
-- Megkeressük az alapnevet a kategória linkhez (szerzők nélkül)
local category_target = item.name:match("^([%a%-%.%s×]+)") or item.name -- ide nem biztos, hogy kell a × jel
if item.rank == "Nemzetség" then
-- A nemzetség kategória linkhez a clean_formatted változót használjuk
name_display = "[[:Kategória:" .. clean_plain .. "|" .. clean_formatted .. "]]"
else
-- A kategória linkhez a plain (formázás mentes) változót használjuk
name_display = "[[:Kategória:" .. clean_plain .. "|" .. clean_plain .. "]]"
end
end
if rank_display == "Nemzetségcsoport" then rank_display = "Nemzetség-<br>csoport" end
if rank_display == "Alnemzetségcsoport" then rank_display = "Alnemzetség-<br>csoport" end
output = output .. '|-\n'
output = output .. '| class = "left" | ' .. rank_display .. '\n'
output = output .. '| class = "right" | ' .. name_display .. '\n'
end
if hierarchy[1] and hierarchy[1].rank == "Faj" then
local encodedTerm = mw.uri.encode(clean_plain_acceptedName)
-- local encodedTerm = mw.uri.encode(clean_plain)
output = output .. '|-\n'
output = output .. '!colspan="2" class="taxobox-icons" |'
output = output .. '[[Fájl:Google logo gyz.svg|x30px|link=http://images.google.com/search?tbm=isch&q=' .. encodedTerm .. '|Google képek]] '
output = output .. '[[Fájl:Bing fluent logo gyz.svg|x30px|link=https://www.bing.com/images/search?q=' .. encodedTerm .. '|Bing képek]]\n'
end
output = output .. '|}\n'
end
-- synonymName ----------------------------------
if synonymName then
local syn_hierarchy = {}
local taxonName2 = synonymName
table.insert(syn_hierarchy, { rank = "Faj", name = taxonName2 })
if #syn_hierarchy == 0 then
return '<div style="color:red;">Taxonbox hiba: Nem található adat a "' .. tostring(synonymName) .. '" taxonhoz.</div>'
end
-- 1. Kinyerjük a faji jelzőket (pl. "leucanthum" és "leucantha")
local _, accEpithetFull = acceptedName:match("^([%a%-]+)%s+([%a%-]+)")
local _, synEpithetFull = synonymName:match("^([%a%-]+)%s+([%a%-]+)")
local synType = "Taxonómiai (heterotipikus)" -- Alapértelmezett
local synHeteroBoo = true -- Alapértelmezett
if accEpithetFull and synEpithetFull then
-- 2. Levágjuk a végződéseket (szótő kinyerése: pl. "leucanth")
-- A minta levágja az -um, -a, -us, -is végződéseket
local accStem = accEpithetFull:gsub("[uais][ms%a]*$", "")
local synStem = synEpithetFull:gsub("[uais][ms%a]*$", "")
-- 3. Ha a szótövek egyeznek, akkor nomenklatúrális
if accStem == synStem then
synType = "Nomenklatúrális (homotipikus)"
synHeteroBoo = false
end
if synHomoBoo then
synType = "Nomenklatúrális (homotipikus)"
synHeteroBoo = false
else -- synHomoBoo == false
synType = "Taxonómiai (heterotipikus)"
synHeteroBoo = true
end
end
-- Itt kapja meg a két értéket
local clean_formatted_synonymName, clean_plain_synonymName = format_taxon_clean(synonymName)
-- Folytatjuk az acceptedName output-ot
output = output .. '{| class="infobox biota syn"\n'
output = output .. "|-\n"
output = output .. '! class="taxonnev" colspan="2" | ' .. clean_formatted_synonymName .. "\n"
output = output .. "|-\n"
if synHeteroBoo then
output = output .. '! class="suha-svg" colspan="2"|[[Fájl:syn.svg|x160px|link=]]<br>' .. synType .. ' szinonima.<br>Az érvényes leírást lásd itt:<br>[[' .. clean_plain_acceptedName .. '|' .. clean_formatted_acceptedName .. ']]\n'
else
output = output .. '! class="suha-svg" colspan="2"|[[Fájl:syn.svg|x160px|link=]]<br>' .. synType .. ' szinonima\n'
end
output = output .. '|-\n'
output = output .. '! class="besorolas" colspan="2"|Rendszertani besorolás\n'
for i = #syn_hierarchy, 1, -1 do
local item = syn_hierarchy[i]
local rank_display = item.rank
-- Itt kapja meg a két értéket
local clean_formatted, clean_plain = format_taxon_clean(item.name)
local name_display = ""
-- Kategória hivatkozás tisztított névvel
if item.rank == "Faj" then
name_display = clean_formatted
output = output .. '|-\n'
output = output .. '| class = "left" | ' .. rank_display .. '\n'
output = output .. '| class = "right" | ' .. name_display .. '\n'
end
end
-- if syn_hierarchy[1] and syn_hierarchy[1].rank == "Faj" then
-- local encodedTerm = mw.uri.encode(synonymName)
-- output = output .. '|-\n'
-- output = output .. '!colspan="2" class="taxobox-icons" |'
-- output = output .. '[[Fájl:Google logo gyz.svg|x30px|link=http://images.google.com/search?tbm=isch&q=' .. encodedTerm .. '|Google képek]] '
-- output = output .. '[[Fájl:Bing fluent logo gyz.svg|x30px|link=https://www.bing.com/images/search?q=' .. encodedTerm .. '|Bing képek]]\n'
-- end
output = output .. '|}\n'
end
-- unresolvedName ----------------------------------
if unresolvedName then
local unres_hierarchy = {}
local taxonName3 = unresolvedName
table.insert(unres_hierarchy, { rank = "Faj", name = taxonName3 })
if #unres_hierarchy == 0 then
return '<div style="color:red;">Taxonbox hiba: Nem található adat a "' .. tostring(unresolvedName) .. '" taxonhoz.</div>'
end
-- Itt kapja meg a két értéket
local clean_formatted_unresolvedName, clean_plain_unresolvedName = format_taxon_clean(unresolvedName)
-- Folytatjuk az acceptedName output-ot
output = output .. '{| class="infobox biota unres"\n'
output = output .. "|-\n"
output = output .. '! class="taxonnev" colspan="2" | ' .. clean_formatted_unresolvedName .. "\n"
output = output .. "|-\n"
output = output .. '! class="suha-svg" colspan="2"|[[Fájl:unres.svg|x160px|link=]]<br>Feloldatlan név\n'
output = output .. '|-\n'
output = output .. '! class="besorolas" colspan="2"|Rendszertani besorolás\n'
for i = #unres_hierarchy, 1, -1 do
local item = unres_hierarchy[i]
local rank_display = item.rank
-- Itt kapja meg a két értéket
local clean_formatted, clean_plain = format_taxon_clean(item.name)
local name_display = ""
-- Kategória hivatkozás tisztított névvel
if item.rank == "Faj" then
name_display = clean_formatted
output = output .. '|-\n'
output = output .. '| class = "left" | ' .. rank_display .. '\n'
output = output .. '| class = "right" | ' .. name_display .. '\n'
end
end
if unres_hierarchy[1] and unres_hierarchy[1].rank == "Faj" then
local encodedTerm = mw.uri.encode(unresolvedName)
output = output .. '|-\n'
output = output .. '!colspan="2" class="taxobox-icons" |'
output = output .. '[[Fájl:Google logo gyz.svg|x30px|link=http://images.google.com/search?tbm=isch&q=' .. encodedTerm .. '|Google képek]] '
output = output .. '[[Fájl:Bing fluent logo gyz.svg|x30px|link=https://www.bing.com/images/search?q=' .. encodedTerm .. '|Bing képek]]\n'
end
output = output .. '|}\n'
end
return output
end
----------------------------------------------------------------------------------------------------------------
function p.format_tudomanyos_nev(frame)
local args = frame:getParent().args
local names = {
{ val = args.accepted, class = "tnb tnb-acc", class2 = "tns tns-acc", txt= "elfogadott, érvényes név"},
{ val = args.synonym, class = "tnb tnb-syn", class2 = "tns tns-syn", txt= "szinonima név"},
{ val = args.unresolved, class = "tnb tnb-unres", class2 = "tns tns-unres", txt= "feloldatlan név"},
{ val = args.hybrid, class = "tnb tnb-hyb", class2 = "tns tns-hyb", txt= "hibrid név"}
}
local output = '== Tudományos név ==\n'
output = output .. '<div class="tn">\n'
for _, n in ipairs(names) do
if n.val and n.val ~= '' then
output = output .. '* <span class="' .. n.class .. '">' .. format_taxon_full(n.val) .. '</span><br><span class="' .. n.class2 .. '">' .. (n.txt) .. '</span>\n'
end
end
output = output .. '</div>\n'
return output
end
-- ==========================================================
-- OFFLINE TESZTELŐ SZAKASZ
-- ==========================================================
-- if arg then
-- mw = { uri = { encode = function(s) return s:gsub(" ", "%%20") end } }
-- local mock_frame = {
-- getParent = function()
-- return {
-- args = {
-- accepted = arg[1] or "Echinocereus sciurus subsp. floresii (Schwarz ex Backeb.) N.P.Taylor in Cactaceae Consensus Init. 3: 10. 1997 sec. Guzmán Cruz & al. 2003",
-- synonym = arg[1] or "Echinocereus sciurus subsp. floresii (Schwarz ex Backeb.) N.P.Taylor in Cactaceae Consensus Init. 3: 10. 1997 sec. Guzmán Cruz & al. 2003",
-- -- accepted = arg[1] or "Astrophytum coahuilense (H.Moeller) K.Kayser in Kakteen-Freund 1: 59. 1932. Sec. Vázquez-Lobo & al. (2015)",
-- -- synonym = arg[2] or "Astrophytum myriostigma var. coahuilense (H.Moeller) K.Kayser in Borg, Cacti, ed. 1: 251. 1937 syn. sec. Arias (2021)",
-- -- accepted = arg[1] or "Echinocereus ×roetteri (Engelm.) Engelm. ex Rümpler, Handb. Cacteenk., ed. 2, 2(16): 829. 1886. Sec. Hunt (2016)",
-- -- synonym = arg[2] or "Echinocereus ×roetteri var. lloydii (Britton & Rose) Backeb., Cactaceae 4: 2027. 1960",
-- -- accepted = arg[1] or "Lophophora williamsii (Lem. ex Salm-Dyck) J.M.Coult. in Contr. U.S. Natl. Herb. 3(2): 131. 1894 sec. Parfitt & Gibson 2003",
-- -- synonym = arg[2] or "Lophophora alberto-vojtechii Šnicer, Bohata & Mysák, 2008",
-- -- accepted = arg[1] or "Acanthocalycium leucanthum (Gillies ex Salm-Dyck) Schlumpb. in Cactaceae Syst. Init. 28: 29. 2012. Sec. Schlumpberger (2012)",
-- -- synonym = arg[2] or "Echinopsis leucantha (Gillies ex Salm-Dyck) Walp., Repert. Bot. Syst. 2: 324. 1843",
-- -- unresolved = arg[3] or "Lobivia kuehhasii Rausch in Kakteen And. Sukk. 60: 320. 2009. Sec. WFO 2019",
-- -- "synhomo",
-- -- "synhetero",
-- image = "test.jpg",
-- imageTitle = "Teszt kép"
-- }
-- }
-- end
-- }
-- print("\n--- TAXONBOX GENERÁLT WIKITEXT ---")
-- local success, result = pcall(p.buildTaxonbox, mock_frame)
-- print(success and result or "HIBA: " .. result)
-- print("\n--- TUDOMÁNYOS NÉV SZAKASZ ---")
-- local success2, result2 = pcall(p.format_tudomanyos_nev, mock_frame)
-- print(success2 and result2 or "HIBA: " .. result2)
-- end
-- ==========================================================
-- ONLINE HASZNÁLAT
-- ==========================================================
-- {{Taxonbox
-- | accepted = Astrophytum coahuilense
-- | synonym = Astrophytum myriostigma var. coahuilense
-- | synhomo v. synhetero
-- | image = test.jpg
-- | imageTitle = "Teszt kép"
-- }}
-- Ezt kell beszúrni a Taxonbox2.lua végére, a return p elé, így lesz publikus a cultivarboxnak
p.extract_genus = extract_genus
p.format_taxon_clean = format_taxon_clean
p.format_taxon_full = format_taxon_full
-- p.buildTaxonbox = p.buildTaxonbox -- Ez valószínűleg már ott van, ha a p.build... formát használtad
return p