Adatformázó[mi ez?] • [dokumentáció: mutat, szerkeszt] • [tesztek: létrehozás]

-----------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------ Adatformázó modul ----------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------
-- A modult hívó sablonok:
--     {{Adat|szám|mértékegység|jel|tizedesvesszőig}}
--     {{Tagol|szám|tizedesvesszőig}}


----------------------------------------- Mértékegységek táblázata az "Adat" sablonhoz --------------------------------------
-- A táblázat bővíthető.
-- Bővítéskor az új mértékegységet a megfelelő csoportba (ALAPMENNYISÉGEK/MECHANIKA/ELEKTROMOSSÁGTAN stb.) helyezd el!
-- Ha kell, illessz be új csoportot!
-- Ha bővítetted, a bővítést (a mértékegységek sorrendjét megtartva) vezesd át az "Adat" sablon leírásába is!
------------------------------------------------------ A táblázat kezdete ---------------------------------------------------

local ME = {}                                                                         -- Új táblázat definiálása

------------------------- ALAPMENNYISÉGEK
-- Hosszúság
ME["um"] = "µm"

-- Idő
ME["us"] = "µs"

-- Tömeg
ME["ug"] = "µg"

-- Anyagmennyiség
ME["umol"] = "µmol"

-- Hőmérséklet
ME["oC"] = "°C"
ME["oF"] = "°F"
ME["oR"] = "°R"

-- Áramerősség
ME["uA"] = "µA"

------------------------- TÉRMENNYISÉGEK:
-- Síkszög
ME["o"] = "°"
ME["'"] = "´"
ME['"'] = "˝"

-- Terület
ME["km2"] = "km<sup>2</sup>"
ME["m2"] = "m<sup>2</sup>"
ME["dm2"] = "dm<sup>2</sup>"
ME["cm2"] = "cm<sup>2</sup>"
ME["mm2"] = "mm<sup>2</sup>"

-- Térfogat
ME["km3"] = "km<sup>3</sup>"
ME["m3"] = "m<sup>3</sup>"
ME["dm3"] = "dm<sup>3</sup>"
ME["cm3"] = "cm<sup>3</sup>"
ME["mm3"] = "mm<sup>3</sup>"

------------------------- MECHANIKA:
-- Gyorsulás
ME["m/s2"] = "m/s<sup>2</sup>"

-- Szögsebesség, fordulatszám
ME["s-1"] = "s<sup>&minus;1</sup>"
ME["min-1"] = "min<sup>&minus;1</sup>"

-- Szöggyorsulás
ME["rad/s2"] = "rad/s<sup>2</sup>"
ME["s-2"] = "s<sup>&minus;2</sup>"

-- Sűrűség
ME["kg/m3"] = "kg/m<sup>3</sup>"
ME["g/cm3"] = "g/cm<sup>3</sup>"
ME["kg/dm3"] = "kg/dm<sup>3</sup>"

-- Felületi (tömeg)sűrűség
ME["kg/m2"] = "kg/m<sup>2</sup>"
ME["g/m2"] = "g/m<sup>2</sup>"

-- Térfogatáram (vízhozam)
ME["m3/s"] = "m<sup>3</sup>/s"
ME["dm3/s"] = "dm<sup>3</sup>/s"
ME["cm3/s"] = "cm<sup>3</sup>/s"
ME["m3/min"] = "m<sup>3</sup>/min"
ME["dm3/min"] = "dm<sup>3</sup>/min"
ME["cm3/min"] = "cm<sup>3</sup>/min"
ME["m3/h"] = "m<sup>3</sup>/h"
ME["dm3/h"] = "dm<sup>3</sup>/h"
ME["cm3/h"] = "cm<sup>3</sup>/h"

------------------------- ELEKTROMOSSÁGTAN:
-- Feszültség
ME["uV"] = "&micro;V"

-- Kapacitás
ME["uF"] = "&micro;F"

-- Ellenállás
ME["mohm"] = "m&Omega;"
ME["ohm"] = "&Omega;"
ME["kohm"] = "k&Omega;"
ME["Mohm"] = "M&Omega;"
ME["Gohm"] = "G&Omega;"

--Fajlagos ellenállás
ME["ohmm"] = "&Omega;&middot;m"

------------------------- EGYÉB:
-- Százalék
ME["%"] = "%"

--Népsűrűség
ME["fő/km2"] = "fő/km<sup>2</sup>"
--------------------------------------------------- Mértékegységek táblázatának vége ----------------------------------------

------------------------------------------------------- Változók deklarációja -----------------------------------------------
ures = ""                                                                             -- Üres string
SP = " "                                                                              -- Szóköz (SPace)
NBSP = "&nbsp;"                                                                   
NBSP = mw.text.decode(NBSP, "&nbsp;")                                                 -- Nem-törhető szóköz (U+00A0)
minuszjel = "&minus;"
minuszjel = mw.text.decode(minuszjel, "&minus;")                                      -- A &minus; karakter (U+2212)
N = 0                                                                                 -- A szám előtti NBSP sor hossza táblázatban
local getArgs = require('Module:Arguments').getArgs
--------------------------------------------------------- A deklarációk vége ------------------------------------------------

