Wiki della Community
Advertisement
Wiki della Community
Avviso arancio 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:

  1. Se c'è un parametro {{{stagione}}}, aggiungerà [[Categoria:Episodi della stagione {{{stagione}}}]].
  2. 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?

  1. 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 con return alla fine. Altri moduli e pagine potranno utilizzare qualsiasi cosa nella tabella esportata.
  • Stiamo creando una funzione main nella nostra tabella p. 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 a Primo parametro, Secondo parametro e il valore di un parametro chiamato ciao, 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 oggetto frame. 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) e args.ciao (mondo). Accedere a qualsiasi chiave che non esiste restituirà un valore nil, equivalente all'undefined di JavaScript o al None 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 valore nil dalla tabella args, che verrebbe valutato come falso.
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 in stagione).
  • Se stagione è impostato, controlla se anche speciale è impostato.
    • Se speciale è impostato, aggiunge una categoria [[Categoria:Episodi speciali della stagione %s]], dove %s verrà sostituito col valore in stagione.
    • Altrimenti, aggiunge una categoria [[Categoria:Episodi della stagione %s]].
  • Se stagione non è impostato, aggiunge una categoria [[Categoria:Episodi senza stagione]].
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?

[]

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.

Advertisement