Moduuli:hello

Wikisanakirjasta

Tämän moduulin ohjeistuksen voi tehdä sivulle Moduuli:hello/ohje

local kielet = require("Module:kielikoodit")

local m = {}

local YLA = ""; 
local KESKI = "{{keski}}"
local ALA = ""; 
local VIKA = "SEURAAVISSA KÄÄNNÖKSISSÄ ON VIKAA[[Luokka:Käännökset tarkistettava]]<br/>"
 
local function avaa(key)
    m = string.match(key, "{{(%w+)}}")
    if m then return kielet.nimi(m) end
    return key
end

local function kieliosa(nimi)
    tunnus = kielet.tunnus(nimi)
    if tunnus then
        return "{{" .. tunnus .. "}}"
    else
        return nimi
    end
end


local function tulosta(rivit, oudot)
    local ulos = ''
    local m = 0; iv = 1
    local function print(t) ulos = ulos .. t end
    local function println(t) ulos = ulos .. t .. '\n' end
    local function comp(a, b) return a.k < b.k end

    table.sort(rivit, comp)
    --println(YLA)
    for i = 1, #rivit do
	    println("*" .. kieliosa(rivit[i].k) .. ": " .. rivit[i].v)
	    m = m + rivit[i].m
	    if m >= (yht / 2) then iv = i; break end
    end
    println(KESKI)
    
    for i = iv+1, (#rivit-1) do
	    println("*" .. kieliosa(rivit[i].k) .. ": " .. rivit[i].v)
    end
    -- ei rivinvaihtoa viimeiseen muuten tulee tyhjä väli
    print("*" .. kieliosa(rivit[#rivit].k) .. ": " .. rivit[#rivit].v)
    
    if #oudot > 0 then
        println(VIKA)
    end 
    for i = 1, #oudot do
	    println('*' .. oudot[i])
    end
    
    --print(ALA)
    return ulos
end

-- Parsii tekstin teksti ja palauttaa sen järjestettynä ja {{keski}}-mallineella varustettuna.
local function parsi(teksti)
    local rivit = {}
    local oudot = {}

    local i = 0; yht = 0
    -- Käydään läpi rivi kerrallaan.
    for r in string.gmatch(teksti, "([^\n]*)\n") do
	    -- Yritetään jakaa rivi kaksoispiteestä.
	    k, v = string.match(r, "\*?([^:]*): *(.*)")
	    -- Jos ei sisällä kakoispistettä, eikä se ole {{keski}}, lisätään se outoihin.
	    if k == nil then
	        if r ~= KESKI and r ~= '' then
		        table.insert(oudot, r)
	        end
	    else
	        -- Jos rivi on sisennetty, lisätään edellisen perään.
	        if k == '' then 
		        rivit[i].v = rivit[i].v .. '\n*:' .. k .. v
		        rivit[i].m = rivit[i].m + 1
	            -- Muuten lisätään uusi rivi.
	        else
		        i = i + 1
		        rivit[i] = { k = avaa(k), v = v, m = 1 }
	        end
            yht = yht + 1
	    end
    end
    return tulosta(rivit, oudot)
end

function m.jarjesta(frame)
    frame = frame:getParent()
    return parsi(frame.args[1])
end

return m