Moduuli:Kielilinkki/hiekkalaatikko

Kielilinkki-moduulin hiekkalaatikko. Testaa muutoksia tässä ennen kuin muutat varsinaista moduulia!


--- Moduuli linkkien tekemiseksi tietyn kielen osioon ja linkkitekstin tyylin merkkaukseen.
local p = {}

local kielikoodit = require("Moduuli:kielikoodit")
local kjdata      = require("Moduuli:Kirjoitusjärjestelmät")
local autolink    = require("Moduuli:Automaattilinkki")
local apu         = require("Moduuli:Mallinetyokalut")


local function teksti(parametrit)
	local lgsc = parametrit["kieli"]
	local text = parametrit["teksti"]
	
    assert ( lgsc,  "Pakollinen kieliparametri puuttuu!" )
    assert ( text,  "Pakollinen tekstiparametri puuttuu!" )

    local lang, script = kjdata.avaaKielikoodi(lgsc)
    if not script then
        script  = kjdata.yleinenKirjoitusjarjestelma(lang)
    end
    
    local span = mw.html.create(parametrit["elem"] or "span")
        :addClass(script)
        :wikitext(text)
    
    if lang then
        span:attr('lang', lang)
    end
    
    
    if parametrit["class"] then
        span:addClass(parametrit["class"])
    end
        
    -- Linkin kohteen kuvailutiedot. Kuvaus on samall myös artikkelipohjan nimi.
    if parametrit["kuvaus"] then
        span:attr('data-kuvaus', parametrit["kuvaus"])
        -- Artikkelipohjan parametrit.
        if parametrit["kuvaus-param"] then
            span:attr('data-kuvaus-param', mw.text.encode(mw.text.jsonEncode(parametrit["kuvaus-param"])))
        end
    end     
    
    return tostring(span)
end

local function linkki(parametrit)
	local lgsc = parametrit.kieli
	local link = parametrit.kohde
	local text = parametrit.teksti
	
    assert ( lgsc,  "Pakollinen kieliparametri puuttuu!" )
    assert ( link,  "Pakollinen linkkiparametri puuttuu!" )

	if parametrit["autolinkki"] then
		if not text then
			text = link
		end	
		link = autolink.muuta(lgsc, link)
	end


    local lang, _ = kjdata.avaaKielikoodi(lgsc)
    if not lang then
        lang = lgsc
    end
    
    -- Otsikko johon linkataan.
    local otsikko = kielikoodit.kieliotsikko(lang)
    if lang == "kans" then
        otsikko = "Kansainvälinen"
    end

    parametrit["class"] = parametrit["class"] or "linkki"
    
   
    
    if         text and     otsikko then
    	parametrit.teksti = "[[" .. link .. "#" .. otsikko .. "|" .. text .. "]]"
        
    elseif not text and     otsikko then
    	parametrit.teksti = "[[" .. link .. "#" .. otsikko .. "|" .. link .. "]]"
        
    elseif     text and not otsikko then
    	parametrit.teksti = "[[" .. link .. "|" .. text .. "]]"
        
    else -- if not text and not otsikko then
    	parametrit.teksti = "[[" .. link .. "]]"
    end
    
    return teksti(parametrit)
end





--- Tekee kielen tyylillä (fonttikoolla) varustetun linkin kieliotsikkoon.
-- 
-- Funktiota voi kutsua kahdella tapaa:
-- 1. yksinkertaisen linkin voi tehdä paikkaparametreilla
--  linkki(kieli, linkki, teksti)

-- tai 2. nimetyillä parametreilla
--   linkki{ kieli, linkki, teksti, elem, class, kuvaus, kuvaus-param }
--
--  @param kieli:        kielikoodi (+ mahdollinen kirjoitusjärjestelmä), esim. "en" tai "sr-Cyrl"
--  @param linkki:       linkin kohde (ja linkkiteksti, jos text-parametria ei anneta).
--  @param teksti:       valinnainen linkin teksti
--  @param elem:         html-elementti, johon teksti tulee (oletus "span")
--  @param class:        html:n class-attribuutti elementille (oletus "linkki")
--  @param kuvaus:       artikkelipohjan nimi
--  @param kuvaus-param: (taulukko) artikkelipohjan parametrit
--  @return:             linkki tekstinä
function p.linkki(eka, link, text)
	local parametrit
	
	if type(eka) == "table" then
		assert ( link == nil and text == nil )
		parametrit = eka
	else
		parametrit = {}
		parametrit["kieli"]  = eka
		parametrit["kohde"]  = link
		parametrit["teksti"] = text
	end
	
	return linkki(parametrit)
end