------------------------------------------------- Az "Adat" végrahajtásának kezdete -----------------------------------------
p = {}
  function p.adat(frame)
    szam = getArgs(frame)[1]
    egyseg = getArgs(frame)[2]
    jel = getArgs(frame)[3]
    vesszoig = getArgs(frame)[4]
    formal()                                                                          -- A szám formázása (függvényhívás)
    if jel then
      jel = jel..NBSP.."="..NBSP                                                      -- Jel és egyenlőségjel a szám elé
    else
      jel = ures
    end
    if egyseg then
      if ME[egyseg] then                                                              -- Ha van formázott ...
        if (egyseg == "o" or egyseg == "'" or egyseg == "&#34;" or egyseg == "%") then-- Ha az egység szögfok vagy szögperc vagy szögmásodperc vagy % ...
          egyseg = ME[egyseg]                                                         -- Egség cseréje a formázottra (NBSP nélkül)
        else
          egyseg = NBSP..ME[egyseg]                                                   -- Egség cseréje a NBSP+formázottra
        end
      else
        egyseg = NBSP..egyseg                                                         -- Egség cseréje a NBSP+egyseg
      end
    else
      egyseg = ures
    end
    return jel..szam..egyseg
  end
-------------------------------------------------- Az "Adat" végrahajtásának vége- ------------------------------------------

------------------------------------------------- A "Tagol" végrahajtásának kezdete -----------------------------------------
  function p.ertek(frame)
    szam = getArgs(frame)[1]
    vesszoig = getArgs(frame)[2]
    formal()                                                                          -- A szám formázása (függvényhívás)
    return szam
  end
--------------------------------------------------- A "Tagol" végrahajtásának vége ------------------------------------------

