Vai al contenuto

Modulo:String

Da Wikiversità, l'apprendimento libero.

Modulo Lua per la manipolazione di stringhe.

La maggior parte delle funzioni di questo modulo possono essere invocate con parametri con nome, senza nome o con un misto di entrambi. Il software di MediaWiki, quando vengono usati parametri con nome, rimuoverà ogni spazio iniziale o finale dal parametro. A seconda dell'uso che si vuole fare della funzione può essere vantaggioso conservare oppure rimuovere questi spazi.

Chiamata delle funzioni

Questo modulo è pensato per essere richiamato da template, non direttamente da una voce. Il modulo è richiamabile anche da un altro modulo Lua, ma in questo caso è meglio usare direttamente le funzioni Lua di manipolazione delle stringhe:

Per richiamare il modulo da un template usare la sintassi: {{{{{|safesubst:}}}#invoke:String|nome della funzione|parametro 1|parametro 2|...|parametro n|}}. Per esempio d'uso vedi il template {{Str len}}

Opzioni globali

Alcune funzioni possono dare un messaggio di errore o impostare una categoria di errori, la generazione di questo messaggio e/o la creazione di questa categoria possono essere controllate dalle seguenti opzioni.

ignore_errors: se impostato a 1 o "true" ogni condizione di errore darà una stringa vuota piuttosto che un messaggio di errore.
error_category: nel caso si verifichi un errore è il nome di una categoria da includere insieme al messaggio di errore. La categoria di default è Categoria:Errori riportati dal modulo String.
no_category: Se settato a 1 o "true", non verranno aggiunte categorie in caso di errore.

Funzioni

len

Questa funzione restituisce la lunghezza di una stringa.

Uso
  • {{#invoke:String|len|stringa}}

O

  • {{#invoke:String|len|s= stringa }}
Parametri
  • s: La stringa di cui restituire la lunghezza

Se invocata usando parametri nominati, Mediawiki rimuoverà automaticamente ogni spazio iniziale o finale dalla stringa.

sub

Questa funzione restituisce la sottostringa di una stringa bersaglio, come indicato dagli indici

Uso
  • {{#invoke:String|sub|stringa_bersaglio|indice_iniziale|indice_finale}}

O

  • {{#invoke:String|sub|s= stringa_bersaglio |i= indice_iniziale |j= indice_finale }}
Parametri
  • s: La stringa da cui estrarre una sottostringa
  • i: La posizione iniziale del primo carattere della sottostringa da restituire, se non specificato è 1.
  • j: La posizione finale dell'ultimo carattere della sottostringa da restituire, se non specificato corrisponde alla lunghezza della stringa_bersaglio (l'ultimo carattere).

I caratteri della stringa sono numerati a partire da 1. Se i o j hanno un valore negativo allora contano la posizione contando dalla fine della stringa, -1 è l'ultimo carattere della stringa, -2 il penultimo, ecc...

Se le posizioni sono al di fuori degli estremi della stringa viene restituito un messaggio di errore.

match

Questa funzione restituisce una sottostringa della stringa bersaglio corrispondente a un pattern specificato.

Uso
  • {{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}

O

  • {{#invoke:String|match|s= source_string |pattern= pattern_string |start= start_index |match= match_number |plain= plain_flag |nomatch= nomatch_output }}
Parametri
  • s: la stringa da cercare
  • pattern: il pattern da cercare nella stringa s
  • start: la posizione iniziale da cui iniziare la ricerca, se non specificato è 1.
  • match: se ci sono corrispondenze multiple, quale restituire: 1 per la prima corrispondenza, 2 per la seconda, ecc... Un valore negativo indica di contare all'indietro a partire dall'ultima corrispondenza, quindi match = -1 significa chiedere l'ultima corrispondenza. Se non specificato è 1
  • plain: se vero specifica che il pattern deve essere considerato come una stringa normale, piuttosto che un pattern Lua. Se non specificata è falso.
  • nomatch: il valore da restituire se non ci sono corrispondenze, invece di un errore.

Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli spazi iniziali e finali. In alcune circostanze questo può essere il comportamento desiderato, in altre si potrebbe volerli conservare.

Se match o start sono al di fuori degli estremi della stringa s, allora la funzione restituisce un errore. Viene generato un errore anche se il non vengono trovate corrispondenze. Per sopprimere gli errori si può aggiungere il parametro ignore_errors=true, in questo caso in caso di errore verrà restituita una stringa vuota.

pos

Questa funzione restituisce il carattere della stringa in posizione pos.

Uso
  • {{#invoke:String|pos|stringa_bersaglio|indice}}

O

  • {{#invoke:String|pos|target= stringa_bersaglio |pos= indice }}
Parametri
  • target: la stringa in cui cercare
  • pos: la posizione del carattere da restituire

Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli spazi iniziali e finali. In alcune circostanze questo può essere il comportamento desiderato, in altre si potrebbe volerli conservare.

I caratteri della stringa sono numerati a partire da 1. Se pos è un valore negativo allora conta la posizione partendo dalla fine della stringa, -1 è l'ultimo carattere della stringa, -2 il penultimo, ecc...

Se la posizione richiesta è 0 o al di fuori degli estremi della stringa viene restituito un errore.

str_find

Questa funzione duplica il comportamento di {{str_find}}, inclusi i casi particolari. Questa funzione è fornita per motivi di compatibilità con i vecchi template, ma SI RACCOMANDA di non utilizzarla in nuovi template. Nello sviluppo di nuovo codice si raccomanda di usare la funzione find.

Parametri
  • source: la stringa in cui cercare
  • target: la stringa da cercare

Restituisce la posizione nella stringa source del primo carattere in cui è stata trovata la stringa target. I caratteri della stringa sono numerati a partire da 1. La funzione restituisce -1 se la stringa target non è contenuta in source.

Nota importante: Per compatibilità con il vecchio template, se la stringa target è vuota o manca, la funzione restituisce il valore "1"

find

Questa funzione permette di cercare una stringa bersaglio o un pattern Lua all'interno di un'altra stringa.

Uso
  • {{#invoke:String|find|stringa_sorgente|stringa_bersaglio|indice_iniziale|plain_flag}}

O

  • {{#invoke:String|find|source= stringa_sorgente |target= stringa_bersaglio |start= indice_iniziale |plain= plain_flag }}
Parametri
  • source: la stringa in cui cercare
  • target: la stringa o pattern Lua da cercare
  • start: la posizione da cui iniziare la ricerca, se non specificato è 1
  • plain: Se è vero indica che la stringa target deve essere considerata come un testo normale e non come un pattern Lua, se non specificata è vera

Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli spazi iniziali e finali. In alcune circostanze questo può essere il comportamento desiderato, in altre si potrebbe volerli conservare.

Questa funzione restituisce la prima posizione maggiore o uguale a start a partire dalla quale target si trova in source. I caratteri della stringa sono numerati a partire da 1. Se target non viene trovato dà 0. Se source o target sono mancanti o vuoti dà 0.

Questa funzione dovrebbe essere sicura per stringhe UTF-8.

replace

Questa funzione permette di rimpiazzare una stringa o pattern bersaglio con un'altra stringa.

Uso
  • {{#invoke:String|replace|stringa_sorgente|stringa_pattern|nuova_stringa|numero_di_sostituzioni|plain_flag}}

O

  • {{#invoke:String|replace|source= stringa_sorgente |pattern= stringa_pattern |replace= nuova_stringa | count= numero_di_sostituzioni |plain= plain_flag }}
Parametri
  • source: la stringa in cui cercare
  • pattern: la stringa o pattern Lua da trovare in source
  • replace: il testo di sostituzione
  • count: il numero di volte in cui rimpiazzare la stringa, se non specificato tutte.
  • plain: se vero indica che il pattern deve essere considerato come testo normale e non come pattern Lua, il valore di default è vero

arraytostring

Formatta una o più liste di valori in una singola stringa

Uso
  • {{#invoke:String|arraytostring|par1|formato|separatore|congiunzione}}
Parametri
  • par1 ... parn: il nome base delle variabili da unire, deve contenere il carattere "#" che precisa la posizione in cui inserire l'indice. Ad esempio se par1 è "Param#", la funzione unirà i valori della lista di parametri Param1, Param2, Param3, ecc...
    Il parametro "Param" (senza numero) sarà considerato equivalente a "Param1" (questo comportamento può essere modificato con il parametro "baseIndex")
  • msg: formattazione da applicare alla compilazione dei parametri. Il simbolo $n fa da segnaposto per il parametro "parn". È possibile inserire codice mediawiki, ma sarà eseguito prima del modulo, cioè quando il simbolo $n non è ancora stato sostituito. Per ovviare al problema, gli eventuali caratteri "{" e "}" delle parti di codice che debbano essere eseguite dopo l'elaborazione di $n dovranno essere preceduti da un "\", mentre il carattere "|" dovrà essere inserito con la costante {{!}}. Un eventuale "\}" finale dovrà sempre essere staccato, con spazio o altro, dal "}}" di fine comando. Un esempio pratico: {{#if:{{{x|}}}|$2}} si può scrivere normalmente così perché la condizione si basa sul parametro "x"; al contrario \{\{#if:$2{{!}}{{{x|}}}\}\} va scritto come appena spiegato perché la condizione si basa sul simbolo $2 che sarà sostituito solo dopo l'avvio del modulo.
  • separatore: una stringa (opzionale) da inserire tra ogni valore
  • congiunzione: una stringa (opzionale) da inserire al posto del separatore tra l'ultimo e il penultimo valore. Se non dichiarata viene usato il valore di "separatore"
  • nmin: indice iniziale da cui partire a scandire i parametri (di default pari a 1)
  • nmax: indice massimo a cui è possibile arrivare con i parametri (se non precisato è illimitato)
  • nobbligatori = l'indice minimo che deve essere valutato anche in presenza di buchi nella sequenza (come indice massimo sarà comunque valutato "nmax")
  • baseIndex: valore dell'indice parametrico che coincide con il parametro senza indice (normalmente è 1, quindi i parametri "par1" e "par" sono equivalenti; se per esempio viene impostato a 0 allora è "par0" che sarà equivalente a "par")
  • lista: parametro a cui è possibile assegnare uno tra i seguenti valori.
    puntata - formatta l'elenco di valori come una lista puntata (i valori di "separatore" e "congiunzione" sono ignorati)
    ordinata - formatta l'elenco di valori come una lista numerata (i valori di "separatore" e "congiunzione" sono ignorati)
    infobox - formatta l'elenco di valori come una lista puntata (i valori di "separatore" e "congiunzione" sono ignorati), eccetto che nel caso in cui ci sia un solo elemento
Esempi di chiamata
{{#invoke:string|arraytostring|par1=var#|separatore= |congiunzione= e }}
Formatta una lista di parametri "var1", "var2" ... "varn" separandoli con una virgola, tranne per gli ultimi due uniti dalla congiunzione " e "
{{#invoke:string|arraytostring|par1=disegnatore #|par2=disegnatore # nota|msg = $1 <small>$2</small>|lista=infobox}}
Formatta coppie di parametri "disegnatore 1", "disegnatore 2" ... "disegnatore n" e "disegnatore 1 nota", "disegnatore 2 nota" ... "disegnatore n nota". Ogni coppia sarà formattata come "Disegnatore disegnatore nota" e queste saranno unite in una lista puntata. Usata in {{Personaggio}} per formattare le liste di disegnatori/autori/editori, ecc...
{{#invoke:String|arraytostring|par1=#|msg=''$1''|separatore=<nowiki>|</nowiki>|Nmin=2}}
Unisce i parametri ordinali "2", "3" ... "n" in una lista separate da "|". Ogni valore viene reso in corsivo. Usata in {{tl}} per formattare la lista opzionale di parametri.

collate

Questa funzione restituisce la stringa privata degli eventuali segni diacritici sulle lettere dell'alfabeto latino. Trasforma ad esempio "Çịàö" in "Ciao", preferibile ad esempio per gli ordinamenti alfabetici.

Uso
  • {{#invoke:String|collate|stringa}}
Parametri
  • stringa: La stringa da cui togliere i segni

decode

Questa funzione accetta una stringa codificata con il sistema a percentuali usato negli URL e restituisce la stringa decodificata. Fa quindi l'opposto della funzione di sistema urlencode. Trasforma ad esempio "Come%20va%3F" in "Come va?".

Uso
  • {{#invoke:String|decode|stringa}}
Parametri
  • stringa: La stringa da decodificare

titolo_alfa

Questa funzione accetta una stringa che corrisponde a un titolo di opera e restituisce la stringa adattata all'ordinamento alfabetico. Trasforma ad esempio "La pietà" in "Pieta, La". Non funziona sempre, non potendo capire il significato delle parole, ma risolve automaticamente la maggior parte dei casi.

Uso
  • {{#invoke:String|titolo_alfa|titolo}}
Parametri
  • titolo: Il titolo di opera. Di default viene preso il titolo della pagina in cui ci si trova.

Unit test

Unit test per questo modulo sono disponibili a Modulo:String/test, per la loro esecuzione visitare Discussioni_modulo:String/test.

Documentazione sui pattern Lua

Diverse funzioni fanno uso di pattern Lua, questi sono una forma di espressione regolare, per maggiori informazioni sulla loro sintassi vedi:


--[[  Questo modulo serve a fornire l'accesso alle funzioni stringa base.  La maggior parte delle funzioni di questo modulo possono essere invocate con parametri con nome, senza nome o con un misto di entrambi. Quando vengono usati parametri con nome il software di Mediawiki rimuoverà ogni spazio iniziale o finale dal parametro. A seconda dell'uso che si vuole fare della funzione può essere vantaggioso conservare oppure rimuovere questi spazi.  Opzioni globali  ignore_errors: se settato a 'true' o 1, ogni condizione di errore ritornerà una stringa vuota  piuttosto che un messaggio di errore.   error_category: nel caso si verifichi un errore è il nome di una categoria da includere  insieme al messaggio di errore. La categoria di default  [Categoria:Errori del Module String]. (TODO:verificare)   no_category: Se settato a 'true' o 1, non verranno aggiunte categorie in caso di errore.  Unit tests per questo modulo sono disponibili a Module:String/test.  Diverse funzioni fanno uso di pattern Lua, questi sono una forma di espressione regolare, per maggiori informazioni vedi: * http://www.lua.org/manual/5.1/manual.html#5.4.1 * http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns * http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns  ]]  local str = {}  --[[ len  Questa funzione ritorna la lunghezza di una stringa.  Uso: {{#invoke:String|len|stringa|}} O {{#invoke:String|len|s=stringa}}  Parametri  s: La stringa di cui ritornare la lunghezza  Se invocata usando parametri nominati, Mediawiki rimuoverà automaticamente ogni spazio iniziale o finale dalla stringa. ]] function str.len( frame )  local new_args = str._getParameters( frame.args, {'s'} );  local s = new_args['s'] or '';  return mw.ustring.len( s ) end  --[[ sub  Questa funzione ritorna la sottostringa di una stringa bersaglio, come indicato dagli indici  Uso: {{#invoke:String|sub|stringa_bersaglio|indice_iniziale|indice_finale}} O {{#invoke:String|sub|s=stringa_bersaglio|i=indice_iniziale|j=indice_finale}}  Parameters  s: La stringa da cui estrarre una sottostringa  i: La posizione iniziale del primo carattere della sottostringa da ritornare, se non  specificato è 1.  j: La posizione finale dell'ultimo carattere della sottostringa da ritornare, se non  specificato corrisponde alla lunghezza della stringa_bersaglio (l'ultimo carattere).  I caratteri della stringa sono numerati a partire da 1. Se i o j hanno un valore negativo allora contano la posizione contando dalla fine della stringa, -1 è l'ultimo carattere della stringa, -2 il penultimo, ecc...  Se le posizioni sono al di fuori degli estremi della stringa viene ritornato un messaggio di errore. ]] function str.sub( frame )  local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } );  local s = new_args['s'] or '';  local i = tonumber( new_args['i'] ) or 1;  local j = tonumber( new_args['j'] ) or -1;   local len = mw.ustring.len( s );   -- Convert negatives for range checking  if i < 0 then  i = len + i + 1;  end  if j < 0 then  j = len + j + 1;  end   if i > len or j > len or i < 1 or j < 1 then  return str._error( 'Indici fuori dagli estremi della stringa' );  end  if j < i then  return str._error( 'Indici in ordine sbagliato' );  end   return mw.ustring.sub( s, i, j ) end  --[[ Questa funzione implementa tutte le caratteristiche di {{str sub}} e viene mantenuta per motivi di compatibilità con template più vecchi. ]] function str.sublength( frame )  local i = tonumber( frame.args.i ) or 0  local len = tonumber( frame.args.len )  return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) ) end  --[[ match  Questa funzione ritorna dalla stringa bersaglio una sottostringa corrispondente a un pattern specificato.  Uso: {{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}} O {{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index  |match=match_number|plain=plain_flag|nomatch=nomatch_output}}  Parametri  s: La stringa da cercare  pattern: Il pattern da cercare nella stringa  start: La posizione iniziale da cui iniziare la ricerca, se non specificato è 1.  match: Se c'è ci sono corrispondenze multiple quale ritornare, 1 per la prima  corrispondenza, 2 per la seconda ecc.. Un valore negativo indica di contare  all'indietro a partire dall'ultima corrispondenza, quindi match = -1 significa  chiedere l'ultima corrispondenza. Se non specificato è 1  plain: Se vero specifica che il pattern deve essere considerato come una  stringa normale, piuttosto che un pattern Lua. Se non specificata è falsa.  nomatch: Il valore da ritornare se non ci sono corrispondenze, invece di ritornare  un errore.  Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli spazi iniziali e finali. In alcune circostanze questo può essere il comportamento desiderato, in altre si potrebbe volerli conservare.  Se match_number o start_index sono al di fuori degli estremi della stringa s, allora la funzione ritorna un errore. Viene generato un errore anche se il non vengono trovate corrispondenze. Per sopprimere gli errori si può aggiungere il parametro ignore_errors=true, in questo caso in caso di errore verrò ritornata una stringa vuota.  ]] function str.match(frame)  return str._match(frame.args) end  --[[ Entry point per chiamata diretta da un modulo ]] function str._match( args )  local new_args = str._getParameters( args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} );  local s = new_args['s'] or '';  local start = tonumber( new_args['start'] ) or 1;  local plain_flag = str._getBoolean( new_args['plain'] or false );  local pattern = new_args['pattern'] or '';  local match_index = math.floor( tonumber(new_args['match']) or 1 );  local nomatch = new_args['nomatch'];   if s == '' then  return nomatch or str._error( 'La stringa in cui cercare è vuota' );  end  if pattern == '' then  return nomatch or str._error( 'La stringa o pattern da cercare è vuota' );  end  if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then  return nomatch or str._error( 'La posizione iniziale richiesta è fuori dagli estremi della stringa' );  end  if match_index == 0 then  return nomatch or str._error( 'Match index è nullo' );  end  if plain_flag then  pattern = str._escapePattern( pattern );  end   local result  if match_index == 1 then  -- Il caso più semplice, trova la prima corrispondenza  result = mw.ustring.match( s, pattern, start )  else  if start > 1 then  s = mw.ustring.sub( s, start );  end   local iterator = mw.ustring.gmatch(s, pattern);  if match_index > 0 then  -- Ricerca in avanti  for w in iterator do  match_index = match_index - 1;  if match_index == 0 then  result = w;  break;  end  end  else  -- Ricerca all'indietro deve estrarre tutte le corrispondenze  local result_table = {};  local count = 1;  for w in iterator do  result_table[count] = w;  count = count + 1;  end   result = result_table[ count + match_index ];  end  end   if result == nil then  if nomatch == nil then  return str._error( 'Corrispondenza non trovata' );  else  return nomatch;  end  else  return result;  end end  --[[ pos  Questa funzione ritorna il carattere della stringa in posizione pos.  Uso: {{#invoke:String|pos|stringa_bersaglio|indice}} O {{#invoke:String|pos|target=stringa_bersaglio|pos=indice}}  Parametri  target: La stringa in cui cercare  pos: La posizione del carattere da ritornare  Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli spazi iniziali e finali. In alcune circostanze questo può essere il comportamento desiderato, in altre si potrebbe volerli conservare.  I caratteri della stringa sono numerati a partire da 1. Se pos è un valore negativo allora conta la posizione partendo dalla fine della stringa, -1 è l'ultimo carattere della stringa, -2 il penultimo, ecc...  Se la posizione richiesta è 0 o al di fuori degli estremi della stringa viene ritornato un errore. ]] function str.pos( frame )  local new_args = str._getParameters( frame.args, {'target', 'pos'} );  local target_str = new_args['target'] or '';  local pos = tonumber( new_args['pos'] ) or 0;   if pos == 0 or math.abs(pos) > mw.ustring.len( target_str ) then  return str._error( 'Indice della stringa fuori dagli estremi' );  end   return mw.ustring.sub( target_str, pos, pos ); end  --[[ str_find  Questa funzione duplica il comportamento di {{str_find}}, incluso i suoi comportamenti irregolari. Questa funzione è fornita per motivi di compatibilità con i vecchi template, ma SI RACCOMANDA di non utilizzarla in nuovi template. Nello sviluppo di nuovo codice si raccomanda di usare la funzione "find".  Parametri  source: La stringa in cui cercare  target: la stringa da cercare  Ritorna la posizione nella stringa source del primo carattere in cui c'è è stata trovata la stringa target. I caratteri della stringa sono numerati a partire da 1. La funzione ritorna -1 se la stringa "target" non è contenuta in "source".  Nota importante: Per compatibilità con il vecchio template se la stringa "target" è vuota o manca la funzione ritorna un valore di "1" ]] function str.str_find( frame )  local new_args = str._getParameters( frame.args, {'source', 'target'} );  local source_str = new_args['source'] or '';  local target_str = new_args['target'] or '';   if target_str == '' then  return 1;  end   local start = mw.ustring.find( source_str, target_str, 1, true )  if start == nil then  start = -1  end   return start end  --[[ find  Questa funzione permette di cercare una stringa bersaglio o un pattern Lua all'interno di un'altra stringa.  Uso: {{#invoke:String|find|stringa_sorgente|stringa_bersaglio|indice_iniziale|plain_flag}} O {{#invoke:String|find|source=stringa_sorgente|target=stringa_bersaglio|start=indice_iniziale|plain=plain_flag}}  Parametri  source: La stringa in cui cercare  target: La stringa o pattern Lua da cercare  start: La posizione da cui iniziare la ricerca, se non specificato è 1  plain: Se è vero indica che la stringa target deve essere considerata come una  testo normale e non come un pattern Lua, se non specificata è vera  Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli spazi iniziali e finali. In alcune circostanze questo può essere il comportamento desiderato, in altre si potrebbe volerli conservare.  Questa funzione ritorna la prima posizione maggiore o uguale a "start" a partire dalla quale "target" si trova in "source". I caratteri della stringa sono numerati a partire da 1. Se "target" non viene trovato ritorna 0. Se "source" o "target" sono mancanti o vuoti ritorna 0.  Questa funzione dovrebbe essere sicura per stringhe UTF-8. ]] function str.find( frame )  local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } );  local source_str = new_args['source'] or '';  local pattern = new_args['target'] or '';  local start_pos = tonumber(new_args['start']) or 1;  local plain = new_args['plain'] or true;   if source_str == '' or pattern == '' then  return 0;  end   plain = str._getBoolean( plain );   local start = mw.ustring.find( source_str, pattern, start_pos, plain )  if start == nil then  start = 0  end   return start end  --[[ replace  Questa funzione permette di rimpiazzare una stringa o pattern bersaglio con un'altra stringa.  Uso: {{#invoke:String|replace|stringa_sorgente|stringa_pattern|nuova_stringa|numero_di_sostituzioni|plain_flag}} O {{#invoke:String|replace|source=stringa_sorgente|pattern=stringa_pattern|replace=nuova_stringa|  count=numero_di_sostituzioni|plain=plain_flag}}  Parametri:  source: La stringa da cercare  pattern: La stringa o pattern Lua da trovare in source  replace: Il testo di sostituzione  count: Il numero di volte in cui rimpiazzare la stringa, se non specificato tutte.  plain: Se vero indica che il pattern deve essere considerato come testo normale e non  come pattern Lua, il valore di default è vero ]] function str.replace( frame )  local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } );  local source_str = new_args['source'] or '';  local pattern = new_args['pattern'] or '';  local replace = new_args['replace'] or '';  local count = tonumber( new_args['count'] );  local plain = new_args['plain'] or true;   if source_str == '' or pattern == '' then  return source_str;  end  plain = str._getBoolean( plain );   if plain then  pattern = str._escapePattern( pattern );  replace = mw.ustring.gsub( replace, "%%", "%%%%" ); --Only need to escape replacement sequences.  end   local result;   if count ~= nil then  result = mw.ustring.gsub( source_str, pattern, replace, count );  else  result = mw.ustring.gsub( source_str, pattern, replace );  end   return result; end  --[[  Funzione per utilizzare string.rep in un template. ]]  function str.rep( frame )  local repetitions = tonumber( frame.args[2] )  if not repetitions then  if frame.args[2] == '' then -- se il secondo parametro è una stringa nulla ritorno una stringa nulla  return ''  else  return str._error( 'la funzione rep si aspetta un secondo parametro con il numero di ripetizioni, ricevuto "' .. ( frame.args[2] or '' ) .. '"' )  end  end  return mw.ustring.rep( frame.args[1] or '', repetitions ) end  --[[  Funzione per decodificare una stringa codificata percentualmente.  Richiama la funzione mw.uri.decode di scribunto, vedi  https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#mw.uri.decode ]]  function str.decode( frame )  local valid_enctype = { QUERY = true, WIKI = true, PATH = true}   local new_args = str._getParameters(frame.args, {'source', 'enctype'})  local source = new_args['source'] or ''  local enc_type = new_args['enctype'] or 'QUERY'  if not valid_enctype[enc_type] then  enc_type = 'QUERY'  end  return mw.uri.decode(source, enc_type) end  --[[  Funzione per semplificare stringhe con diacritici ]]  function str.collate( frame )   local collation = {   {'[áàăắằẵẳâấầẫẩǎåǻäǟãȧǡąāảȁȃạặậḁⱥᶏᴂæɐᶐɒə]', 'a'},  {'[ÁÀĂẮẰẴẲÂẤẦẪẨǍÅÅǺÄǞÃȦǠĄĀẢȀȂẠẶẬḀȺᴁÆƏ]', 'A'},  {'[ḃḅḇƀɓ]', 'b'},  {'[ḂḄḆɃ]', 'B'},  {'[ćĉčċçḉȼƈ]', 'c'},  {'[ĆĈČĊÇḈȻƇ]', 'C'},  {'[đḍḓḏðďḋḑ]', 'd'},  {'[ĐḌḒḎÐĎḊḐ]', 'D'},  {'[éèĕěêếềễểëẽėȩḝęēḗḕẻȅȇẹệḙḛǝ]', 'e'},  {'[ÉÈĔĚÊẾỀỄỂËẼĖȨḜĘĒḖḔẺȄȆẸỆḘḚƎ]', 'E'},  {'[ḟⅎ]', 'f'},  {'[ḞℲ]', 'F'},  {'[ǵğĝǧġģḡᵹɠ]', 'g'},  {'[ǴĞĜǦĠĢḠƓ]', 'G'},  {'[ĥȟḧḣḩħḥḫẖ]', 'h'},  {'[ĤȞḦḢḨĦḤḪ]', 'H'},  {'[íìĭîǐïḯĩįīỉȉȋịḭı]', 'i'},  {'[ÍÌĬÎǏÏḮĨĮĪỈȈȊỊḬİ]', 'I'},  {'[ĵǰ]', 'j'},  {'[Ĵ]', 'J'},  {'[ḱǩķ]', 'k'},  {'[ḰǨĶ]', 'K'},  {'[ĺľļłḷḹḽḻl·l·ŀƚⱡ]', 'l'},  {'[ĹĽĻŁḶḸḼḺL·L·ĿȽⱠ]', 'L'},  {'[ḿṁṃ]', 'm'},  {'[ḾṀṂ]', 'M'},  {'[ńǹňñṅņṇṋṉ]', 'n'},  {'[ŃǸŇÑṄŅṆṊṈ]', 'N'},  {'[óòŏốồỗổǒôöȫőõṍṏȭȯȱøǿǫǭōṓṑỏȍȏơớờỡởợọộœ]', 'o'},  {'[ÓÒŎỐỒỖỔǑÔÖȪŐÕṌṎȬȮȰØǾǪǬŌṒṐỎȌȎƠỚỜỠỞỢỌỘŒ]', 'O'},  {'[ṕṗ]', 'p'},  {'[ṔṖ]', 'P'},  {'[ŕřṙŗȑȓṛṝṟ]', 'r'},  {'[ŔŘṘŖȐȒṚṜṞ]', 'R'},  {'[śṥŝṧṡşṣṩșšß]', 's'},  {'[ŚṤŜṦṠŞṢṨȘŠ]', 'S'},  {'[ťṫẗţṭțṱṯ]', 't'},  {'[ŤṪŢṬȚṰṮ]', 'T'},  {'[úùŭûǔůüǘǜǚǖűũṹųūṻủȕȗưứừữửựụṳṷṵʉ]', 'u'},  {'[ÚÙŬÛǓŮÜǗǛǙǕŰŨṸŲŪṺỦȔȖƯỨỪỮỬỰỤṲṶṴɄ]', 'U'},  {'[ṽṿʋ]', 'v'},  {'[ṼṾƲ]', 'V'},  {'[ẃẁŵẘẅẇẉⱳ]', 'w'},  {'[ẂẀŴ̊ẄẆẈⱲ]', 'W'},  {'[ýỳŷẙÿỹẏȳỷỵɏƴ]', 'y'},  {'[ÝỲŶ̊ŸỸẎȲỶỴɎƳ]', 'Y'},  {'[źẑžżẓẕƶȥʐⱬ]', 'z'},  {'[ŹẐŽŻẒẔƵȤʐⱫ]', 'Z'},  }   local new_args = str._getParameters(frame.args, {'source'})  local source = new_args['source'] or ''  --local source = mw.ustring.toNFC(source)   for _, el in ipairs(collation) do  source = mw.ustring.gsub( source, el[1], el[2])  end  return source end  --[[  Funzione per estrarre da un titolo la stringa adatta all'ordinamento alfabetico.  ]]  function str.titolo_alfa(frame)  -- Evito "I", "A", "Die"... che darebbero molte false corrispondenze in lingue diverse  local articoli = {"Il ", "Lo ", "La ", "L'", "Gli ", "Le ", "Un ", "Uno ", "Una ", "Un'", "The ", "An ", "Les ", "El ", "Los ", "Las ", "Der ", "Das "}   local source = frame.args[1]  if not source or source == '' then  source = mw.title.getCurrentTitle().text   end  if not source or source == '' then  return ''  end  source = mw.ustring.gsub(source, ' %(.*%)$', '')  source = str.collate( { args = { source } } )  source = mw.ustring.gsub(source, "^['%(%.¡¿ ]*", '')  for _,article in ipairs(articoli) do  source = mw.ustring.gsub(source, "^(" .. article .. ")(.*)$", "%2, %1")  end  source = mw.ustring.gsub(source, '^%l', mw.ustring.upper)  source = mw.text.trim(source)  return source end   -- ================================================================= -- Classe per gestire i parametri -- ================================================================= local Param = {} Param.__index = Param  function Param.new(par_name, alt_name)  if par_name ~= "$index" and not mw.ustring.find(par_name, '#') then par_name = par_name .. '#' end;  return setmetatable({  name = par_name,  base_name = mw.ustring.gsub(par_name, ' ?#', '', 1),  alt = alt_name  }, Param) end  function Param:get_other_value(args, index)  if self.name == '$index' then  return tostring(index), true  else  return args[mw.ustring.gsub(self.name, '#', tostring(index), 1)] or '', false  end end  function Param:get_first_value(args, index, base_index)  function value_or_nil (s)  if s and s ~= '' then return s end  return nil  end   if self.name == '$index' then  return tostring(index), true  end  if index == base_index then  return value_or_nil(args[mw.ustring.gsub(self.name, '#', tostring(index), 1)]) or  value_or_nil(args[self.base_name]) or value_or_nil(args[self.alt]) or '', false  else  return value_or_nil(args[mw.ustring.gsub(self.name, '#', tostring(index), 1)]) or  value_or_nil(args[self.alt]) or '', false  end end   setmetatable(Param, { __call = function(_, ...) return Param.new(...) end }) -- ================================================================= -- fine dichiarazione classe per parametro -- =================================================================  -- ================================================================= -- Classe per gestire il messaggio  -- ================================================================= local Message = {} Message.__index = Message  function Message.new(msg)  -- converto parentesi graffe che sono state precedute da "\"  msg = mw.ustring.gsub(msg, '\\{', '{')  msg = mw.ustring.gsub(msg, '\\}', '}')  local frame = mw.getCurrentFrame():getParent() or mw.getCurrentFrame()   return setmetatable({  msg = msg,  values = {},  frame = frame,  }, Message) end  function Message:reset_values()  self.values = {} end  function Message:add_value(value)  self.values[#self.values+1] = value end  function Message:text()  return self.frame:preprocess(mw.message.newRawMessage(self.msg, self.values):plain()) end  setmetatable(Message, { __call = function(_, ...) return Message.new(...) end }) -- ================================================================= -- fine dichiarazione classe per messaggio -- =================================================================    --[[  Funzione per unire una o più liste di valori in una stringa.  Uso: {{#invoke:String|arraytostring|par1=xxx|par2=xxx....|parn=xxxx|msg=msg|separator=|congiunzione=|pre=|post=|lista=}}  Parametri:  par1...parn: i nomi base dei parametri da inserire nel messsaggio, devono contenere il carattere '#' che precisa la  posizione in cui inserire l'indice. Se viene valorizzato a '$index' avrà automaticamente il valore del  contatore.  msg: il messaggio (cioè la riga unitaria) in cui eventuali caratteri '{', '}' dovranno essere  preceduti da '\', mentre una "|" dovrà essere inserita con il template {{!}}.  I valori da sostituire sono da inserire come $n ($1 sarà sostituito dal  valore di par1, $2 dal valore di par2, ecc...)  separatore: La stringa da inserire tra ogni valore  congiunzione: La stringa da inserire invece di separatore tra l'ultimo e il penultimo valore. Se  non precisato viene usato il valore di separatore  pre: eventuale stringa che precede l'unione delle stringhe  post: eventuale stringa che segue l'unione delle stringhe  indentazione: una stringa da ripetere cumulativamente per ogni messaggio (tipicamente '&nbsp')  lista: se valorizzata a:  'puntata' imposta i parametri per una lista puntata  'ordinata' imposta i parametri per una lista ordinata  'infobox' imposta l'unione come una lista, eccetto che nel caso ci sia  solo un elemento  Se lista è valorizzata separatore/congiunzione/pre/post sono ignorati, salvo il caso di 'infobox' e la  lista contenga solo un elemento.  nmin = indice iniziale da cui partire a scandire i parametri (di default pari a 1)  nmax = indice massimo a cui arrivare con i parametri (se non precisato illimitato)  nobbligatori = l'indice minimo che deve essere valutato anche in presenza di buchi nella sequenza (comunque l'indice massimo  che viene valutato è nmax)  baseIndex = valore dell'indice che può essere sostituito da stringa nulla (default = 1)  Esempi di chiamata:  {{#invoke:string:arraytostring|par1=var#|separatore=,|congiunzione=#32;e#32;}}  {{#invoke:string:arraytostring|par1=disegnatore #|par2=disegnatore # nota|msg = $1 <small>$2</small>|lista=infobox }}  {{#invoke:string:arraytostring|par1=editore #|par2=etichetta #|par3=editore # nota| msg=$1 \{\{#if:$2{{!}}$2 <small>$3</small>\}\}|lista=infobox }}  ]] function str.arraytostring(frame)   local base_args = frame.args  local params = {}  if not base_args then return str._error('Lista parametri vuota') end  -- carico la lista dei parametri  local index = 1  while true do  local par_name = base_args['par' .. index] or (index == 1 and base_args['par']) or ''  if par_name == '' then break end  --carico eventuale nome alternativo per il primo parametro  local alt_name = base_args['altpar' .. index] or (index == 1 and base_args['altpar']) or nil  params[index] = Param(par_name, alt_name)  index = index + 1  end  --carico il messaggio  local msg = base_args.msg or '$1'  --if msg == '' then return str._error('Manca il messaggio da riprodurre.') end  local message = Message(msg)  elements = {}  -- carico gli altri parametri di formattazione  local Nmax = tonumber(base_args.Nmax) or tonumber(base_args.nmax) or 0  local base_index = tonumber(base_args.baseindex) or tonumber(base_args.baseIndex) or 1  local index = tonumber(base_args.Nmin) or tonumber(base_args.nmin) or base_index  local Nobbligatori = tonumber(base_args.Nobbligatori) or tonumber(base_args.nobbligatori) or base_index-1  local indentazione = base_args.indentazione or nil  local args = frame:getParent().args  -- estraggo il primo valore  local found = false   for i, param in ipairs(params) do  local v, is_index = param:get_first_value(args, index, base_index)  if (not(is_index) or base_index<=Nobbligatori) and v ~= '' then found = true end  message:add_value(mw.text.trim(v))  end  if found then  elements[#elements+1] = message:text()  index = index + 1  end  -- elaboro i valori successivi  while true do  if Nmax > 0 and index > Nmax then break end  message:reset_values()  found = false  for i, param in ipairs(params) do  local v, is_index = param:get_other_value(args, index)  if (not(is_index) or index<=Nobbligatori) and v ~= '' then found = true end  message:add_value(mw.text.trim(v))  end  if found then  elements[#elements+1] = message:text()  elseif index >= Nobbligatori then  break  end  index = index + 1  end  if #elements == 0 then return '' end  -- carico separatori, congiunzione, pre e postazione  local pre, post, separatore, congiunzione, indent = '', '', '', '', ''  local lista = base_args.lista or ''  if lista == 'puntata' or (lista =='infobox' and #elements >1) then  pre = '<UL><LI>'  post = '</LI>\n</UL>'  separatore = '</LI>\n<LI>'  congiunzione = separatore  elseif lista == 'ordinata' then  pre = '<OL><LI>'  post = '</LI>\n</OL>'  separatore = '</LI>\n<LI>'  congiunzione = separatore  else  pre = base_args.pre or ''  post = base_args.post or ''  separatore = base_args.separatore or ''  congiunzione = base_args.congiunzione or separatore  end  if indentazione then  local current_indentazione = indentazione  for i, msg in ipairs(elements) do  elements[i] = current_indentazione .. elements[i]  current_indentazione = current_indentazione .. indentazione   end  end  return pre .. mw.text.listToText(elements, separatore, congiunzione) .. post end  --[[  Funzione per unire una lista di valori in una stringa.  Uso: {{#invoke:String|listtostring|par_number=xxx|msg=msg|separator=|congiunzione=|pre=|post=|lista=}}  Parametri:  par_number: il numero di parametri che compongono il messaggio  msg: il messaggio (cioè la riga unitaria) in cui eventuali caratteri '{', '}' dovranno essere  preceduti da '\', mentre una "|" dovrà essere inserita con il template {{!}}.  I valori da sostituire sono da inserire come $n (nel primo messaggio $1 sarà sostituito dal parametro posizionale di  posizione Nmin, $2 da Nmin+2, ecc...., nel secondo messaggio $1 sarà sostituito dal parametro posizionale Nmin+par_number,  $2 da Nmin+par_number+2, ec....)  valore di par1, $2 dal valore di par2, ecc...)  separatore: La stringa da inserire tra ogni valore  congiunzione: La stringa da inserire invece di separatore tra l'ultimo e il penultimo valore. Se  non precisato viene usato il valore di separatore  pre: eventuale stringa che precede l'unione delle stringhe  post: eventuale stringa che segue l'unione delle stringhe  lista: se valorizzata a:  'puntata' imposta i parametri per una lista puntata  'ordinata' imposta i aprametri per una lista ordinata  'infobox' imposta l'unione come una lista, eccetto che nel caso ci sia  solo un elemento  Se lista è valorizzata separatore/congiunzione/pre/post sono ignorati, salvo il caso di 'infobox' e la  lista contenga solo un elemento.  nmax = indice massimo a cui arrivare con i parametri (se non precisato illimitato)  nobbligatori = l'indice minimo che deve essere valutato anche in presenza di buchi nella sequenza (comunque l'indice massimo  che viene valutato è nmax)  baseIndex = valore del primo parametro posizionale da cui cominciare a leggere (default = 1)  ]]   function str.listtostring(frame)   local base_args = frame.args  local params = {}  if not base_args then return str._error('Lista parametri vuota') end  -- carico la lista dei parametri  local base_index = tonumber(base_args.base_index) or 1  local par_number = tonumber(base_args.par_number) or 1  local Nmax = tonumber(base_args.nmax) or 0  local Nobbligatori = tonumber(base_args.nobbligatori) or base_index-1  --carico il messaggio  local message = Message(base_args.msg or '$1')  elements = {}  -- carico gli altri parametri di formattazione  local index = base_index  local args = frame:getParent().args  -- elaboro i valori successivi  local found = true  while true do  if Nmax > 0 and index > Nmax then break end  message:reset_values()  found = false  for i = index, index+par_number-1 do  message:add_value(args[i] or '')  if args[i] then  found = true  end  end  if found then   elements[#elements+1] = message:text()  elseif index > Nobbligatori then  break  end  index = index + par_number  end  if #elements == 0 then return '' end  -- carico separatori, congiunzione, pre e postazione  local pre, post, separatore, congiunzione = '', '', '', ''  local lista = base_args.lista or ''  if lista == 'puntata' or (lista =='infobox' and #elements >1) then  pre = '<UL><LI>'  post = '</LI>\n</UL>'  separatore = '</LI>\n<LI>'  congiunzione = separatore  elseif lista == 'ordinata' then  pre = '<OL><LI>'  post = '</LI>\n</OL>'  separatore = '</LI>\n<LI>'  congiunzione = separatore  else  pre = base_args.pre or ''  post = base_args.post or ''  separatore = base_args.separatore or ''  congiunzione = base_args.congiunzione or separatore  end  return pre .. mw.text.listToText(elements, separatore, congiunzione) .. post end  --[[ Funzione di aiuto che popola la lista di argomenti, dato che l'utente può voler utilizzare sia parametri nominati che non nominati. Questo è rilevante perchè gli spazi iniziali iniziali e finali dei parametri nominati sono eliminati, mentre quelli dei parametri non nominati non lo sono. Secondo l'applicazione si potrebbe a volte conservare o rimuovere gli spazi. ]] function str._getParameters( frame_args, arg_list )  local new_args = {};  local index = 1;  local value;   for i,arg in ipairs( arg_list ) do  value = frame_args[arg]  if value == nil then  value = frame_args[index];  index = index + 1;  end  new_args[arg] = value;  end   return new_args; end  --[[ Funzione di appoggio per gestire i messaggi di errore. ]] function str._error( error_str )  local frame = mw.getCurrentFrame();  local error_category = frame.args.error_category or 'Errori riportati dal modulo String';  local ignore_errors = frame.args.ignore_errors or false;  local no_category = frame.args.no_category or false;   if str._getBoolean(ignore_errors) then  return '';  end   local error_str = '<strong class="error">Errore nel modulo String: ' .. error_str .. '</strong>';  if error_category ~= '' and not str._getBoolean( no_category ) then  error_str = '[[Categoria:' .. error_category .. ']]' .. error_str;  end   return error_str; end  --[[ Funzione di appoggio per interpretare le stringhe come valori booleane ]] function str._getBoolean( boolean_str )  local boolean_value;   if type( boolean_str ) == 'string' then  boolean_str = boolean_str:lower();  if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'  or booleean_str == 'falso' or boolean_str == '' then  boolean_value = false;  else  boolean_value = true;  end  elseif type( boolean_str ) == 'boolean' then  boolean_value = boolean_str;  else  error('Nessun valore booleano trovato' );  end  return boolean_value end  --[[ Funzione di appoggio per aggiungere un carattere di escape a tutti i caratteri speciali, così da trattare una stringa come testo normale e non come pattern di Lua. ]] function str._escapePattern( pattern_str )  return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" ); end  return str  -- Version history: -- 29/3/2013 traduzione iniziale da en:module:String versione 540627185 del 26 febbraio 2013 -- 07/05/2013 aggiunta funzione rep da en:module:String versione 552254999 del 26 aprile 2013 -- 19/08/2013 aggiunta funzione arraytostring