Ugrás a tartalomhoz

„Modul:Taxonbox” változatai közötti eltérés

Innen: MKOE wiki
Nincs szerkesztési összefoglaló
Nincs szerkesztési összefoglaló
 
(10 közbenső módosítás ugyanattól a felhasználótól nincs mutatva)
6. sor: 6. sor:


-- Betölti a központi adatmodult, amiben a hierarchia szerepel.
-- Betölti a központi adatmodult, amiben a hierarchia szerepel.
local TaxonData = require('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
42. 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%.")
54. 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%-]+)")
66. 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
72. sor: 75. sor:
     end
     end


     local low_ranks = { "gen%.", "subgen%.", "sect%.", "subsect%.", "ser%.", "subser%.", "sp%.", "subsp%.", "var%.", "f%." }
     -- 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 prefix, r_found, epithet, rest = main_part:match("^([%a%-%.%s]+)%s+("..r_pattern..")%s+([%a%-]+)%s*(.*)$")
         local g, s, r_found, e, rest = main_part:match("^([%a%-]+)%s+([%a%-]+)%s+("..r_pattern..")%s+([%a%-]+)%s*(.*)$")
         if prefix then
         if g then
             local g, s = prefix:match("^([%a%-]+)%s*([%a%-]*)$")
             return "'''''" .. g .. " " .. s .. "'' " .. r_found .. " ''" .. e .. "''''' " .. (rest or "") .. sec_formatted
            local full_prefix = g .. (s ~= "" and (" " .. s) or "")
            return "'''''" .. full_prefix .. "'' " .. r_found .. " ''" .. epithet .. "''''' " .. (rest or "") .. sec_formatted
         end
         end
     end
     end


     local genus, species, rest = main_part:match("^([%a%-]+)%s+([%a%-]+)%s*(.*)$")
     -- 5. Infragenerikus taxonok (sect., ser. stb.) kezelése
    if genus and species and #species > 2 then
    local infra_gen_ranks = { "gen%.", "subgen%.", "sect%.", "subsect%.", "ser%.", "subser%.", "sp%." }
        return "'''''" .. genus .. " " .. species .. "''''' " .. (rest or "") .. sec_formatted
    for _, r_pattern in ipairs(infra_gen_ranks) do
     else
        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 "'''''" .. (single_name or "") .. "''''' " .. (rest2 or "") .. sec_formatted
            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
     end
    -- 7. Alapeset (egy szó): '''''Taxon'''''
    local single_name, rest2 = main_part:match("^([%a%-]+)%s*(.*)$")
    return "'''''" .. (single_name or "") .. "''''' " .. (rest2 or "") .. sec_formatted
end
end


95. sor: 119. sor:
     if not text or text == "" then return "", "" end
     if not text or text == "" then return "", "" end


     -- 1. Sec eltávolítása és tisztítás
     -- 1. Sec. rész eltávolítása (megőrizve az eredeti kisbetű-nagybetű formát!)
     local raw_clean = text:lower():find("sec%.") and text:sub(1, text:lower():find("sec%.") - 1) or text
local raw_clean = text
     raw_clean = raw_clean:gsub("%s+$", "")
     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 formatted = ""
     local plain = ""
     local plain = ""


     -- 2. Szerzők/Évszámok levágása
     -- 2. Infraspecifikus rangok (subsp., var., f.) kezelése
     local ranks = {"subsp%.", "var%.", "f%."}
     local infra_ranks = {"subsp%.", "var%.", "f%."}
     local found = false
     local found = false
      
      
     for _, r in ipairs(ranks) do
     for _, r in ipairs(infra_ranks) do
         local genus, species, found_rank, epithet = raw_clean:match("^([%a%-]+)%s+([%a%-]+)%s+("..r..")%s+([%a%-]+)")
        -- Minta: Genus species rank epithet
         if genus then
         local g, s, r_found, e = raw_clean:match("^([%a%-]+)%s+([%a%-]+)%s+("..r..")%s+([%a%-]+)")
             formatted = "''" .. genus .. " " .. species .. "'' " .. found_rank:gsub("%%", "") .. " ''" .. epithet .. "''"
         if g then
             plain = genus .. " " .. species .. " " .. found_rank:gsub("%%", "") .. " " .. epithet
             formatted = "''" .. g .. " " .. s .. "'' " .. r_found .. " ''" .. e .. "''"
             plain = g .. " " .. s .. " " .. r_found .. " " .. e
             found = true
             found = true
             break
             break