------------------------------------------------- A számot formázó függvény kezdete -----------------------------------------
  function formal()
    if not szam then return "'''HIBA a sablonhívásban''' (nincs bemenő adat)." end    -- HIBAÜZENET, ha nincs szám
    vesszoP = 0                                                                       -- A vessző pozíciója
    expP = 0                                                                          -- Az exponens jel pozíciója
    Karakter = {}                                                                     -- Tábla a szám karaktereinek
    K = mw.ustring.sub(szam,1,1)
    if (K == "-" or K == "–" or K == minuszjel) then                                  -- Kötőjel, (Alt+0150), minuszjel ...
      negativ = true
      szam = mw.ustring.sub(szam,2,-1)                                                -- a mínuszjel levágása a számról
    end
    hossz = mw.ustring.len(szam)                                                      -- A szám paraméter hossza
    for i = 1, hossz do
      K = mw.ustring.sub(szam,i,i)                                                    -- A szám karakterekre bontása
      if K == "," then                                                                -- Vessző
        if i == 1 then return "Nincs megadva egészrész." end                          -- Hibaüzenet
        if i == hossz then
          return "Nincs törtrész a tizedesvessző után."                               -- Hibaüzenet
        end 
        if exponens then return "Tizedesvessző az exponensben." end                   -- Hibaüzenet
        if tizedes then return "Több vessző a számban." end                           -- Hibaüzenet
        vesszoP = i                                                                   -- Vessző helye a számban (vesszoP)
        tizedes = true                                                                -- Van tizedesvessző a számban
      elseif (K == "e" or K == "E") then                                              -- Exponensjel
        if exponens then return "Több exponensjel a számban." end                     -- Hibaüzenet
        if (i == vesszoP + 1 and i ~= 1) then
          return "Nincs törtrész a tizedesvessző után."                               -- Hibaüzenet
        end
        if i == hossz then return "Nincs kitevő az exponensjel után." end             -- Hibaüzenet
        expP = i                                                                      -- Exponens helye a számban (expP)
        exponens = true                                                               -- Van exponens
      elseif (K == "-" or K == "–" or K == minuszjel) then                            -- Kötőjel, (Alt+0150), minuszjel ...
      K = minuszjel                                                                   -- ... cseréje mínuszjelre
        if not exponens then return "Mínuszjel hibás helyen." end                     -- Hibaüzenet
        if (exponens and i ~= expP + 1) then return "Mínuszjel hibás helyen." end     -- Hibaüzenet
        if (exponens and i == hossz) then return "Nincs szám az exponensben." end     -- Hibaüzenet
      elseif (K < "0" or K > "9") then                                                -- Nem számjegy
        if (K == SP or K == NBSP) then K = "<szóköz>" end                             -- Szóközök helyett felirat
        return "Hibás karakter a számban: "..K.."."                                   -- Hibaüzenet
      end
      Karakter[i] = K                                                                 -- A szám karakterei a Karakter táblába
    end
    szam = ""                                                                         -- A szám változó kiürítése
    if ((not tizedes) and expP == 1) then                                             -- Csak exponens van (1)
      szam = "10<sup>"                                                                -- 10 és felső index nyitás
      for i = 2, hossz do                                                             -- Kitevő összeállítása
         szam = szam..Karakter[i]
      end
      szam = szam.."</sup>"                                                           -- Felső index zárása
    end
    if ((not tizedes) and (not exponens)) then                                        -- Egész szám, exponens nincs (2)
      for i = hossz, 1, -3 do                                                         -- Az egészrész összeállítása
        for j = 0, 2 do
          if i - j > 0 then szam = Karakter[i-j]..szam end
        end
        szam = SP..szam                                                               -- Három számjegy elé szóköz
      end
      szam = mw.text.trim(szam)                                                       -- Esetleges első szóköz törlése
      if ((not vesszoig) and hossz == 4) then                                         -- Eredeti hossz = 4, (de tagolva 5)
        szam = mw.ustring.sub(szam,-5,-5)..mw.ustring.sub(szam,-3,-1)                 -- Ha nem táblázat, négyjegyűt nem tagol
      end
    end
    if (tizedes and (not exponens)) then                                              -- Tizedestört, exponens nincs (3)
      for i = vesszoP - 1, 1, -3 do                                                   -- Az egészrész összeállítása
        for j = 0, 2 do
          if i - j > 0 then szam = Karakter[i-j]..szam end
        end
        szam = SP..szam                                                               -- Három számjegy elé szóköz
      end
      szam = szam..","                                                                -- Tizedesvessző
      for i = vesszoP + 1, hossz, 3 do                                                -- Az törtrész összeállítása
        for j = 0, 2 do
          if i + j <= hossz then szam = szam..Karakter[i+j] end
        end
        szam = szam..SP                                                               -- Három számjegy után szóköz
      end
      szam = mw.text.trim(szam)                                                       -- Esetleges első és utolsó szóköz törlése
    end
    if ((not tizedes) and expP > 1) then                                              -- Egész mantissza és exponens (4)
      for i = expP - 1, 1, -3 do                                                      -- Az egészrész összeállítása
        for j = 0, 2 do
          if i - j > 0 then szam = Karakter[i-j]..szam end
        end
        szam = SP..szam                                                               -- Három számjegy után szóköz
      end
      szam = mw.text.trim(szam)                                                       -- Esetleges első szóköz törlése
      szam = szam.."&middot;10<sup>"                                                  -- Mantissza·10 és felső index nyitás
      for i = expP + 1, hossz do                                                      -- Kitevő összeállítása
         szam = szam..Karakter[i]
      end
      szam = szam.."</sup>"                                                           -- Felső index zárása
    end
    if (tizedes and exponens) then                                                    -- Tizedestört mantissza és exponens (5)
      for i = vesszoP - 1, 1, -3 do                                                   -- Az egészrész összeállítása
        for j = 0, 2 do
          if i - j > 0 then szam = Karakter[i-j]..szam end
        end
        szam = SP..szam                                                               -- Három számjegy elé szóköz
      end
      szam = szam..","                                                                -- Tizedesvessző
      for i = vesszoP + 1, expP - 1, 3 do                                             -- Az törtrész összeállítása
        for j = 0, 2 do
          if i + j < expP then szam = szam..Karakter[i+j] end
        end
        szam = szam..SP                                                               -- Három számjegy után szóköz
      end
      szam = mw.text.trim(szam)                                                       -- Esetleges első és utolsó szóköz törlése
      szam = szam.."&middot;10<sup>"                                                  -- Mantissza·10 és felső index nyitás
      for i = expP + 1, hossz do                                                      -- Kitevő összeállítása
         szam = szam..Karakter[i]
      end
      szam = szam.."</sup>"                                                           -- Felső index zárása
    end
    if vesszoig then                                                                  -- Szám előtti NBSP sorhossz kiszámítása 
      hossz = mw.ustring.len(szam)
      for i = 1, hossz do
        if (mw.ustring.sub(szam, i, i) == ",") then                                   
          N = i - 1
        end
        if (mw.ustring.sub(szam, i, i + 7) == "·10<sup>") then
          N = i -1
        end
      end
      if N == 0 then
        N = hossz
      end
      if (mw.ustring.sub(szam, 1, 7) == "10<sup>") then
        N = 0
      end
      N = vesszoig - N
    end
    if negativ then
      szam = minuszjel..szam                                                          -- Negatív előjel visszaállítása
      N = N -1
    end
    szam = mw.ustring.gsub(szam, SP, NBSP)                                            -- Szóközök helyett NBSP
    if vesszoig then
      if N < 0 then
        return "Nem fér ki a szám."
      else
        sor = string.rep(NBSP, N)
        szam = "<tt>"..sor..szam.."</tt>"                                             -- Táblázatban NBSP sor a szám elé
      end
    end
  end
--------------------------------------------------- A számot formázó függvény vége ------------------------------------------

return p