Modul:Cultivarbox
Megjelenés
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 a kultivár résztől
local genus, cv_part = clean:match("^(.-)%s+(['\"].+['\"])$")
if not genus or not cv_part then
return "'''" .. clean .. "'''", "'''" .. clean .. "'''", 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''''
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 })
if overrideParent and overrideParent ~= '' then
taxonName = overrideParent
overrideParent = nil
else
taxonName = genus_part
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:cv.svg|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 .. "'']]"
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 = "Faj", 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'
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 syn_disp = parse_and_format_cultivar(item.name)
output = output .. '|-\n'
output = output .. '| class = "left" | ' .. item.rank .. '\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>\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 = {
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
return p