Moduuli:sanarivi/substantiivi

Wikisanakirjasta

substantiivi-mallineen toteutus.


--- [[Malline:substantiivi]]-mallineen toimintalogiikka.

local p = {}

local kirjoitusjarjestelmat = require("Moduuli:Kirjoitusjärjestelmät")
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



local function muotoile_sanarivi(frame, luokat)
    local args     = frame.args 
    local hakusana = apu.ensimmainen_ei_tyhja{ frame.args.paino, 
                                               frame.args.vok, 
                                               frame.args[2], 
                                               mw.title.getCurrentTitle().text }        
    local lang     = frame.args[1]
    local kirj     = kirjoitusjarjestelmat.yleinenKirjoitusjarjestelma(lang)
	local args2    = apu.numeroidut_parametrit(frame.args, { "mon", "monpaino", "monvok", "monlat" })
	local korvaava = apu.ensimmainen_ei_tyhja{ frame.args["sanarivi"], frame.args[4] } -- frame.args[4] poistuva
	
	local montxt
	if args2.monpaino then
		montxt = args2.monpaino
	else
		montxt = args2.monvok
	end
	
	-- Monistetaan lisäparametrit kaikille monikoille.
	local lp_mon = apu.map(function (_) return { ["elem"] = "b" } end, args2.mon or {})	
	
    return paramtext.muotoile(
        ryhma("",
              tai(
              	var(korvaava), 
              	srlib.hakusana(hakusana, lang, kirj)
              ), " ",
              srlib.sukuteksti(args.suku), " ",
              ryhma("(", srlib.latmerkkaus(args.lat), ")"), " ",
              ryhma("(",
                    ryhma("''kyrillinen'' ", var(args.kyr), ""), ", ", 
   					srlib.monikkoluettelo(lang, args2.mon, montxt, args2.monlat, lp_mon), 
   			  ")"), 
   		"")), luokat
end     


--- Pääohjelma.
-- @param frame: Jos kutsu sisältää parametrin frame=parent, käytetään
--     kutsuvan mallineen parametreja moduulin parametrien sijasta.
--     1. nimetön on kielikoodi
--     2. nimetön on valinnainen sanarivillä näytettävä teksti sivun otsikon sijaan.
function p.Sanarivi(frame)
    local alkup_frame = frame
    
    -- Haetaan malline tai moduuli, jonka parametreja käytetään.
    while frame.args.frame == 'parent' do
        frame = frame:getParent()
    end
    
    frame.args = apu.poista_tyhjat(frame.args)
        
    -- Kielikoodi.
    local lang  = frame.args[1]
    assert ( lang, "Pakollinen kielikoodi puuttuu (parametri 1)" )
    
    -- Haetaan kielelle määritetty oma moduuli, jos sellainen on.
    local sub = require("Moduuli:sanarivi/alimoduulit").hae_kielikohtainen_moduuli(lang)
    

    -- Jos alimoduuli toteuttaa Sanarivi-funktion, annetaan koko
    -- hoito sen hoidettavaksi.
    if sub and sub.Sanarivi then
        return sub.Sanarivi(alkup_frame)
    end
    
    -- Yleiset sanaluokkaluokat.
    luokat.asetaAakkostajalla2{
    	kieli  = lang, 
    	luokka = luokat.kielenLuokka(lang, "sanat"), 
    	sivu   = frame.args.aak, -- voi olla nil
        nimiavaruus = 0          -- ei luokitella, jos ollaan esim. testi- tai artikkelipohjasivulla
	}
	
	luokat.asetaAakkostajalla2{
    	kieli  = lang, 
    	luokka = luokat.kielenLuokka(lang, "substantiivit"), 
    	sivu   = frame.args.aak,
        nimiavaruus = 0
	}
	
    
    -- Jos kielikohtaisessa modulissa on määritelty lisaluokat-funktio, kutsutaan
    -- sitä. Lisaluokat-funktiossa voi lisätä ylimääräisiä luokkia.
	if sub and sub.lisaluokat then
        sub.lisaluokat(frame, luokat)
	end
   
    
    -- Käytetään kielen omassa moduulissa määriteltyä sopivaa funktiota, jos
    -- sellainen on.
    if sub and sub.substantiivi then
        return sub.substantiivi(frame, luokat)
    elseif sub and sub.sana then
        return sub.sana("substantiivi", frame, luokat)
    end
    
    -- Muuten käytetään yleistä funktiota.
    return muotoile_sanarivi(frame), luokat
end

return p