Modul:Kembox/kozos

A Wikipédiából, a szabad enciklopédiából

Kembox/kozos[mi ez?] • [dokumentáció: mutat, szerkeszt] • [tesztek: létrehozás]

Ez a modul tartalmazza a kémiai infoboxok (lásd: Sablon:Chembox/infóboxok) több részmodulja által használt/nem infoboxspecifikus függvényeket.

Tesztelt lapok
Chembox_new Chembox_új Vegyület_infobox Drugbox Gyógyszeresdoboz
hexametapil heptán hidrogén-klorid gemfibrozil kokain
glükóz koffein meptazinol
local p = {}

--[[      Az eredmény kiírása: az adatcsoport táblázatsorainak generálása az infóboxba
eredm:    string
                  Alcsoport fejléc.
          { címke, érték1, érték2, ... }
                  Normál érték. Minden érték külön táblázatsorba kerül. Egynél több érték esetén címke rowspan-os mező lesz.
          { típus, ... }
                  A típus szám, és a különlegesen kezelendő mezők típusát adja meg. A további paraméterek a típustól függenek. Lásd hivtomb alább.
                  1: egy vagy két kép. Paraméter: egy vagy két tábla a kép leírásával.
                  2: két oszlop széles szöveg. Paraméter: tábla a szöveggel és a betűmérettel.
                  3: címke/érték, ahol az értéket 2 oszlop szélesen kell kiírni. Paraméter: a két string.
                  4: a box címe. Paraméter: string.
                  5: két oszlop széles elrejthető szöveg. Két string paramétere van, becsukva csak az első látszik.
infobox:  a hívó infóbox neve. Ettől függ a kiírás formátuma
]]


--[[
Függvény egy kép kirajzolására. A paraméter egy asszociatív tömb az alábbi elemekkel:
ImageFile:  képfile zárójel és file: előtag nélkül. Kötelező.
ImageSize:  képméret.  Kötelező.
ImageAlt:   alternatív képszöveg (ha a böngésző a képet nem tudja kirajzolni)
ImageName:  kép felirat, ha ráállunk a kurzorral.
]]
local function egykep(infobox,kep)
   if kep and kep.ImageFile then 
        str = '[[file:'..kep.ImageFile..'|'..kep.ImageSize
        if tonumber(kep.ImageSize) then str = str..'px' end
        if kep.ImageAlt  then str = str..'|alt='..kep.ImageAlt end
        str = str..']]'
        if kep.ImageName then str = str..'<br>'..kep.ImageName    end
        return str
   else return ''
   end
end


--[[
Függvény egy vagy két kép kirajzolására. Mindkét paraméter egy-egy asszociatív tömb az alábbi elemekkel:
ImageFile:  képfile zárójel és file: előtag nélkül. Egyedül ez kötelező.
ImageSize:  képméret. A default a hívó sablontól függ.
ImageAlt:   alternatív képszöveg (ha a böngésző a képet nem tudja kirajzolni)
ImageName:  kép felirat, ha ráállunk a kurzorral.
]]
local function kepkiir(infobox,par1,par2)
   local meret1 = {   -- képméretek, ha egy sorban egy kép van
        Chembox_new          = '200px',
        ["Chembox_új"]       = '200px',
        ["Vegyület_infobox"] = '250px',
        Drugbox              = '280px',
        Drugbox_new          = '200px',
        }
   local meret2 = {   -- képméretek, ha egy sorban két kép van
        Chembox_new          = '100px',
        ["Chembox_új"]       = '100px',
        Drugbox_new          = '130px',
        }

   if par1 and par1.ImageFile 
   then     if par2 == nil   -- egy sorban egy kép
            then    if not par1.ImageSize then par1.ImageSize = meret1[infobox] end
                    if not par1.ImageSize then par1.ImageSize = '200px' end   -- rossz az infobox paraméter értéke
                    return 'colspan="2"  align="center" | '..egykep(infobox,par1)
            else    if not par1.ImageSize then par1.ImageSize = meret2[infobox] end
                    if not par1.ImageSize then par1.ImageSize = '100px' end   -- rossz az infobox paraméter értéke
                    if not par2.ImageSize then par2.ImageSize = meret2[infobox] end
                    if not par2.ImageSize then par2.ImageSize = '100px' end   -- rossz az infobox paraméter értéke
                    return 'align="center" | '..egykep(infobox,par1)..' || '..
                           'align="center" | '..egykep(infobox,par2)
            end
   else return ''
   end
