Moduuli:tekstifunktiot

Wikisanakirjasta

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

local p = {}

function p.luettele(t, e, v, f, d)
    -- Luettelee annetun taulukon t tekstinä siten, että kutsuu jokaiselle sen alkiolle funktiota f. 
    -- Jokaisen alkion väliin tulee erotin e, paitsi, jos v on annettu, viimeisen eteen erotin v.
    -- d on funktiolle välitettävä data

    f = f or function(a) return a end   -- oletusfunktio, jos muuta ei anneta
    -- ensimmäinen alkio
    local l = '' .. f(t[1], d)
    
    -- ensimmäisen ja viimeisen välissä olevat alkiot
    for i = 2, (#t-1) do
        l = l .. e .. f(t[i], d)
    end
    -- viimeinen alkio
    if #t > 1 then
        l = l .. (v or e) .. f(t[#t], d)
    end
    return l
end

-- Palauttaa yks tai mon sen mukaan onko n 1 vai ei.
function p.y_tai_m(n, yks, mon)
    if n == 1 then return yks else return mon end
end

-- Palauttaa 'erottimella' erotetun tekstiluettelon jokaiselle 'listan' alkiolle, siten
-- että 'tmplistä' on korvattu teksti "{{{p}}}" listan alkiolla.
-- Esim. luettele2("{{{p}}}keitto", ", ", ["kala", "kasvis"]) palauttaa "kalakeitto, kasviskeitto"
function  p.luettele2(tmpl, erotin, lista, urlencode)
    local output = {}
    
    for i,v in ipairs(lista) do
	if i > 0 then
    	if urlencode then
    		v = mw.uri.encode(v, "QUERY"):gsub("%%", "%%%%")
    	end
	    local teksti,r = string.gsub(tmpl, "{{{p}}}", v)
	    if r then
		table.insert(output, teksti)
	    else
		-- lisätään teksti sellaisenaan, TODO onko hyödyllinen?
    		table.insert(output, tmpl)
	    end
	 end
   end

    return table.concat(output, erotin, 1, #output)
end

function p.Luettele(frame)
    local pframe = frame:getParent()
    local tmpl = frame.args.t or "{{{p}}}"
    local erotin = frame.args.e or ""
	erotin,r = string.gsub(erotin, "&sp;", " ")	-- alku- ja loppuvälien lisäämiseksi
    return p.luettele2(tmpl, erotin, pframe.args, frame.urlencode or 0)
end


return p