Moduuli:sanarivi/cmn/hiekkalaatikko

Tämän moduulin ohjeistuksen voi tehdä sivulle Moduuli:sanarivi/cmn/hiekkalaatikko/ohje

--- Mandariinikiinan sanarivimallineet.
local p = {}

local kielilinkki = require("Moduuli:Kielilinkki")
local luokat    = require("Moduuli:luokittelu")
local apu       = require("Moduuli:Mallinetyokalut")
local srlib     = require("Moduuli:LibSanarivi")
local paramtext = require("Moduuli:ParametrisoituTeksti")
local ryhma, var, luettelo, tai = paramtext.ryhma, paramtext.muuttuja, paramtext.luettelo, paramtext.tai

---
-- @param title:  PAGENAME tai muu otsikko, jos annettu
-- @param lat:    taulukko pinyin-muodoista tai nil
-- @param asu:    kirjoitusasu, "yks", "per", "yks+per" tai nil
-- @param yks+per: yksinkertainen tai perinteinen kirjoitusasu riippuen kumpi tulostetaan tai nil
local function muotoileSanarivi(title, lat, asu, toinen)

    assert(title, "Pakollinen parametri puuttuu!")
    
    lisap = apu.map(
        function (_) return {
                ["kuvaus"] = "tr/pinyin-transkriptio" }
        end,
        lat or {}
    )

    local asuteksti = nil
    local yks = nil
    local per = nil
    local kirj = "Hani"
    
    if asu == "yks+per" then
        asuteksti = "''sanan yksinkertaistettu ja perinteinen kirjoitusasu''"
    elseif asu == "yks" then
        asuteksti = "''sanan yksinkertaistettu kirjoitusasu''"
        per = toinen
        kirj = "Hans"
    elseif asu == "per" then
        asuteksti = "''sanan perinteinen kirjoitusasu''"
        yks = toinen
        kirj = "Hant"        
    end

    return paramtext.muotoile(
       ryhma("",
             srlib.hakusana(title, "cmn", kirj),
             " ",
             ryhma("(''pinyin'' ", srlib.linkkiluettelo("cmn-Latn", lat, nil, nil, lisap), ")"),
             " ",
             ryhma("(",
                   asuteksti,
                   "; ",
                   tai(
                       ryhma("''sana yksinkertaistetussa kirjoitusasussa'' ", srlib.kielilinkki("cmn", yks), ""),
                       ryhma("''sana perinteisessä kirjoitusasussa'' ", srlib.kielilinkki("cmn", per), "")
                   ),
                   ")"),
             "")
    ), luokat	
end



--- Apufunktio eri luokkayhdistelmien tekemiseksi.
-- @param sanalk: esim. "substantiivi"
-- @param yks:    true, jos lisätään
-- @param per:    true, jos lisätään
local function lisaaLuokka(sanalk, asu)
   local luokka = luokat.kielenLuokka("cmn", luokat.luokkaMonikko(sanalk))

   if not asu or sanalk ~= "sana" then
       luokat.asetaAakkostajalla2{
           kieli = "cmn",
           luokka = luokka,
--           nimiavaruus = 0 -- estetään luokan näkyminen testi- ja ohje- yms. sivuilla
       }
      
   elseif asu == "per" then
       luokat.asetaAakkostajalla2{
           kieli = "cmn",
           luokka = luokka .. " perinteisessä kirjoitusasussa",
--           nimiavaruus = 0           
       }
		    
   elseif asu == "yks" then
       luokat.asetaAakkostajalla2{
           kieli = "cmn",
           luokka = luokka .. " yksinkertaistetussa kirjoitusasussa",
--           nimiavaruus = 0           
       }
      
   elseif asu == "yks+per" then
      luokat.asetaAakkostajalla2{
           kieli = "cmn",
           luokka = luokka .. " perinteisessä kirjoitusasussa",
--           nimiavaruus = 0           
      }
      luokat.asetaAakkostajalla2{
          kieli = "cmn",
          luokka = luokka .. " yksinkertaistetussa kirjoitusasussa",
--           nimiavaruus = 0          
      }

   end
end

--- Pääohjelma.
-- @param frame: Jos kutsu sisältää parametrin |frame=parent|, käytetään
--     kutsuvan mallineen parametreja moduulin parametrien sijasta
--     Framen täytyy sisältää joko yks- tai per- parametrin tai ei kumpaakaan;
--     lat-parametri on valinnainen; 1. nimetön on valinnainen sanarivillä
--     näytettävä teksti sivun otsikon sijaan. Arg sanaluokka kertoo minkä
--     sanaluokan mallineesta tätä kutsutaan.
function p.Sanarivi(frame)
   local sanalk = frame.args.sanaluokka
      
   if frame.args.frame == 'parent' then
      frame = frame:getParent()
   end

   local args = apu.poista_tyhjat(frame.args)
   local args_num = apu.numeroidut_parametrit(args, {"lat"})

   -- Sanarivillä näkyvä sana.
   local title = frame.args[2] or mw.title.getCurrentTitle().text

   assert(frame.args[1] == "cmn", "Väärä kieli!")

   local yks = args.yks
   local per = args.per
   local asu = args.asu
   local lat = args_num.lat

   if per and yks then 
       error('Virheeliset parametrit: ei voi antaa molempia per ja yks')
   end

   if not yks and not per and asu == "yks+per" then
      lisaaLuokka("sana", "yks+per")      
      lisaaLuokka(sanalk, "yks+per")
      return muotoileSanarivi(title, lat, "yks+per", nil), luokat

   elseif not yks and not per and (not asu or asu == "?") then
      lisaaLuokka("sana", nil)      
      lisaaLuokka(sanalk, nil)
      luokat.asetaAakkostajalla("cmn", "Mandariinikiinan sanat, joiden kirjoitusasua ei ole merkitty")
      return muotoileSanarivi(title, lat, nil, nil), luokat
			      
   elseif yks or asu == "per" then
      lisaaLuokka("sana", "per")      
      lisaaLuokka(sanalk, "per")
      return muotoileSanarivi(title, lat, "per", yks), luokat
      
   elseif per or asu == "yks" then
      lisaaLuokka("sana", "yks")      
      lisaaLuokka(sanalk, "yks")
      return muotoileSanarivi(title, lat, "yks", per), luokat

   else
       error('Virheeliset parametrit')
   end

end


return p