116. sor: 151. sor:
     end
     end


    -- 3. Binomiális (faj) vs. Monomiális (nemzetség + szerző) felismerése
     if not found then
     if not found then
         -- Ha sima binomiális név (Genus species)
         -- Két szót és a maradékot keressük (nem tesszük kisbetűssé!)
         local genus, species = raw_clean:match("^([%a%-]+)%s+([%a%-]+)")
         local first, second = raw_clean:match("^([%a%-]+)%s+([^%s]+)")
         if genus and species then
       
             formatted = "''" .. genus .. " " .. species .. "''"
         if first and second then
            plain = genus .. " " .. species
             -- 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
         else
             -- Ha csak egy szó (magasabb szint)
             -- Ha csak egy szó (magasabb szint vagy csak genus)
             local single = raw_clean:match("^([%a%-]+)") or raw_clean
             local single = raw_clean:match("^([%a%-]+)") or raw_clean
             formatted = "''" .. single .. "''"
             formatted = "''" .. single .. "''"
130. sor: 174. sor:
     end
     end


     -- Két értékkel térünk vissza: 1. Formázott, 2. Nyers
     -- Két értékkel térünk vissza: 1. Formázott (wikitext), 2. Nyers (linkhez)
     return formatted, plain
     return formatted, plain
end
end
149. sor: 193. sor:
         return '<div style="color:red;">Taxobox Hiba: Hiányzó taxon név.</div>'
         return '<div style="color:red;">Taxobox Hiba: Hiányzó taxon név.</div>'
     end
     end
    local synBoo  = (synonymName ~= nil)
    local unresBoo = (unresolvedName ~= nil)
    local hybBoo  = (hybridName ~= nil)


     local hierarchy = {}
     local hierarchy = {}
159. sor: 199. sor:


     while taxonName and taxonName ~= "" and taxonName ~= "nil" do
     while taxonName and taxonName ~= "" and taxonName ~= "nil" do
         local data = TaxonData[taxonName]
        -- 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
             if taxonName == initialTaxonName and taxonName:find("%s") then
            -- 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)
                 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
                -- Ha nem faj és nincs az adatbázisban, megállunk
                 break
                 break
             end
             end
208. sor: 256. sor:
     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 .. '! class="suha-svg" colspan="2"|[[Fájl:' .. statusImg .. '|x160px|link=]]\n'
     output = output .. '! class="suha-svg" colspan="2"|[[Fájl:' .. statusImg .. '|x160px|link=]]<br>' .. szoveg .. "\n"


     output = output .. "|-\n"
     -- output = output .. "|-\n"
     output = output .. '! colspan="2" | ' .. szoveg .. "\n"
     -- output = output .. '! colspan="2" | ' .. szoveg .. "\n"


     if taxonImage ~= '' then
     if taxonImage ~= '' then
219. sor: 267. sor:


     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
231. sor: 279. sor:


         -- Kategória hivatkozás tisztított névvel
         -- Kategória hivatkozás tisztított névvel
         if item.rank == "Faj" then  
         if item.rank == "Faj" then
             name_display = clean_formatted
             name_display = clean_formatted
         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%-%.%s]+)") or item.name
             local category_target = item.name:match("^([%a%-%.%s]+)") or item.name
             -- A kategória linkhez a plain (formázás mentes) változót használjuk
             if item.rank == "Nemzetség" then
            name_display = "[[:Kategória:" .. clean_plain .. "|" .. clean_formatted .. "]]"
                -- 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
          
          
263. sor: 316. sor:
     local args = frame:getParent().args
     local args = frame:getParent().args
     local names = {
     local names = {
         { val = args.accepted,  class = "acc",    txt= "elfogadott név"},
         { val = args.accepted,  class = "tnb tnb-acc",    class2 = "tns tns-acc",    txt= "elfogadott, érvényes név"},
         { val = args.synonym,    class = "syn",    txt= "szinonima név"},
         { val = args.synonym,    class = "tnb tnb-syn",    class2 = "tns tns-syn",    txt= "szinonima név"},
         { val = args.unresolved, class = "unres",  txt= "feloldatlan név"},
         { val = args.unresolved, class = "tnb tnb-unres",  class2 = "tns tns-unres",  txt= "feloldatlan név"},
         { val = args.hybrid,    class = "hyb",    txt= "hibrid név"}
         { val = args.hybrid,    class = "tnb tnb-hyb",    class2 = "tns tns-hyb",    txt= "hibrid név"}
     }
     }


     local output = '<div class="tud">'
     output = '== Tudományos név ==\n'
     output = 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> <span class="' .. n.class .. '">' .. (n.txt) .. '</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
     local output = output .. '</div>'
     output = output .. '</div>\n'
     return output
     return output
end
end

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