ParserFunctions di MediaWiki: #if, #ifeq, #switch, #expr e le trappole che nascondono

  • VersionDude
  • Parsing
  • 7 min di lettura

ParserFunctions è l'estensione che dà logica al wikitesto: condizioni, confronti, calcoli e date. È inclusa in MediaWiki, ma tre suoi comportamenti sorprendono quasi tutti: gli spazi contano come vuoto, le barre verticali rompono le tabelle e le funzioni sulle stringhe sono disattivate per impostazione predefinita.

Ogni infobox che nasconde una riga vuota, ogni template che mostra un'etichetta diversa a seconda di un parametro, ogni pagina wiki che calcola un'età a partire da una data si basa sulla stessa estensione: ParserFunctions. Aggiunge logica al wikitesto, che da solo sa soltanto sostituire testo. Questa guida copre le funzioni che userai davvero e i tre comportamenti che spiegano la maggior parte delle domande che le riguardano. Tutto ciò che segue è stato verificato nella documentazione dell'estensione su mediawiki.org il 15 ottobre 2026.

Installazione e sintassi

Una fila di volumi enciclopedici rilegati in pelle rossa, con etichette nere e lettere dorate (T, INDEX, WX YZ, UV), su uno scaffale, con poca profondità di campo. Gran parte della logica dei template di un grande wiki si scrive con le funzioni descritte qui.
Una fila di volumi enciclopedici rilegati in pelle rossa, con etichette nere e lettere dorate (T, INDEX, WX YZ, UV), su uno scaffale, con poca profondità di campo. Gran parte della logica dei template di un grande wiki si scrive con le funzioni descritte qui.

ParserFunctions è inclusa in MediaWiki. Fa parte del pacchetto di MediaWiki dalla versione 1.18, quindi su un wiki ospitato in proprio di solito basta attivarla con `wfLoadExtension( 'ParserFunctions' );` in `LocalSettings.php`. Non serve aggiornare il database. Su un wiki ospitato da terzi non puoi modificare quel file, e questo conta per le opzioni di configurazione più avanti.

Tutte le funzioni hanno la stessa forma. Si scrive `{{#nome: primo | secondo | terzo }}`: un cancelletto, il nome della funzione, due punti, poi i parametri separati da barre verticali. La documentazione precisa che gli spazi, a capo compresi, vengono rimossi all'inizio e alla fine di ogni parametro. È comodo per l'impaginazione, ed è l'origine della prima trappola.

Le funzioni condizionali

`#if` verifica solo se una stringa è vuota. `{{#if: test | valore se non vuota | valore se vuota }}` restituisce il secondo parametro quando il primo contiene qualsiasi cosa, e il terzo quando è vuoto o contiene solo spazi. Non valuta il test: `{{#if: 1==2 | sì | no }}` restituisce sì, perché «1==2» è una stringa non vuota, e anche `{{#if: 0 | sì | no }}` restituisce sì. Per le condizioni aritmetiche si usa `#ifexpr`.

  • #if : stringa non vuota o no (gli spazi contano come vuoto)
  • #ifeq : due valori identici o no (numerico se entrambi sono numeri)
  • #iferror : un'altra funzione ha restituito un errore
  • #ifexpr : risultato vero o falso di un'espressione aritmetica
  • #ifexist : una pagina esiste (costosa, limitata per pagina)
  • #switch : un risultato tra più casi, con valore predefinito
  • #expr : calcolo, arrotondamento, logica
  • #time / #timel : formattare una data (UTC o locale)
  • #titleparts : dividere il titolo di una pagina sulle sue barre
  • #rel2abs : trasformare un percorso di pagina relativo in assoluto

`#ifeq` confronta due stringhe, e i numeri come numeri. `{{#ifeq: a | b | uguali | diverse }}` restituisce il terzo o il quarto parametro. Quando entrambi i valori sono numeri validi il confronto è numerico: `01` è uguale a `1` e `1e3` è uguale a `1000`. Per confrontare più di due valori, lo strumento giusto è `#switch`.

`#switch` sceglie un risultato tra molti. `{{#switch: valore | caso1 = risultato1 | caso2 = risultato2 | predefinito }}` restituisce il risultato del primo caso che corrisponde, e l'ultimo parametro senza segno di uguale quando nessuno corrisponde. Più casi possono condividere un risultato scrivendoli uno dopo l'altro, con il risultato solo sull'ultimo. Sostituisce una catena di `#ifeq` annidati che diventa illeggibile oltre tre livelli.

