Moduli Lua in un wiki

Da W.Training Demo Wiki.
Jump to navigation Jump to search

Questa pagina rappresenta un esempio di come un wiki aziendale può essere usato per rendere disponibile della documentazione tecnica.

Sebbene MediaWiki contenga funzionalità native per la gestione delle variabili e la generazione di output condizionali, è possibile ottenere risultati più sofisticati utilizzando all'interno di MediaWiki moduli scritti in Lua.

Questa funzionalità si appoggia sull'estensione Scribunto di MediaWiki.

La sintassi di base prevede l'inserimento all'interno di un template di un "invoke" che punta a un "Modulo" e a una funzione che deve essere dichiarata al suo interno.

Nel template:

{{#invoke: Module_name | function_name | arg1 = val_arg1 | arg2 = val_arg2 | arg3 = val_arg3 ... }}

Nella pagina Module:Module_name:

local p = {} --p stands for package

function p.hello( frame )
    return "Hello, world!"
end

return p

Esempio di funzione complessa con lettura delle variabili inserite dall'utente nel template e restituzione di output differenziati a seconda del valore delle variabili:

local p = {} --p stands for package

function p.display( frame )
	-- ================ recupero variabili dal frame del template ================
	notizia1 = frame.args['notizia1']
	inizioNotizia1 = frame.args['inizioNotizia1']
	fineNotizia1 = frame.args['fineNotizia1']
	notizia2 = frame.args['notizia2']
	inizioNotizia2 = frame.args['inizioNotizia2']
	fineNotizia2 = frame.args['fineNotizia2']
	notizia3 = frame.args['notizia3']
	inizioNotizia3 = frame.args['inizioNotizia3']
	fineNotizia3 = frame.args['fineNotizia3']
	notizia4 = frame.args['notizia4']
	inizioNotizia4 = frame.args['inizioNotizia4']
	fineNotizia4 = frame.args['fineNotizia4']
	oggi = frame.args['oggi']
    -- ================ controllo quali notizie sono attive ================
    if notizia1 ~= "vuota" and inizioNotizia1 <= oggi and oggi <= fineNotizia1 then
		notizia1Attiva = true
		else notizia1Attiva = false
    end
    if notizia2 ~= "vuota" and inizioNotizia2 <= oggi and oggi <= fineNotizia2 then
		notizia2Attiva = true
		else notizia2Attiva = false
    end
    if notizia3 ~= "vuota" and inizioNotizia3 <= oggi and oggi <= fineNotizia3 then
		notizia3Attiva = true
		else notizia3Attiva = false
    end
    if notizia4 ~= "vuota" and inizioNotizia4 <= oggi and oggi <= fineNotizia4 then
		notizia4Attiva = true
		else notizia4Attiva = false
    end
    -- ================ vedo quali notizie sono attive e mostro output di conseguenza ================
    -- se sono attive tutte e quattro
	if notizia1Attiva == true and notizia2Attiva == true and notizia3Attiva == true and notizia4Attiva == true then
		output = "<div class=news-1-of-4>"..notizia1.."</div><div class=news-2-of-4>"..notizia2.."</div><div class=news-3-of-4>"..notizia3.."</div><div class=news-4-of-4>"..notizia4.."</div>"
	-- se sono attive tre notizie
	elseif notizia1Attiva == true and notizia2Attiva == true and notizia3Attiva == true and notizia4Attiva == false then
		output = "<div class=news-1-of-3>"..notizia1.."</div><div class=news-2-of-3>"..notizia2.."</div><div class=news-3-of-3>"..notizia3.."</div>"
	-- se sono attive due notizie
	elseif notizia1Attiva == true and notizia2Attiva == true and notizia3Attiva == false and notizia4Attiva == false then
		output = "<div class=news-1-of-4>"..notizia1.."</div><div class=news-2-of-4>"..notizia2.."</div><div class=news-3-of-4>"..notizia1.."</div><div class=news-4-of-4>"..notizia2.."</div>"
	-- se è attiva una notizia
	elseif notizia1Attiva == true and notizia2Attiva == false and notizia3Attiva == false and notizia4Attiva == false then
		output = "<div class=news-static>"..notizia1.."</div>"
	-- se non è attiva nessuna notizia
	elseif notizia1Attiva == false and notizia2Attiva == false and notizia3Attiva == false and notizia4Attiva == false then
		output = "<div class=news-static>Al momento non ci sono notizie.</div>"
	end
	return output
end

return p

Documentazione

Menu di navigazione