Titolo
Spiegazione |
Se stai creando dei template su una wiki, prima o poi potresti dover imparare a usare le funzioni parser per creare codici più complessi. Che sia {{#if:}}
o {{#switch:}}
, queste funzioni ti aiutano ad avere elementi costitutivi più potenti per i contenuti.
Tuttavia, ad un certo punto potresti dover affrontare un problema: usare troppi #if
rende più difficile leggere il codice sorgente. Immagina di voler classificare automaticamente le pagine degli episodi in una wiki su un programma televisivo con le seguenti regole:
- Se c'è un parametro
{{{stagione}}}
, aggiungerà[[Categoria:Episodi della stagione {{{stagione}}}]]
. - Se non c'è il parametro
{{{stagione}}}
, aggiungerà[[Categoria:Episodi senza stagione]]
così potrai trovarlo facilmente.
In un template, avresti bisogno di un #if:
semplice come:
{{#if:{{{stagione|}}}|[[Categoria:Episodi della stagione {{{stagione}}}]]|[[Categoria:Episodi senza stagione]]}}
Tante {{ }}
e [[ ]]
potrebbero iniziare a sembrare confuse, ma non è così terribile... ancora. E se avessimo bisogno di aggiungere una nuova regola?
- Se c'è un parametro
{{{speciale}}}
, che determina se l'episodio è un episodio normale o uno speciale, deve invece aggiungere[[Categoria:Episodi speciali della stagione {{{stagione}}}]]
.
Come potremmo farlo? Forse qualcosa del tipo:
{{#if:{{{stagione|}}}|{{#if:{{{speciale|}}}|[[Categoria:Episodi speciali della stagione {{{stagione}}}]]|[[Categoria:Episodi della stagione {{{stagione}}}]]}}|[[Categoria:Episodi senza stagione]]}}
Ora sta diventando un po' più difficile da leggere, vero? Abbiamo solo aggiunto una singola regola alla nostra logica! Le funzioni parser risultano efficaci nei controlli semplici ma diventano più complicate quando si tenta di implementarci una logica più complessa. Che cosa dovremmo fare allora? Come linguaggio di programmazione, Lua è uno strumento più potente che ti aiuta ad aggiungere logica avanzata ai tuoi template, pur essendo più facile da leggere se ne hai familiarità. Ma, prima di poter convertire l'esempio precedente, dobbiamo capire che cos'è e come puoi usarlo su una wiki attraverso i moduli.
Guida rapida per Lua[]
Gli script Lua sono disponibili nel namespace Modulo: in tutte le wiki di default. Proprio come tutti i template iniziano con Template:, tutti gli script Lua sono nelle pagine che iniziano con Modulo:. La maggior parte dei moduli apparirà come:
local p = {}
function p.main(frame)
-- codice
end
return p
Facciamo un breve riassunto dell'esempio precedente:
local p
è una variabile che memorizza una tabella vuota{}
. Ne hai bisogno per mantenere tutte le funzioni esportate raggruppate insieme così che possano essere restituite conreturn
alla fine. Altri moduli e pagine potranno utilizzare qualsiasi cosa nella tabella esportata.- Stiamo creando una funzione
main
nella nostra tabellap
.frame
è un argomento che tutte le funzioni ricevono quando vengono chiamate da una pagina; puoi leggere di più sull'oggetto frame ma, per ora, ci basta sapere che permette di accedere ai parametri utilizzati nella pagina. Per esempio, in "{{Template|Primo|Secondo|ciao=mondo}}
", ti darebbe accesso aPrimo parametro
,Secondo parametro
e il valore di un parametro chiamatociao
, che èmondo
.
Ricorda: main
è solo un esempio! Puoi utilizzare qualsiasi nome valido per le tue funzioni.
Creare il nostro modulo[]
Ora, entriamo nel codice vero e proprio! Concentrati sul nuovo contenuto, che è tutto all'interno della funzione main
.
local p = {}
function p.categorizza(frame)
local args = require('Dev:Arguments').getArgs(frame)
local stagione = args.stagione
local speciale = args.speciale
if stagione then
if speciale then
return string.format( '[[Categoria:Episodi speciali della stagione %s]]', stagione )
else
return string.format( '[[Categoria:Episodi della stagione %s]]', stagione )
end
else
return '[[Categoria:Episodi senza stagione]]'
end
end
return p
Passo passo[]
Diamo un'occhiata a che cos'è tutto questo.
- Accedere ai parametri
- Ci sono altri modi per accedere ai parametri passati al modulo dalla pagina ma il più consigliato è usare Arguments, un Modulo Lua Globale disponibile in tutte le wiki. Esporta una funzione
getArgs
che ti darà una tabella con tutti gli argomenti del tuo oggettoframe
. Usando lo stesso template di chiamata che avevamo prima, "{{Template|Primo|Secondo|ciao=mondo}}
", ti darà tutti gli argomenti in una tabella come:
{ "Primo", "Secondo", ciao = "mondo" }
- Ricorda che le tabelle Lua iniziano a indicizzare da 1! Quindi puoi accedere a qualsiasi parametro di cui hai bisogno con
args[1]
(Primo),args[2]
(Secondo) eargs.ciao
(mondo). Accedere a qualsiasi chiave che non esiste restituirà un valorenil
, equivalente all'undefined
di JavaScript o alNone
di Python.
- Implementare la tua logica
- Dovresti già avere familiarità con le dichiarazioni
if
in programmazione. La sintassi Lua può essere diversa ma facile da capire. - Proprio come abbiamo fatto prima di utilizzare le funzioni parser, controlliamo prima se il parametro
stagione
è stato impostato. Se così non fosse, otterremmo un valorenil
dalla tabellaargs
, che verrebbe valutato comefalso
. - L'altra parte che potrebbe farti chiedere del suo significato è
string.format
. Lua ha diversi modi di "interpolare" le stringhe e questo è solo uno di essi. Il primo parametro di questa funzione è la stringa del template dove ogni istanza di%s
verrà sostituita dai seguenti parametri in ordine (in questo caso, il valore memorizzato instagione
).- Se
stagione
è impostato, controlla se anchespeciale
è impostato.- Se
speciale
è impostato, aggiunge una categoria[[Categoria:Episodi speciali della stagione %s]]
, dove%s
verrà sostituito col valore instagione
. - Altrimenti, aggiunge una categoria
[[Categoria:Episodi della stagione %s]]
.
- Se
- Se
stagione
non è impostato, aggiunge una categoria[[Categoria:Episodi senza stagione]]
.
- Se
- Proprio come un template, il valore restituito dal tuo modulo verrà inserito nell'articolo.
Come lo uso?[]
Se avevamo l'esempio precedente in Modulo:Episodio
, potresti chiamarlo in qualsiasi pagina usando {{#invoke:Episodio|categorizza|stagione=1}}
. Tuttavia, dovresti evitarlo. Sebbene la sintassi sia molto simile ai template, potrebbe potenzialmente confondere i nuovi utenti: #invoke
? Perché categorizza
? Dov'è questo template?
Di solito, gli utenti della wiki non utilizzeranno mai i moduli direttamente ma piuttosto tramite template. Ad esempio, nel Template:Profilo episodio
, potresti chiamare il modulo alla fine come: {{#invoke:Episodio|categorizza}}
.
Forse ti starai chiedendo: come farà a conoscere la stagione? Be', l'oggetto frame
avrà accesso a tutti i parametri passati a {{Profilo episodio}}
! E, grazie al modulo globale Arguments che abbiamo usato prima, ti darà un facile accesso a questi parametri senza dover modificare il tuo modulo. Non è fantastico?
Riepilogo[]
Questo blog ti ha dato solo un'idea di come puoi utilizzare Lua per semplificare la logica nei tuoi template, speriamo che sarai in grado di applicarlo in scenari migliori in modo che siano più facili da mantenere! Ecco un breve elenco di quando dovresti considerare l'utilizzo di Lua:
- Il tuo template ha molte funzioni parser, specialmente se nidificate.
- Ti serve poter elaborare un numero qualsiasi di parametri. Anziché aggiungere manualmente
{{{parametro 1}}}
,{{{parametro 2}}}
,{{{parametro 3}}}
e così via man mano che ti servono, puoi gestirli usando Lua. - Sebbene centralizzare i dati è considerata una cattiva pratica per le wiki, a volte può essere la soluzione migliore per le tue esigenze. E il modo migliore per centralizzare i dati è tramite i moduli Lua.
Ricorda che i moduli Lua richiedono che qualcuno conosca il linguaggio per poterli mantenere. Prova a seguire buone pratiche di programmazione nel tuo modulo in modo che altre persone siano in grado di capire che cosa dovrebbe fare e navigare facilmente al suo interno se hanno bisogno di aggiustare qualcosa. Per esempio: usa variabili descrittive (local ip
non fornisce tante informazioni quanto local item_price
) e dividi il tuo codice in diverse funzioni per renderlo più facile da leggere. E, naturalmente, aggiungi alcuni commenti per renderlo chiaro agli altri!
Hai a tua disposizione tutti gli strumenti disponibili in un linguaggio di programmazione per creare moduli potenti da utilizzare negli articoli, invece di fare affidamento solo su funzioni parser e altre funzionalità di base.
Diventare un Pro: questioni tecniche