Calcoli, date e verifica delle pagine

`#expr` fa calcoli, non elabora testo. `{{#expr: 1 + 1 }}` restituisce 2, e la funzione supporta operatori logici, `round`, `trunc`, `ceil` e `floor`. Un'espressione non valida restituisce un messaggio di errore che `#iferror` può intercettare. La documentazione è esplicita: le espressioni funzionano solo con valori numerici e non possono confrontare stringhe; per questo c'è `#ifeq`. Per le date, `#time` formatta una data, e la documentazione suggerisce il formato `xNU` per convertirla in secondi dal 1° gennaio 1970, che si possono poi sommare e sottrarre con `#expr`.

`#ifexist` è una funzione costosa, e fallisce in silenzio oltre un limite. Verifica se una pagina esiste. Ogni pagina di destinazione distinta conta per `$wgExpensiveParserFunctionLimit`, comprese le verifiche fatte nei template inclusi. Raggiunto il limite, ogni `#ifexist` successivo restituisce falso, che la pagina esista o no, e la pagina viene aggiunta a una categoria di servizio. Se un template mostra all'improvviso collegamenti rossi verso pagine che esistono, è la prima cosa da controllare.

**`#ifexist` è una funzione costosa, e fallisce in silenzio oltre un limite.** Verifica se una pagina esiste. Ogni pagina di destinazione distinta conta per `$wgExpensiveParserFunctionLimit`, comprese le verifiche fatte nei template inclusi. Raggiunto il limite, ogni `#ifexist` successivo restituisce falso, che la pagina esista o no, e la pagina viene aggiunta a una categoria di servizio. Se un template mostra all'improvviso collegamenti rossi verso pagine che esistono, è la prima cosa da controllare.

- VersionDude

Le due trappole che rompono i template

Le barre verticali nude rompono le tabelle. Poiché ogni barra viene letta come separatore di parametri, una tabella wiki scritta dentro `#if` o `#switch` si scompone. Da MediaWiki 1.24 la parola magica `{{!}}` produce una barra che il parser vede solo dopo l'esecuzione della funzione; prima, la maggior parte dei wiki usava un template chiamato `!` allo stesso scopo. Per mostrare una barra letterale, usa `|`.

Le funzioni sulle stringhe sono disattivate per impostazione predefinita. `#len`, `#pos`, `#sub`, `#replace`, `#explode` e le altre esistono solo se `$wgPFEnableStringFunctions` vale true, e il valore predefinito è false; `$wgPFStringLengthLimit` limita per impostazione predefinita le stringhe a 1.000 caratteri. La documentazione aggiunge che nel 2013 si è deciso che non saranno mai attivate su alcun wiki Wikimedia, perché sono inefficienti su larga scala. Su Wikipedia e sui progetti fratelli, l'elaborazione delle stringhe passa da moduli Lua, come `{{#invoke:String|len|...}}` fornito da Scribunto.

FAQ

ParserFunctions è installata di default in MediaWiki?

È inclusa nel pacchetto di MediaWiki dalla versione 1.18, quindi i file ci sono già. Su un wiki ospitato in proprio si attiva aggiungendo wfLoadExtension( 'ParserFunctions' ); in LocalSettings.php. Non serve aggiornare il database.

Perché {{#if: 0 | sì | no }} restituisce sì?

Perché #if verifica solo se il primo parametro è vuoto. «0» è una stringa non vuota, quindi il risultato è sì. #if non valuta mai il test come espressione; lo fa #ifexpr.

Come faccio funzionare #len o #replace?

Sul tuo wiki, imposta $wgPFEnableStringFunctions = true; in LocalSettings.php, sotto la riga che carica l'estensione. Sui wiki Wikimedia queste funzioni non saranno mai attivate, secondo la documentazione dell'estensione; usa il modulo Lua String tramite #invoke.

Come metto una tabella dentro #if o #switch?

Sostituisci ogni barra verticale che appartiene alla tabella con la parola magica {{!}}, disponibile da MediaWiki 1.24. Il parser vede allora la barra solo dopo l'esecuzione della funzione e non la scambia per un separatore di parametri.

Progetto correlato