Ugrás a tartalomhoz

Modul:Cultivarbox

Innen: MKOE wiki

A modult a Modul:Cultivarbox/doc lapon tudod dokumentálni

-- =======================================================================================
-- TaxonokRawData.lua > TaxonokRawDataConvert.lua > Taxonbox2.lua > buildCultivarbox.lua
-- =======================================================================================

local p = {}

-- Betölti a központi taxonbox modult és a nyers adatokat
local TaxonBox = require('Modul:Taxonbox2')
local TaxonData = require('Modul:TaxonokData')

----------------------------------------------------------------------------------------------------------------
-- Segédfüggvény: Kultivárnév pontos MediaWiki aposztróf-formázása
local function parse_and_format_cultivar(full_name)
    if not full_name or full_name == "" then return "", "", "" end

    -- Megtisztítjuk az esetleges korábbi wiki tagektől
    local clean = full_name:gsub("'''''", ""):gsub("''''", ""):gsub("'''", ""):gsub("''", ""):match("^%s*(.-)%s*$")

    -- Különválasztjuk a nemzetséget (akár hibridjellel) a kultivár résztől
    local genus, cv_part = clean:match("^(.-)%s+(['\"].+['\"])$")

    if not genus or not cv_part then
        local formatted_plain = "'''" .. clean .. "'''"
        return formatted_plain, formatted_plain, clean
    end

    -- Kicseréljük a cv_part záró aposztrófját '-re, hogy a MediaWiki parser ne nyelje el a 4x ' találkozásánál
    local cv_inner = cv_part:sub(1, -2) .. "'"

    -- 1. Infobox fejléc & Besorolás sor: '''''Genus'' 'Cultivar'''' (a genus tartalmazza a × jelet is)
    local header_formatted = "'''''" .. genus .. "'' " .. cv_inner .. "'''"

    -- 2. Tudományos név szakasz: '''''Genus'' 'Cultivar'''
    local scientific_formatted = "'''''" .. genus .. "'' " .. cv_part .. "'''"

    -- 3. Tiszta név
    local plain_name = genus .. " " .. cv_part

    return header_formatted, scientific_formatted, plain_name
end

