„Modul:Taxonbox” változatai közötti eltérés
Megjelenés
Nincs szerkesztési összefoglaló |
Nincs szerkesztési összefoglaló |
||
| (20 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 | ||
| 15. sor: | 15. sor: | ||
end | end | ||
-- Segédfüggvény: Dőlt betűs taxonnév | -- 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) | ||
if not name or name == '' then return "" end | if not name or name == '' then return "" end | ||
local formattedName = name | 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''" | |||
local minta = "([%a%-]+)%s+([%a%-]+) | |||
local csere = "''%1 %2'' | |||
formattedName = string.gsub(name, minta, csere) | formattedName = string.gsub(name, minta, csere) | ||
elseif string.match(name, "[%a%-]+%s+[%a%-]+") then | elseif string.match(name, "[%a%-]+%s+[%a%-]+") then | ||
| 40. sor: | 29. sor: | ||
local csere = "''%1 %2''" | local csere = "''%1 %2''" | ||
formattedName = string.gsub(name, minta, csere) | formattedName = string.gsub(name, minta, csere) | ||
else | |||
formattedName = "''" .. name .. "''" | |||
end | end | ||
return formattedName | return formattedName | ||
end | end | ||
-- Segédfüggvény: Teljes formázás rangokkal és sec. megjegyzésekkel | -- 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) | ||
if not text or text == "" then return "" end | if not text or text == "" then return "" end | ||
| 51. sor: | 42. sor: | ||
local sec_part = "" | local sec_part = "" | ||
-- 1. "sec." rész leválasztása | |||
local lower_text = text:lower() | local lower_text = text:lower() | ||
local start_index = lower_text:find("sec%.") | local start_index = lower_text:find("sec%.") | ||
| 63. sor: | 55. sor: | ||
local sec_formatted = (sec_part ~= "") and (' <span class="sec">' .. sec_part .. '</span>') or "" | 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 | if not rank or rank == "" then | ||
local first_word = main_part:match("^([%a%-]+)") | local first_word = main_part:match("^([%a%-]+)") | ||
| 75. sor: | 68. sor: | ||
end | end | ||
-- 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 } | local high_ranks = { ["Rend"]=true, ["Család"]=true, ["Alcsalád"]=true, ["Nemzetségcsoport"]=true, ["Alnemzetség-csoport"]=true } | ||
if rank and high_ranks[rank] then | if rank and high_ranks[rank] then | ||
| 81. sor: | 75. sor: | ||
end | end | ||
-- 4. Infraspecifikus taxonok (subsp., var., f.) kezelése | |||
-- Itt a minta: Genus species rank epithet rest | |||
local low_ranks = { "subsp%.", "var%.", "f%." } | |||
for _, r_pattern in ipairs(low_ranks) do | for _, r_pattern in ipairs(low_ranks) do | ||
local | local g, s, r_found, e, rest = main_part:match("^([%a%-]+)%s+([%a%-]+)%s+("..r_pattern..")%s+([%a%-]+)%s*(.*)$") | ||
if | if g then | ||
return "'''''" .. g .. " " .. s .. "'' " .. r_found .. " ''" .. e .. "''''' " .. (rest or "") .. sec_formatted | |||
end | end | ||
end | end | ||
local | -- 5. Infragenerikus taxonok (sect., ser. stb.) kezelése | ||
if | local infra_gen_ranks = { "gen%.", "subgen%.", "sect%.", "subsect%.", "ser%.", "subser%.", "sp%." } | ||
return "'''''" .. | for _, r_pattern in ipairs(infra_gen_ranks) do | ||
local g, r_found, e, rest = main_part:match("^([%a%-]+)%s+("..r_pattern..")%s+([%a%-]+)%s*(.*)$") | |||
local single_name, rest2 = main_part:match("^([%a%-]+)%s*(.*)$") | if g then | ||
return "'''''" .. g .. "'' " .. r_found .. " ''" .. e .. "''''' " .. (rest or "") .. sec_formatted | |||
end | |||
end | |||
-- 6. Binomiális név (Faj) vs. Monomiális név (Nemzetség + Szerző) | |||
-- Logika: Ha a második szó kisbetűvel kezdődik, az faji jelző (species epithet) -> dőlt. | |||
-- Ha nagybetűvel, zárójellel vagy ponttal kezdődik, az szerző -> nem dőlt. | |||
local first, second, rest = main_part:match("^([%a%-]+)%s+([^%s]+)%s*(.*)$") | |||
if first and second then | |||
-- Ellenőrizzük, hogy a második szó kisbetűvel kezdődik-e | |||
if second:match("^[a-z]") then | |||
-- Faj: '''''Genus species''''' | |||
return "'''''" .. first .. " " .. second .. "''''' " .. (rest or "") .. sec_formatted | |||
else | |||
-- Nemzetség + Szerző: '''''Genus''''' Szerző | |||
return "'''''" .. first .. "''''' " .. second .. " " .. (rest or "") .. sec_formatted | |||
end | |||
end | |||
-- 7. 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. Sec. rész eltávolítása (megőrizve az eredeti kisbetű-nagybetű formát!) | |||
local raw_clean = text | |||
local lower_text = text:lower() | |||
local sec_start = lower_text:find("sec%.") | |||
if sec_start then | |||
raw_clean = text:sub(1, sec_start - 1):gsub("%s+$", "") | |||
end | |||
-- Speciális eset: Ha a név benne van az adatbázisban úgy, ahogy van (pl. "Core Eudicots") | |||
-- akkor ne próbáljuk meg szétszedni szerzőre és nemzetségre! | |||
if TaxonData[raw_clean] then | |||
return "''" .. raw_clean .. "''", raw_clean | |||
end | |||
local formatted = "" | |||
local plain = "" | |||
-- 2. Infraspecifikus rangok (subsp., var., f.) kezelése | |||
local infra_ranks = {"subsp%.", "var%.", "f%."} | |||
local found = false | |||
for _, r in ipairs(infra_ranks) do | |||
-- Minta: Genus species rank epithet | |||
local g, s, r_found, e = raw_clean:match("^([%a%-]+)%s+([%a%-]+)%s+("..r..")%s+([%a%-]+)") | |||
if g then | |||
formatted = "''" .. g .. " " .. s .. "'' " .. r_found .. " ''" .. e .. "''" | |||
plain = g .. " " .. s .. " " .. r_found .. " " .. e | |||
found = true | |||
break | |||
end | |||
end | |||
-- 3. Binomiális (faj) vs. Monomiális (nemzetség + szerző) felismerése | |||
if not found then | |||
-- Két szót és a maradékot keressük (nem tesszük kisbetűssé!) | |||
local first, second = raw_clean:match("^([%a%-]+)%s+([^%s]+)") | |||
if first and second then | |||
-- Ha a második szó kisbetűvel kezdődik -> Fajnév | |||
if second:match("^[a-z]") then | |||
formatted = "''" .. first .. " " .. second .. "''" | |||
plain = first .. " " .. second | |||
else | |||
-- Ha nagybetűvel vagy zárójellel kezdődik -> Szerző (csak a nemzetség dőlt) | |||
formatted = "''" .. first .. "''" | |||
plain = first | |||
end | |||
else | |||
-- Ha csak egy szó (magasabb szint vagy csak genus) | |||
local single = raw_clean:match("^([%a%-]+)") or raw_clean | |||
formatted = "''" .. single .. "''" | |||
plain = single | |||
end | |||
end | end | ||
-- Két értékkel térünk vissza: 1. Formázott (wikitext), 2. Nyers (linkhez) | |||
return formatted, plain | |||
end | end | ||
| 103. sor: | 181. sor: | ||
local args = frame:getParent().args | local args = frame:getParent().args | ||
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 | ||
| 111. sor: | 188. sor: | ||
local imageTitle = args.imageTitle or '' | local imageTitle = args.imageTitle or '' | ||
local initialTaxonName = synonymName or unresolvedName or hybridName or acceptedName | local initialTaxonName = synonymName or unresolvedName or hybridName or acceptedName | ||
| 118. sor: | 194. sor: | ||
end | end | ||
local hierarchy = {} | local hierarchy = {} | ||
local taxonName = initialTaxonName | local taxonName = initialTaxonName | ||
| 128. sor: | 199. sor: | ||
while taxonName and taxonName ~= "" and taxonName ~= "nil" do | while taxonName and taxonName ~= "" and taxonName ~= "nil" do | ||
local data = TaxonData[ | -- JAVÍTÁS: Mindig a tisztított (sallangmentes) névvel keressünk az adatmodulban | ||
local _, cleanNameForLookup = format_taxon_clean(taxonName) | |||
local data = TaxonData[cleanNameForLookup] | |||
if data then | if data then | ||
table.insert(hierarchy, { rank = data.rank, name = taxonName }) | table.insert(hierarchy, { rank = data.rank, name = taxonName }) | ||
taxonName = data.parent | taxonName = data.parent | ||
else | else | ||
-- Ha | -- Ha nincs az adatbázisban, ellenőrizzük, hogy faj-e | ||
if taxonName == initialTaxonName and | -- (Csak akkor, ha a második szó kisbetűs) | ||
local first, second = taxonName:match("^([%a%-]+)%s+([^%s]+)") | |||
if taxonName == initialTaxonName and first and second and second:match("^[a-z]") then | |||
local actual_parent = (parentOverride ~= '' and parentOverride) or extract_genus(taxonName) | local actual_parent = (parentOverride ~= '' and parentOverride) or extract_genus(taxonName) | ||
table.insert(hierarchy, { rank = "Faj", name = taxonName }) | table.insert(hierarchy, { rank = "Faj", name = taxonName }) | ||
taxonName = actual_parent | taxonName = actual_parent | ||
else | else | ||
break | -- Ha nem faj és nincs az adatbázisban, megállunk | ||
break | |||
end | end | ||
end | end | ||
| 148. sor: | 226. sor: | ||
end | end | ||
local tipus, szoveg, megjelenitendoNev | local tipus, szoveg, megjelenitendoNev | ||
-- Itt kapja meg a két értéket | |||
local clean_formatted_acceptedName, clean_plain_acceptedName = format_taxon_clean(acceptedName) | |||
if synBoo then | if synBoo then | ||
tipus = "syn" | tipus = "syn" | ||
megjelenitendoNev = synonymName | megjelenitendoNev = synonymName | ||
szoveg = "Ez egy taxonómiai szinonima név | szoveg = "Ez egy taxonómiai szinonima név.<br>Az érvényes leírást lásd itt:<br>[[" .. clean_plain_acceptedName .. "|" .. clean_formatted_acceptedName .. "]]" | ||
elseif unresBoo then | elseif unresBoo then | ||
tipus = "unres" | tipus = "unres" | ||
| 170. sor: | 247. sor: | ||
end | end | ||
-- Itt kapja meg a két értéket | |||
local clean_formatted_megjelenitendoNev, clean_plain_megjelenitendoNev = format_taxon_clean(megjelenitendoNev) | |||
local output = '{| class="infobox biota ' .. tipus .. '"\n' | |||
output = output .. "|-\n" | output = output .. "|-\n" | ||
output = output .. '! class="taxonnev" colspan="2" | ' .. | output = output .. '! class="taxonnev" colspan="2" | ' .. clean_formatted_megjelenitendoNev .. "\n" | ||
output = output .. "|-\n" | output = output .. "|-\n" | ||
local statusImg = (synBoo and "syn.svg") or (unresBoo and "unres.svg") or (hybBoo and "hyb.svg") or "acc.svg" | local statusImg = (synBoo and "syn.svg") or (unresBoo and "unres.svg") or (hybBoo and "hyb.svg") or "acc.svg" | ||
output = output .. '!colspan="2"|[[Fájl:' .. statusImg .. '| | output = output .. '! class="suha-svg" colspan="2"|[[Fájl:' .. statusImg .. '|x160px|link=]]<br>' .. szoveg .. "\n" | ||
output = output .. "|-\n" | -- output = output .. "|-\n" | ||
output = output .. '! | -- output = output .. '! colspan="2" | ' .. szoveg .. "\n" | ||
if taxonImage ~= '' then | if taxonImage ~= '' then | ||
output = output .. '|-\n' | output = output .. '|-\n' | ||
output = output .. '!colspan="2"|[[Fájl:' .. taxonImage .. '|340px|' .. imageTitle .. ']]\n' | output = output .. '! class="suha-svg" colspan="2"|[[Fájl:' .. taxonImage .. '|340px|' .. imageTitle .. ']]\n' | ||
end | end | ||
output = output .. '|-\n' | output = output .. '|-\n' | ||
output = output .. '!colspan="2"|Rendszertani besorolás\n' | output = output .. '! class="besorolas" colspan="2"|Rendszertani besorolás\n' | ||
for i = #hierarchy, 1, -1 do | for i = #hierarchy, 1, -1 do | ||
local item = hierarchy[i] | local item = hierarchy[i] | ||
local rank_display = item.rank | 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 = | name_display = clean_formatted | ||
else | else | ||
name_display = "[[:Kategória:" .. name_display .. "|" .. | -- Megkeressük az alapnevet a kategória linkhez (szerzők nélkül) | ||
local category_target = item.name:match("^([%a%-%.%s]+)") or item.name | |||
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 | 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 .. '|-\n' | ||
| 210. sor: | 301. sor: | ||
end | end | ||
if hierarchy[1] and hierarchy[1].rank == "Faj" then | if hierarchy[1] and hierarchy[1].rank == "Faj" then | ||
local encodedTerm = mw.uri.encode(initialTaxonName) | local encodedTerm = mw.uri.encode(initialTaxonName) | ||
| 226. sor: | 316. sor: | ||
local args = frame:getParent().args | local args = frame:getParent().args | ||
local names = { | local names = { | ||
{ val = args.accepted, class = "acc" }, | { val = args.accepted, class = "tnb tnb-acc", class2 = "tns tns-acc", txt= "elfogadott, érvényes név"}, | ||
{ val = args.synonym, class = "syn" }, | { val = args.synonym, class = "tnb tnb-syn", class2 = "tns tns-syn", txt= "szinonima név"}, | ||
{ val = args.unresolved, class = "unres" }, | { val = args.unresolved, class = "tnb tnb-unres", class2 = "tns tns-unres", txt= "feloldatlan név"}, | ||
{ val = args.hybrid, class = "hyb" } | { val = args.hybrid, class = "tnb tnb-hyb", class2 = "tns tns-hyb", txt= "hibrid név"} | ||
} | } | ||
output = '== Tudományos név ==\n' | |||
output = output .. '<div class="tn">\n' | |||
for _, n in ipairs(names) do | for _, n in ipairs(names) do | ||
if n.val and n.val ~= '' then | if n.val and n.val ~= '' then | ||
output = output .. '* <span class="' .. n.class .. '">' .. format_taxon_full(n.val) .. '</span>\n' | output = output .. '* <span class="' .. n.class .. '">' .. format_taxon_full(n.val) .. '</span><br><span class="' .. n.class2 .. '">' .. (n.txt) .. '</span>\n' | ||
end | end | ||
end | end | ||
output = output .. '</div>\n' | |||
return output | return output | ||
end | end | ||
| 262. sor: | 354. sor: | ||
local success, result = pcall(p.buildTaxonbox, mock_frame) | local success, result = pcall(p.buildTaxonbox, mock_frame) | ||
print(success and result or "HIBA: " .. result) | print(success and result or "HIBA: " .. result) | ||
print("--- TUDOMÁNYOS NÉV SZAKASZ ---") | print("\n--- TUDOMÁNYOS NÉV SZAKASZ ---") | ||
local success2, result2 = pcall(p.format_tudomanyos_nev, mock_frame) | local success2, result2 = pcall(p.format_tudomanyos_nev, mock_frame) | ||
print(success2 and result2 or "HIBA: " .. result2) | print(success2 and result2 or "HIBA: " .. result2) | ||
A lap jelenlegi, 2026. február 1., 20:49-kori változata
A modult a Modul:Taxonbox/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
local genus_name = full_species_name:match("([^%s]+)")
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)
local high_ranks = { ["Rend"]=true, ["Család"]=true, ["Alcsalád"]=true, ["Nemzetségcsoport"]=true, ["Alnemzetség-csoport"]=true }
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
-- Itt a minta: Genus species rank epithet rest
local low_ranks = { "subsp%.", "var%.", "f%." }
for _, r_pattern in ipairs(low_ranks) do
local g, s, r_found, e, rest = main_part:match("^([%a%-]+)%s+([%a%-]+)%s+("..r_pattern..")%s+([%a%-]+)%s*(.*)$")
if g then
return "'''''" .. g .. " " .. s .. "'' " .. r_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, r_found, e, rest = main_part:match("^([%a%-]+)%s+("..r_pattern..")%s+([%a%-]+)%s*(.*)$")
if g then
return "'''''" .. g .. "'' " .. r_found .. " ''" .. e .. "''''' " .. (rest or "") .. sec_formatted
end
end
-- 6. Binomiális név (Faj) vs. Monomiális név (Nemzetség + Szerző)
-- Logika: Ha a második szó kisbetűvel kezdődik, az faji jelző (species epithet) -> dőlt.
-- Ha nagybetűvel, zárójellel vagy ponttal kezdődik, az szerző -> nem dőlt.
local first, second, rest = main_part:match("^([%a%-]+)%s+([^%s]+)%s*(.*)$")
if first and second then
-- Ellenőrizzük, hogy a második szó kisbetűvel kezdődik-e
if second:match("^[a-z]") then
-- Faj: '''''Genus species'''''
return "'''''" .. first .. " " .. second .. "''''' " .. (rest or "") .. sec_formatted
else
-- Nemzetség + Szerző: '''''Genus''''' Szerző
return "'''''" .. first .. "''''' " .. second .. " " .. (rest or "") .. sec_formatted
end
end
-- 7. 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. Sec. rész eltávolítása (megőrizve az eredeti kisbetű-nagybetű formát!)
local raw_clean = text
local lower_text = text:lower()
local sec_start = lower_text:find("sec%.")
if sec_start then
raw_clean = text:sub(1, sec_start - 1):gsub("%s+$", "")
end
-- Speciális eset: Ha a név benne van az adatbázisban úgy, ahogy van (pl. "Core Eudicots")
-- akkor ne próbáljuk meg szétszedni szerzőre és nemzetségre!
if TaxonData[raw_clean] then
return "''" .. raw_clean .. "''", raw_clean
end
local formatted = ""
local plain = ""
-- 2. Infraspecifikus rangok (subsp., var., f.) kezelése
local infra_ranks = {"subsp%.", "var%.", "f%."}
local found = false
for _, r in ipairs(infra_ranks) do
-- Minta: Genus species rank epithet
local g, s, r_found, e = raw_clean:match("^([%a%-]+)%s+([%a%-]+)%s+("..r..")%s+([%a%-]+)")
if g then
formatted = "''" .. g .. " " .. s .. "'' " .. r_found .. " ''" .. e .. "''"
plain = g .. " " .. s .. " " .. r_found .. " " .. e
found = true
break
end
end
-- 3. Binomiális (faj) vs. Monomiális (nemzetség + szerző) felismerése
if not found then
-- Két szót és a maradékot keressük (nem tesszük kisbetűssé!)
local first, second = raw_clean:match("^([%a%-]+)%s+([^%s]+)")
if first and second then
-- Ha a második szó kisbetűvel kezdődik -> Fajnév
if second:match("^[a-z]") then
formatted = "''" .. first .. " " .. second .. "''"
plain = first .. " " .. second
else
-- Ha nagybetűvel vagy zárójellel kezdődik -> Szerző (csak a nemzetség dőlt)
formatted = "''" .. first .. "''"
plain = first
end
else
-- Ha csak egy szó (magasabb szint vagy csak genus)
local single = raw_clean:match("^([%a%-]+)") or raw_clean
formatted = "''" .. single .. "''"
plain = single
end
end
-- Két értékkel térünk vissza: 1. Formázott (wikitext), 2. Nyers (linkhez)
return formatted, plain
end
function p.buildTaxonbox(frame)
local args = frame:getParent().args
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 taxonImage = args.image or ''
local imageTitle = args.imageTitle or ''
local initialTaxonName = synonymName or unresolvedName or hybridName or acceptedName
if not initialTaxonName then
return '<div style="color:red;">Taxobox Hiba: Hiányzó taxon név.</div>'
end
local hierarchy = {}
local taxonName = initialTaxonName
local parentOverride = args.parent
while taxonName and taxonName ~= "" and taxonName ~= "nil" do
-- JAVÍTÁS: Mindig a tisztított (sallangmentes) névvel keressünk az adatmodulban
local _, cleanNameForLookup = format_taxon_clean(taxonName)
local data = TaxonData[cleanNameForLookup]
if data then
table.insert(hierarchy, { rank = data.rank, name = taxonName })
taxonName = data.parent
else
-- Ha nincs az adatbázisban, ellenőrizzük, hogy faj-e
-- (Csak akkor, ha a második szó kisbetűs)
local first, second = taxonName:match("^([%a%-]+)%s+([^%s]+)")
if taxonName == initialTaxonName and first and second and second:match("^[a-z]") then
local actual_parent = (parentOverride ~= '' and parentOverride) or extract_genus(taxonName)
table.insert(hierarchy, { rank = "Faj", name = taxonName })
taxonName = actual_parent
else
-- Ha nem faj és nincs az adatbázisban, megállunk
break
end
end
end
if #hierarchy == 0 then
return '<div style="color:red;">Taxobox Hiba: Nem található adat a "' .. tostring(initialTaxonName) .. '" taxonhoz.</div>'
end
local tipus, szoveg, megjelenitendoNev
-- Itt kapja meg a két értéket
local clean_formatted_acceptedName, clean_plain_acceptedName = format_taxon_clean(acceptedName)
if synBoo then
tipus = "syn"
megjelenitendoNev = synonymName
szoveg = "Ez egy taxonómiai szinonima név.<br>Az érvényes leírást lásd itt:<br>[[" .. clean_plain_acceptedName .. "|" .. clean_formatted_acceptedName .. "]]"
elseif unresBoo then
tipus = "unres"
megjelenitendoNev = unresolvedName
szoveg = "A név státusza bizonytalan (unresolved)."
elseif hybBoo then
tipus = "hyb"
megjelenitendoNev = hybridName
szoveg = "Ez egy hibrid taxon."
else
tipus = "acc"
megjelenitendoNev = acceptedName
szoveg = "Érvényes, elfogadott név."
end
-- Itt kapja meg a két értéket
local clean_formatted_megjelenitendoNev, clean_plain_megjelenitendoNev = format_taxon_clean(megjelenitendoNev)
local output = '{| class="infobox biota ' .. tipus .. '"\n'
output = output .. "|-\n"
output = output .. '! class="taxonnev" colspan="2" | ' .. clean_formatted_megjelenitendoNev .. "\n"
output = output .. "|-\n"
local statusImg = (synBoo and "syn.svg") or (unresBoo and "unres.svg") or (hybBoo and "hyb.svg") or "acc.svg"
output = output .. '! class="suha-svg" colspan="2"|[[Fájl:' .. statusImg .. '|x160px|link=]]<br>' .. szoveg .. "\n"
-- output = output .. "|-\n"
-- output = output .. '! colspan="2" | ' .. szoveg .. "\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
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(initialTaxonName)
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 .. '|}'
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"}
}
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 "Echinopsis leucantha",
synonym = arg[2] or "",
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
return p