end


local function szeles(infobox,par)   -- 2 oszlop szeles szoveget ir ki. Attribútumot zár (|) és megkezdi az értékmezőt.
    local szoveg    = par[1]    -- kiirando szoveg
    local betumeret = par[2]    -- betumeret
    local str       = 'colspan="2" align="center" | '
    if betumeret then return str..'<font size="'..betumeret..'">'..szoveg..'</font>'
    else              return str..szoveg
    end
end


local fejszoveg  = {  -- adatcsoport fejléc új sor, stílus, címke előtti és utáni (HTML-formázó) szöveg
      Chembox_new          = { '! colspan="2" ', 'style="background-color: #F8EABA; padding: 0.5em" align="center" ', ' <b>', '</b>' },
      ["Chembox_új"]       = { '! colspan="2" ', 'style="background-color: #F8EABA; padding: 0.5em" align="center" ', ' <b>', '</b>' },
      ["Vegyület_infobox"] = { '\n|-\n| colspan="2" ', 'style="line-height: 200%; background-color:#F8EABA" align="center" ', ' \'\'\'' , "'''" },
      Drugbox              = { '\n|-\n| colspan="2" ', 'bgcolor="#dddddd" ', ' \'\'\'' , "'''" },
      ["Gyógyszeresdoboz"] = { '\n|-\n| colspan="2" ', 'bgcolor="#dddddd" ', ' \'\'\'' , "'''" },
      }  -- Chembox_new==Chembox_új és Drugbox=Gyógyszeresdoboz


local function fejlec(infobox,szoveg)   -- adatcsoport fejléc kiírása
    local fej = fejszoveg[infobox]
    if fej     --TNT "infóbox"-ban nem írunk ki alcsoport fejlécet
    then return fej[1]..fej[2]..' | '..fej[3]..szoveg..fej[4]..'\n|-\n'
    end
return ''
end


local function boxfej(infobox,par)   -- par[1] az infobox fejlece.
    local str       = 'colspan="2" align="center" | '

    if infobox == 'Vegyület_infobox'
    then return 'class="fejlec vegyuletinfobox" style="background-color:#F8EABA; font-size:larger; line-height: 200%" '..str..par[1]
    elseif infobox == 'Chembox_new' or infobox == 'Chembox_új'
    then return fejlec(infobox,'<font style="font-size: larger">'..par[1]..'</font>')
    else return fejlec(infobox,par[1])
    end
end


local function smiles(infobox,par)
	local fej
	if fejszoveg[infobox] then fej = fejszoveg[infobox] else fej = fejszoveg.Chembox_new end

--	return fej[1]..'| <table class="mw-collapsible mw-collapsed"><tr><th '..fej[2]..'>'..fej[3]..par[1]..fej[4]..'</th></tr><tr><td>'..par[2]..'</td></tr></table>\n|-\n'
	return fej[1]..fej[2]..'| <table class="mw-collapsible mw-collapsed"><tr><th width="500">'..fej[3]..par[1]..fej[4]..'</th></tr><tr><td>'..par[2]..'</td></tr></table>\n|-\n'
end


--                     1          2             3            4               5
local mezo = {      -- sor eleji, címke előtti, címke utáni, értékattrkezdő, értékmezőkezdő, értékmező utáni (HTML-formázó) szöveg
      Chembox_new          = { '|', '', '', ' || ', '', '' },
      ["Chembox_új"]       = { '|', '', '', ' || ', '', '' },
      TNT                  = { '! align="left"', '', '', '\n| ', '', '' },
--      Drugbox              = { '| bgcolor="#ddeeff"', '', '\n| bgcolor="#eeeeee" ', '| ', '', '' },
      Drugbox              = { '| bgcolor="#ddeeff"', '', '', '\n| bgcolor="#eeeeee" ', ' | ', '' },
      ["Gyógyszeresdoboz"] = { '| bgcolor="#ddeeff"', '', '', '\n| bgcolor="#eeeeee" ', ' | ', '' },
      ["Vegyület_infobox"] = { '|', '<b>', '</b>', ' || ', '', '' },
      }


