Moduuli:yhteys

Wikisanakirjasta

Käytetään yhteys-mallineesta käsin.

Parametrit:

  • ei-luokittelua: estää sivun luokittumisen (kaikkiin luokkiin)

Yhteys→luokka-määritykset tehdään sivulle Moduuli:yhteys/taulukot. Sivujen aakkostukseen käytetään yhteys-mallineen aak-parametria tai kielelle määriteltyä aakkostajaa, jos sellainen on.

Testit[muokkaa]

  • KOODI: {{yhteys|Tanskan|matematiikka}}
    TULOS: (''Tanskan, matematiikka'')
  • KOODI: {{yhteys|matematiikka|k=Tanskan}}
    TULOS: (''matematiikka'')[[Luokka:Tanskan kielen matematiikan sanasto|YHTEYS]]
  • KOODI: {{yhteys|matematiikka|k=da}}
    TULOS: (''matematiikka'')[[Luokka:Tanskan kielen matematiikan sanasto|YHTEYS]]
  • KOODI: {{yhteys|matematiikka|aak=ananas|k=da}}
    TULOS: (''matematiikka'')[[Luokka:Tanskan kielen matematiikan sanasto|YHTEYS]]

local tiedot = mw.loadData('Moduuli:yhteys/taulukot')
local kielet = require("Moduuli:kielikoodit")
local luokat = require("Moduuli:luokittelu")

local m = {}

--- Palauttaa sanaan liittyvät tiedot taulukosta.
--
-- @param avain:  taulukon avainsana
-- @return 1:     avainsanan teksti, esim. avainta "kuva" vastaa teksti "kuvaannollinen"
-- @return 2:     mahdollinen liittyvä luokka tai luokkaaihio
-- @return 3:     mahdollinen liittyvä kieli, esim. avainta "sveitsinsaksaa" vastaa "de"
local function hae_tiedot(avain)
    if tiedot[avain] then
	-- jos luokka on nil käytetään "pääsanan" luokkaa
	if not tiedot[avain][2] then
	    avain = tiedot[avain][1] 
	    if avain and tiedot[avain] then
	       return tiedot[avain][1], tiedot[avain][2], tiedot[avain][3]
	    end
	end
	return tiedot[avain][1], tiedot[avain][2], tiedot[avain][3]
    end
    return avain, nil, nil
end


--- Lisää luokan nimiaihion perusteella.
-- Jos nimiaihiossa on {Gen}-teksti ja parametri `kg` on annettu, korvataan
-- {Gen}-teksti sillä, esim.
--     "{Gen} kielen arkikieliset ilmaukset", "Saksan" -> "Saksan kielen arkikieliset ilmaukset"
-- Jos {Gen}-teksti on, mutta kielen nimeä ei ole annettu, ohitetaan luokka.
-- Muut luokat lisätään aina.
-- 
-- @param luokka_tmpl: luokan nimen aihio tai luokan nimi
-- @param kk:          kielikoodi
-- @param kg:          kielen nimen genetiivimuoto isolla alkukirjaimella
-- @param aak:         aakkostus. Jos ei annettu käytetään kielen aakkostajaa, jos sellainen on.
local function lisaa_luokka(luokka_tmpl, kk, kg, aak)
   local luokka, ok = string.gsub(luokka_tmpl, "{Gen}", kg or "")
   
   if ok and kg then     -- {Gen}-tekstillinen luokan nimi
      if kk then
	 luokat.asetaAakkostajalla(kk, luokka, aak)
      else
	 luokat.aseta(luokka, aak)
      end
   elseif not ok then     -- {Gen}-tekstitön luokan nimi
      if kk then
	 luokat.asetaAakkostajalla(kk, luokka_tmpl, aak)
      else
	 luokat.aseta(luokka_tmpl, aak)
      end
   end
end


--- Palauttaa annettuja käyttöyhteyksiä/tyylejä vastaavan merkkijonon ja luokat. Esim.
-- ''(fysiikka, tähtitiede)''[[Luokka:Suomen kielen fysiikan sanasto|kana]]
-- [Luokka:Suomen kielen tähtitieteen sanasto|kana]]
-- 
-- @param args:  luettelo käyttöyhteyksistä/tyyleistä
-- @param k:     kielikoodi tai kielen nimen genetiivi isolla (mallineen k-parametri), valinnainen
-- @param aak:   luokkiin lisättävä sana (aakkostusmuodossa), valinnainen
-- @param ktxt:  kontekstimallineen nimi (jos muu kuin yhteys-malline), valinnainen
function m.hae_teksti(args, k, aak, ktxt, ei_luokittelua, ei_sulkeita)
    local sanat = {}  -- lueteltavat sanat
    
    -- Luokkien nimet tai nimien aihiot. Kootaan listaksi ja lisätään kaikki luokat
    -- kerralla, koska joihinkin luokkiin sisältyy kielikoodi (esim. "suomenruotsi" -> "sv").
    -- Näissä tapauksissa erillistä kieliparametria ei tarvitse antaa.    
    local luokkanimet = {}
    
    -- Muutetaan kieli-parametri kielikoodiksi, jos se ei ole jo.
    local kk = (k and kielet.tunnus_genetiiville(k)) or k

    local function kasittele_sana(sana)
       local teksti, luokka, kieli = hae_tiedot(sana)
       if kieli and not kk then
	  kk = kieli
       end
       
       table.insert(sanat, teksti)
       
       if luokka then
	  table.insert(luokkanimet, luokka)
       end
    end

    if ktxt then
       kasittele_sana(ktxt)
   end
    	
    for i,v in ipairs(args) do
        if v ~= "{{{1}}}" and v ~= "" then
           kasittele_sana(v)
	end
    end

    if not ei_luokittelua then
       local kg = kielet.genetiivi_tunnukselle(kk, true) or k    
       for i, luokka in ipairs(luokkanimet) do
	  lisaa_luokka(luokka, kk, kg, aak)
       end
    end

	if ei_sulkeita then
    	return "''" .. table.concat(sanat, ", ") .. "''", luokat
    else
    	return "(''" .. table.concat(sanat, ", ") .. "'')", luokat
	end
end



function m.yhteys(frame)
    -- Otetaan parametrit ylämallineen parametreista.
    -- aak:parametri välitetään erikseen, koska ylämalline välittää sillä {{PAGENAME}}n
    local ktxt = nil
    local pframe = frame:getParent()
    if frame.args['nimi_myös'] then
    	-- kontekstimallineen nimi
    	ktxt = mw.ustring.gsub(pframe:getTitle(), "^Malline:", "")
    end
    
    return m.hae_teksti(pframe.args, pframe.args.k, frame.args.aak, ktxt, frame.args["ei-luokittelua"], pframe.args["sulje"] == "-")
end

return m