Moduuli:Kuuntele

Wikipediasta
Siirry navigaatioon Siirry hakuun

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

local p = {}

-- ei esitetä ohjetekstiä: teksti pitäisi näyttää vähintään kerran 
-- mutta jos on muu painava syy ja vähennetään toistoa
local nohelptext = false

-- ei esitetä kuvaa soittimessa: oletuksena näkyy vasemmalla puolella
-- mutta jos esitetään muutoin se helpottaa mobiilisovelluksen toimintaa
local noimage = false

local function seurantaluokat(noFile, noName, notAvailable)
	-- toistaiseksi vain yksi
	local luokat = '[[Luokka:Ääninäytteelliset sivut]]'
	if (noFile == true) then
		luokat = luokat .. '[[Luokka:Ääninäytelaatikot ilman tiedostoja]]'
	end
	if (noName == true) then
		luokat = luokat .. '[[Luokka:Ääninäytelaatikot ilman nimeä]]'
	end
	if (notAvailable == true) then
		luokat = luokat .. '[[Luokka:Ääninäytelaatikon tiedosto ei ole saatavilla]]'
	end
	return luokat
end

-- soittimen aikajana
local function kappalelohko(tiedosto, nimi, leveys)
	--local text1 = string.format('[[:File:%s|%s]]', filename, title)
	--local text2 = string.format('[[File:%s|%spx|noicon]]', filename, leveys)
	local text1 = '[[:File:' .. tiedosto ..'|' .. nimi ..']]'
	local text2 = '[[File:' .. tiedosto .. '|' .. leveys .. 'px|noicon]]'
	return text1 .. text2
end

-- kuvaileva teksti aikajanan alle
local function kuvauslohko(parent, teksti)
	local desc = parent:tag('div')
		:cssText('font-size:10pt;text-align:left;padding:0pt;padding-left:0pt;line-height:1.25em')
		:wikitext(teksti)
end

-- soitin, jossa aikajana ja kuvaus yhdelle kappaleelle
local function soitinlohko(parent, tiedosto, nimi, kuvaus, leveys)
	local alaluokka = 'listenlist'
	if (noimage == true) then
		alaluokka = 'listen-noimage'
	end
	if (tiedosto and nimi) then
		local lista = parent:tag('div')
		lista:addClass('medialist ' .. alaluokka)
			:cssText('width:' .. leveys .. 'px;padding-top:0em;padding-bottom:0em;')
		
		local entry = lista:tag('div')
			:wikitext(
				kappalelohko(tiedosto, nimi, leveys))
		if (kuvaus) then
			kuvauslohko(lista, kuvaus)
		end
	end
end

-- kaksoispisteet pisteeksi
-- TODO: kesto pitäisi esittää pisteellä eroteltuna, ei kaksoispisteellä..
-- katso saako sen jotenkin pakotettua soittimen parametreihin vai käyttääkö se aina itse haettua
local function korjaakesto(kesto)
	if kesto == nil then
		return nil
	end

	local tunnit, minuutit, sekunnit

	-- Try to match times like "1:23:45".
	tunnit, minuutit, sekunnit = kesto:match('^(%d+):(%d%d):(%d%d)$')
	if tunnit and minuutit and sekunnit then
		kesto = tunnit .. '.' .. minuutit .. '.' .. sekunnit
		return kesto
	end

	-- The previous attempt didn't match. Try to match times like "1:23".
	minuutit, sekunnit = kesto:match('^(%d?%d):(%d%d)$')
	if minuutit and sekunnit then
		-- allow minutes.seconds even if either is zero (it is used in some articles)
		kesto = minuutit .. '.' .. sekunnit
		return kesto
	end

	return kesto
end

local function rivinumero(args, field)
	local maxnum = 0
	for k, v in pairs(args) do
		local num = tostring(k):match('^' .. field .. '([1-9]%d*)$')
		if num then
			local numero = tonumber(num)
			if numero > maxnum then
				maxnum = numero
			end
		end
	end
	return maxnum	
end