local function iupac(infobox,cimke,szoveg)
   local frm
   if mezo[infobox] then frm = mezo[infobox] else frm = mezo.Chembox_new end
   return fejlec(infobox,cimke)..frm[3]..frm[4]..szeles(infobox,{szoveg, '-2'})..frm[6]
end


function p.lablec(frame)
    local labszoveg  = {  -- adatcsoport fejléc előtti (HTML-formázó) szöveg
      Chembox_new          = '| align="center" style="background-color: #F8EABA; padding: 0.5em" colspan="2" | ',
      ["Vegyület_infobox"] = '\n|-\n| colspan="2" style="background-color:#F8EABA;" align="center" | ',
      Drugbox              = '\n|-\n| colspan="2" bgcolor="#dddddd" | ',
      }
    labszoveg["Chembox_új"]       = labszoveg.Chembox_new
    labszoveg["Gyógyszeresdoboz"] = labszoveg.Drugbox

    fej = labszoveg[frame.args['infobox']]
    if fej     --TNT "infóbox"-ban nem írunk ki alcsoport fejlécet
    then return fej..frame.args['szoveg']..'\n'
    end
return ''
end


function p.kiir(eredm,infobox)
    local hivtomb = { kepkiir, szeles, iupac, boxfej, smiles }  -- az egyes rekordtípusokat kiíró függvények. Max. 2 paraméterük lehet + az infóbox.
    local str = ""

    for i,par in ipairs(eredm) do 
        if type(par) == "string"                -- infóbox alcsoport fejléc
        then    str = str..fejlec(infobox,par)
        elseif  type(par[1]) == 'number'         -- speciálisan kezelt mező
        then    fv = hivtomb[par[1]]
                if fv ~= nil then str = str..'\n| '..fv(infobox,par[2],par[3])..'\n|-\n' end
        else    frm = mezo[infobox]              -- név+érték mező
                if not frm then frm = mezo.Chembox_new end
                str = str..frm[1]                                            -- táblázat sor eleje
                if #par > 2 then str = str..' rowspan="'..(#par-1)..'"' end
                str = str..' | '..frm[2]..par[1]..frm[3]                     -- sorcímke
                for i=2, #par                    -- értékek kiírása
                do   str = str..frm[4]..frm[5]..par[i]..frm[6]..'\n|-\n'      -- értékek: 
                end
        end
    end
    return str
end


--[[ munkatábla rendezése és átmásolása az eredménytáblába.
A munkatábla alakja: { { sorsz, címke }, { érték1, érték2, ... } }
Az eredménytábla:    { címke, érték1, érték2, ... } rendezve
]]

-- A munkatábla két rekordjának összehasonlítása
local function hasonl(x,y)
    return x[1][1] < y[1][1]
end

-- A rendezés és  átmásolás
function p.adatcsoport(munka,eredm)
    local i

    table.sort(munka,hasonl)
    if eredm[1] then i = 2 else i = 1 end     -- 1 az adatcsoport címkéje, amit a hívó modul tesz eredm-be
    for nev,ertek in ipairs(munka)
    do   eredm[i] = { ertek[1][2] }
         for k=2, #ertek
         do    table.insert(eredm[i],ertek[k])
         end
         i = i+1
    end  -- for vége
end  -- p.adatcsoport vége

--  Sablon formában adja vissza a sablon paramétereit. Arra jó, hogy a sablon tudja feldolgozni az alsablon paramétereit.
function p.alsablon(frame)
    str = ''
    for n,v in frame:getParent():argumentPairs()
    do   str = str..n..'='..v..'\0'
    end
return str
end

return p