----------------------------------------------------------------------------------------------------------------
function p.buildCultivarbox(frame)
    local args = frame:getParent().args

    local cultivarName   = (args.cultivar   ~= '' and args.cultivar) or nil
    local synonymName    = (args.synonym    ~= '' and args.synonym) 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 output = ""

    -- cultivarName ----------------------------------
    if cultivarName then
        local hierarchy = {}
        local taxonName = cultivarName
        local overrideParent = parentName

        while taxonName and taxonName ~= "" and taxonName ~= "nil" do
            local _, lookupName = TaxonBox.format_taxon_clean(taxonName)
            local data = TaxonData[lookupName] or TaxonData[taxonName]

            if data then
                table.insert(hierarchy, { rank = data.rank, name = lookupName })
                taxonName = data.parent
                overrideParent = nil
            else
                -- Ha a taxon nincs az adatbázisban (összetett név, pl. kultivár)
                local genus_part, rest_part = taxonName:match("^([%a%-%×%s%.]+)%s+(.+)$")

                if genus_part and rest_part then
                    local current_rank = rest_part:match("^['\"].+['\"]") and "Kultivár" or "Faj"
                    table.insert(hierarchy, { rank = current_rank, name = taxonName })

                    -- Megnézzük, hogy maga a nemzetség / hibridnemzetség benne van-e a TaxonData-ban
                    local _, genusLookup = TaxonBox.format_taxon_clean(genus_part)
                    local genusData = TaxonData[genusLookup] or TaxonData[genus_part]

                    if genusData then
                        taxonName = genusLookup
                    else
                        -- Ha a nemzetség sincs a TaxonData-ban, manuálisan beszúrjuk a Nothogenus / Nemzetség sort
                        local genus_rank = (genus_part:sub(1, 2) == "×" or genus_part:sub(1, 1) == "x") and "Nothogenus" or "Nemzetség"
                        table.insert(hierarchy, { rank = genus_rank, name = genus_part })

                        if overrideParent and overrideParent ~= '' then
                            taxonName = overrideParent
                            overrideParent = nil
                        else
                            break
                        end
                    end
                else
                    -- Egytagú név, ami hiányzik a TaxonData-ból
                    if overrideParent and overrideParent ~= '' then
                        taxonName = overrideParent
                        overrideParent = nil
                    else
                        break
                    end
                end
            end
        end

        if #hierarchy == 0 then
            return '<div style="color:red;">Cultivarbox hiba: Nem található adat a "' .. tostring(cultivarName) .. '" taxonhoz.</div>'
        end

        local header_cv, _, plain_cv = parse_and_format_cultivar(cultivarName)

        output = output .. '{| class="infobox biota cv"\n'
        output = output .. "|-\n"
        output = output .. '! class="taxonnev" colspan="2" | ' .. header_cv .. "\n"

        output = output .. "|-\n"
        output = output .. '! class="suha-svg" colspan="2"|[[Fájl:cv2.png|x160px|link=]]<br>Kultivár, termesztett változat.\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 or "Taxon"
            local name_display = ""

            if item.rank == "Kultivár" then
                local cv_header = parse_and_format_cultivar(item.name)
                name_display = cv_header
            elseif item.rank == "Faj" then
                local clean_formatted, clean_plain = TaxonBox.format_taxon_clean(item.name)
                name_display = "[[" .. clean_plain .. "|" .. clean_formatted .. "]]"
            elseif item.rank == "Nemzetség" then
                local _, clean_plain = TaxonBox.format_taxon_clean(item.name)
                name_display = "[[:Kategória:" .. clean_plain .. "|''" .. clean_plain .. "'']]"
            elseif item.rank == "Nothogenus" or item.rank == "Hibridnemzetség" then
                rank_display = "Hibridnemzetség"
                local _, clean_plain = TaxonBox.format_taxon_clean(item.name)
                name_display = "[[:Kategória:" .. clean_plain .. "|''" .. clean_plain .. "'']]"
            else
                local _, clean_plain = TaxonBox.format_taxon_clean(item.name)
                name_display = "[[:Kategória:" .. clean_plain .. "|" .. clean_plain .. "]]"
            end

            if rank_display == "Nemzetségcsoport" then rank_display = "Nemzetség-<br>csoport" end
            if rank_display == "Alnemzetség-csoport" or 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" or hierarchy[1].rank == "Kultivár") then
            local encodedTerm = mw.uri.encode(plain_cv)
            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 = {}
        table.insert(syn_hierarchy, { rank = "Kultivár", name = synonymName })

        local header_syn, _, _ = parse_and_format_cultivar(synonymName)

        output = output .. '{| class="infobox biota syn"\n'
        output = output .. "|-\n"
        output = output .. '! class="taxonnev" colspan="2" | ' .. header_syn .. "\n"
        output = output .. "|-\n"
        output = output .. '! class="suha-svg" colspan="2"|[[Fájl:syn.svg|x160px|link=]]<br>Szinonima név\n'

        for i = #syn_hierarchy, 1, -1 do
            local item = syn_hierarchy[i]
            local syn_disp = parse_and_format_cultivar(item.name)
            output = output .. '|-\n'
            output = output .. '| class = "left" | Szinonim kultivárnév\n'
            output = output .. '| class = "right" | ' .. syn_disp .. '\n'
        end

        output = output .. '|}\n'
    end

    return output
end

----------------------------------------------------------------------------------------------------------------
function p.format_tudomanyos_nev(frame)
    local args = frame:getParent().args
    local names = {
        { val = args.cultivar,   class = "tnb tnb-cv",      class2 = "tns tns-cv",      txt = "kultivár"},
        { val = args.synonym,    class = "tnb tnb-syn",     class2 = "tns tns-syn",     txt = "szinonima név"},
        { val = args.hybrid,     class = "tnb tnb-hyb",     class2 = "tns tns-hyb",     txt = "hibrid név"}
    }

    local output = '== Kultivárnév (fajta-, hibridnév) ==\n'
    output = output .. '<div class="tn">\n'
    for _, n in ipairs(names) do
        if n.val and n.val ~= '' then
            local _, sci_formatted, _ = parse_and_format_cultivar(n.val)
            output = output .. '* <span class="' .. n.class .. '">' .. sci_formatted .. '</span><br><span class="' .. n.class2 .. '">' .. (n.txt) .. '</span>\n'
        end
    end
    output = output .. '</div>'
    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 = {
                    cultivar    = arg[1] or "×Graptoveria 'Lovely Rose'",
                    parent      = arg[2] or "Sedinae",
                    image       = "test.jpg",
                    imageTitle  = "Teszt kép"
                }
            }
        end
    }

    print("\n--- Cultivarbox GENERÁLT WIKITEXT ---")
    local success, result = pcall(p.buildCultivarbox, 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
-- ==========================================================
-- {{Cultivarbox
-- | cultivar   = ×Graptoveria 'Lovely Rose'
-- | synonym    = Graptopetalum 'Lovely Rose'
-- | parent     = Sedinae
-- | image      = test_image.jpg
-- | imageTitle = ×Graptoveria 'Lovely Rose'
-- }}

return p