function p._main(args)
	-- ohjeteksti (pitäisi olla vähintään kerran sivulla mutta kerran laatikossa voi olla ok?)
	if args['helpnote'] and args['helpnote'] == 'no' then
		nohelptext = true
	end
	if args['eiohjetta'] and args['eiohjetta'] == 'kyllä' then
		nohelptext = true
	end
	if args['eikuvaa'] and args['eikuvaa'] == 'kyllä' then
		noimage = true
	end
	-- laske leveydet jos piilotetaan kuva
	local leveys = 300
	local leveysali = 265
	if (args['leveys']) then
		leveys = args['leveys']
		if (args['leveysali']) then
			leveysali = args['leveysali']
		end
	elseif (noimage == true) then
		-- ei ole pakotettu leveyksiä ja ei esitetä kuvaa
		leveys = 250
		leveysali = 245
	end
	-- TODO: virheen tarkistus
	--if (leveys < 250 or leveysali < 240) then
		-- virhe: liian pieni laatikko -> soitin ei toimi oikein mobiiliversiossa
	--end
	-- vasen tai oikea reuna
	-- TODO: keskitys ? vain jos upotetaan?
	local sijoitus = 'right'
	if (args['sijoitus']) then
		if (args['sijoitus'] == 'vasen' or args['sijoitus'] == 'left') then
			sijoitus = 'left'
		end
		if (args['sijoitus'] == 'oikea' or args['sijoitus'] == 'right') then
			sijoitus = 'right'
		end
	end

	local rivit = rivinumero(args, 'tiedosto')

	-- laatikon tiedot
	local rootnode = mw.html.create()

	local margin	
	if (sijoitus == 'left') then
		margin = 'margin:3px 1em 3px 0; padding: 0 2em 0 0;'
	else
		margin = 'margin:3px 0 3px 1em; padding: 0 2em 0 0;'
	end
	
	-- laatikon ulkokehys
	local juuri = rootnode:tag('div')
		:cssText('float:' .. sijoitus .. '; clear:' .. sijoitus .. '; border:1px solid #CCC; background:#FFF; width:' .. leveys .. 'px; '.. margin .. ';')

	-- laatikon ylälaidan otsikko
	if (args['otsikko']) then
		local otsake = juuri:tag('div')
			:cssText('font-weight:bold;padding-top:1em;padding-left:1em;margin-bottom:-0.5em;')
			:wikitext(args['otsikko'])
	end

	-- jos ei ole tiedostoa tai numeroituja rivejä -> virhe -> näytetään laatikossa
	if (not args['tiedosto'] and rivit == 0) then
		local virheteksti = juuri:tag('span')
		virheteksti:addClass('error')
			:wikitext('Ei tiedostoa')

		local laatikonteksti = tostring(rootnode) 
		return laatikonteksti .. seurantaluokat(true, false, false)
	end
	-- jos ei ole nimeä tai numeroituja rivejä -> virhe -> näytetään laatikossa
	if (not args['nimi'] and rivit == 0) then 
		local virheteksti = juuri:tag('span')
		virheteksti:addClass('error')
			:wikitext('Ei nimeä')
		
		local laatikonteksti = tostring(rootnode) 
		return laatikonteksti .. seurantaluokat(false, true, false)
	end

	-- TODO: tarkista yritetäänkö ulkoista linkkiä
	-- -> virhe, ei sallita
	--if (args['tiedosto'].substr('http:// ')) then
		-- virhe: ei voida sallia ulkoisia linkkejä? vai voidaanko?
	--end

	-- numeroimaton kappale ja soitin
	if (args['tiedosto'] and args['nimi']) then
		soitinlohko(juuri, args['tiedosto'], args['nimi'], args['kuvaus'], leveysali)
	end

	-- numeroidut lisärivit
	local rivinro = 1
	while (rivinro <= rivit) do
		local numero = tostring(rivinro)
		if (args['tiedosto' .. numero] and args['nimi' .. numero]) then
			soitinlohko(juuri, args['tiedosto' .. numero], args['nimi' .. numero], args['kuvaus' .. numero], leveysali)
		end
		-- TODO: jos vain jompikumpi annettu voi olla typo -> seurantaluokka
		rivinro = rivinro +1
	end
	
	-- ohjeteksti
	if (nohelptext == false) then
		local helptext = juuri:tag('p')
			:cssText('text-align:right;font-style:italic;font-size:10pt;line-height:1em;')
			:wikitext('Äänitiedostojen [[Wikipedia:Ääni ja video|kuunteluohjeet]]')
	end

	local laatikonteksti = tostring(rootnode) 
	return laatikonteksti .. seurantaluokat(false, false, false)
end

function p.main(frame)
	local origArgs
    if frame == mw.getCurrentFrame() then
        origArgs = frame:getParent().args
        for k, v in pairs( frame.args ) do
            origArgs = frame.args
            break
        end
    else
        origArgs = frame
    end	
	local args = {}
	for k, v in pairs(origArgs) do
		if v ~= '' then
			args[k] = v
		end
	end
	return p._main(args)
end

return p