--- Tekee kielen tyylillä (fonttikoolla) varustetun linkin kieliotsikkoon.
--  VANHENTUNUT
--  @param lang:   kielikoodi (+ mahdollinen kirjoitusjärjestelmä), esim. "en" tai "sr-Cyrl"
--  @param link:   linkin kohde (ja linkkiteksti, jos text-parametria ei anneta).
--  @param text:   valinnainen linkin teksti
--  @param lisaparametrit: parametrit, joilla voi vaikuttaa tekstin tulostukseen:
--           ["elem"]  = html-elementti, johon teksti tulee (oletus "span")
--           ["class"] = html:n class-attribuutti elementille (oletus "linkki")
--  @return:       linkki tekstinä
function p.linkki_vanha(lgsc, link, text, lisaparametrit)
	lisaparametrit = lisaparametrit or {}
	lisaparametrit["kieli"]  = lgsc
	lisaparametrit["kohde"]  = link
	lisaparametrit["teksti"] = text
	
	return linkki(lisaparametrit)
end


-- Muuten sama kuin p.linkki, mutta ei anna virhettä, jos linkin kohdetta ei ole annettu,
-- vaan palauttaa nil. Käyttö on yksinkertaisempaa sanarivimoduuleissa.
function p.linkki_tai_nil(eka, link, text)
	local parametrit
	
	if type(eka) == "table" then
		parametrit = eka
	else
		parametrit = {}
		parametrit["kieli"]  = eka
		parametrit["kohde"]  = link
		parametrit["teksti"] = text
	end
	
    if parametrit["kohde"] == nil or parametrit["kohde"] == "" then
        return nil
    end
    
	return linkki(parametrit)
end


-- Muuten sama kuin p.linkki_vanha, mutta ei anna virhettä, jos linkkiä ei ole annettu,
-- vaan palauttaa nil. Käyttö on yksinkertaisempaa tietyissä yhteyksissä.
-- VANHENTUNUT
function p.linkki_tai_nil_vanha(lgsc, link, text, lisaparametrit)
    if link == nil or link == "" then
        return nil
    end
    return p.linkki(lgsc, link, text, lisaparametrit)
end


function p.Linkki(frame)
    if frame.args.frame == 'parent' then
        frame = frame:getParent()
    end

    local args = frame.args
    
    -- Oletuksena on suomi ja nykyinen sivu, kuten l-mallineessa alunperin.
    args.kieli  = apu.ensimmainen_ei_tyhja{ args.kieli,  args[1], "fi" }
    args.kohde  = apu.ensimmainen_ei_tyhja{ args.kohde,  args[2], mw.title.getCurrentTitle().fullText }
    args.teksti = apu.ensimmainen_ei_tyhja{ args.teksti, args[3] }

    
    -- Muutetaan numeroidut kuvaus-param-parametrit taulukoksi.
    local args_t = apu.numeroidut_parametrit(frame.args, { "kuvaus-param-" })
    
    args["kuvaus-param"] = args_t["kuvaus-param-"]

    return p.linkki(args)
end






--- Tekee kielen tyylillä (fonttikoolla) varustetun tekstipätkän.
-- 
-- Funktiota voi kutsua kahdella tapaa:
-- 1. yksinkertaisen linkin voi tehdä paikkaparametreilla
--  linkki(kieli, linkki, teksti)

-- tai 2. nimetyillä parametreilla
--   linkki{ kieli, linkki, teksti, elem, class, kuvaus, kuvaus-param }
--
--  @param kieli:        kielikoodi (+ mahdollinen kirjoitusjärjestelmä), esim. "en" tai "sr-Cyrl"
--  @param teksti:       valinnainen linkin teksti
--  @param elem:         html-elementti, johon teksti tulee (oletus "span")
--  @param class:        html:n class-attribuutti elementille (oletus "linkki")
--  @param kuvaus:       artikkelipohjan nimi
--  @param kuvaus-param: (taulukko) artikkelipohjan parametrit
--  @return:             linkki tekstinä
function p.teksti(eka, text)
	local parametrit
	
	if type(eka) == "table" then
		assert ( text == nil, "Virheelliset parametrit" )
		parametrit = eka
	else
		parametrit = {}
		parametrit["kieli"]  = eka
		parametrit["teksti"] = text
	end	

	return teksti(parametrit)
end


--- Tekee kielen tyylillä (fonttikoolla) varustetun tekstipätkän.
--  VANHENTUNUT
--  @param lang:  kielikoodi
--  @param text:  tekstipätkä annetulla kielellä
--  @param lisaparametrit: parametrit, joilla voi vaikuttaa tekstin tulostukseen:
--           ["elem"]  = html-elementti, johon teksti tulee (oletus span)
--           ["class"] = html:n class-attribuutti elementille (oletus tyhjä)
--  @return:      span-elementillä ympäröity teksti, jossa on kielen tyyli
function p.teksti_vanha(lgsc, text, lisaparametrit)
	lisaparametrit = lisaparametrit or {}
	lisaparametrit["kieli"]  = eka
	lisaparametrit["teksti"] = text
	
	return teksti(lisaparametrit)
end

function p.Teksti(frame)
    if frame.args.frame == 'parent' then
        frame = frame:getParent()
    end
    
    local args = frame.args
    
    args.kieli  = apu.ensimmainen_ei_tyhja{ args.kieli,  args[1] }
    args.teksti = apu.ensimmainen_ei_tyhja{ args.teksti, args[2] }

    return p.teksti(args)
end


return p