Vai al contenuto

Modulo:String

Da Wikizionario, il dizionario a contenuto aperto.

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 datemplate,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 templatew:template:Str lensu Wikipedia

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 dei 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. Seiojhanno 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 unpatternspecificato.

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 stringas
  • 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, quindimatch= -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.

Sematchostartsono al di fuori degli estremi della stringas,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 parametroignore_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. Seposè 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 è 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 funzionefind.

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

Restituisce la posizione nella stringasourcedel primo carattere in cui è stata trovata la stringatarget.I caratteri della stringa sono numerati a partire da 1. La funzione restituisce -1 se la stringatargetnon è contenuta insource.

Nota importante: Per compatibilità con il vecchio template, se la stringatargetè 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 stringatargetdeve 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 astarta partire dalla qualetargetsi trova insource.I caratteri della stringa sono numerati a partire da 1. Setargetnon viene trovato dà 0. Sesourceotargetsono 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 insource
  • 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 eventuali caratteri" { "e" } "dovranno essere preceduti da un" \ ", mentre il carattere" | "dovrà essere inserito con la costante {{!}}. Un eventuale" \} "finale deve sempre essere staccato, con spazio o altro, dal" }} "di fine comando.
  • separatore:una stringa (opzionale) da inserire tra ogni valore
  • congiunzione:una stringa (opzionale) da inserire al posto delseparatoretra 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 ordinata (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"... "disegnatoren"e" disegnatore 1 nota "," disegnatore 2 nota "..." disegnatorennota ". Ogni coppia sarà formattata come" Disegnatoredisegnatore nota"e queste saranno unite in una lista puntata.
{{#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 sistemaurlencode.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 testper questo modulo sono disponibili aModulo:String/test,per la loro esecuzione visitareDiscussioni_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:// lua.org/manual/5.1/manual.html#5.4.1
* http:// mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
* http:// mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns

]]

localstr={}

--[[
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.
]]
functionstr.len(frame)
localnew_args=str._getParameters(frame.args,{'s'});
locals=new_args['s']or'';
returnmw.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.
]]
functionstr.sub(frame)
localnew_args=str._getParameters(frame.args,{'s','i','j'});
locals=new_args['s']or'';
locali=tonumber(new_args['i'])or1;
localj=tonumber(new_args['j'])or-1;

locallen=mw.ustring.len(s);

-- Convert negatives for range checking
ifi<0then
i=len+i+1;
end
ifj<0then
j=len+j+1;
end

ifi>lenorj>lenori<1orj<1then
returnstr._error('Indici fuori dagli estremi della stringa');
end
ifj<ithen
returnstr._error('Indici in ordine sbagliato');
end

returnmw.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.
]]
functionstr.sublength(frame)
locali=tonumber(frame.args.i)or0
locallen=tonumber(frame.args.len)
returnmw.ustring.sub(frame.args.s,i+1,lenand(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.

]]
functionstr.match(frame)
returnstr._match(frame.args)
end

--[[
Entry point per chiamata diretta da un modulo
]]
functionstr._match(args)
localnew_args=str._getParameters(args,{'s','pattern','start','match','plain','nomatch'});
locals=new_args['s']or'';
localstart=tonumber(new_args['start'])or1;
localplain_flag=str._getBoolean(new_args['plain']orfalse);
localpattern=new_args['pattern']or'';
localmatch_index=math.floor(tonumber(new_args['match'])or1);
localnomatch=new_args['nomatch'];

ifs==''then
returnnomatchorstr._error('La stringa in cui cercare è vuota');
end
ifpattern==''then
returnnomatchorstr._error('La stringa o pattern da cercare è vuota');
end
ifmath.abs(start)<1ormath.abs(start)>mw.ustring.len(s)then
returnnomatchorstr._error('La posizione iniziale richiesta è fuori dagli estremi della stringa');
end
ifmatch_index==0then
returnnomatchorstr._error('Match index è nullo');
end
ifplain_flagthen
pattern=str._escapePattern(pattern);
end

localresult
ifmatch_index==1then
-- Il caso più semplice, trova la prima corrispondenza
result=mw.ustring.match(s,pattern,start)
else
ifstart>1then
s=mw.ustring.sub(s,start);
end

localiterator=mw.ustring.gmatch(s,pattern);
ifmatch_index>0then
-- Ricerca in avanti
forwiniteratordo
match_index=match_index-1;
ifmatch_index==0then
result=w;
break;
end
end
else
-- Ricerca all'indietro deve estrarre tutte le corrispondenze
localresult_table={};
localcount=1;
forwiniteratordo
result_table[count]=w;
count=count+1;
end

result=result_table[count+match_index];
end
end

ifresult==nilthen
ifnomatch==nilthen
returnstr._error('Corrispondenza non trovata');
else
returnnomatch;
end
else
returnresult;
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.
]]
functionstr.pos(frame)
localnew_args=str._getParameters(frame.args,{'target','pos'});
localtarget_str=new_args['target']or'';
localpos=tonumber(new_args['pos'])or0;

ifpos==0ormath.abs(pos)>mw.ustring.len(target_str)then
returnstr._error('Indice della stringa fuori dagli estremi');
end

returnmw.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"
]]
functionstr.str_find(frame)
localnew_args=str._getParameters(frame.args,{'source','target'});
localsource_str=new_args['source']or'';
localtarget_str=new_args['target']or'';

iftarget_str==''then
return1;
end

localstart=mw.ustring.find(source_str,target_str,1,true)
ifstart==nilthen
start=-1
end

returnstart
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.
]]
functionstr.find(frame)
localnew_args=str._getParameters(frame.args,{'source','target','start','plain'});
localsource_str=new_args['source']or'';
localpattern=new_args['target']or'';
localstart_pos=tonumber(new_args['start'])or1;
localplain=new_args['plain']ortrue;

ifsource_str==''orpattern==''then
return0;
end

plain=str._getBoolean(plain);

localstart=mw.ustring.find(source_str,pattern,start_pos,plain)
ifstart==nilthen
start=0
end

returnstart
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
]]
functionstr.replace(frame)
localnew_args=str._getParameters(frame.args,{'source','pattern','replace','count','plain'});
localsource_str=new_args['source']or'';
localpattern=new_args['pattern']or'';
localreplace=new_args['replace']or'';
localcount=tonumber(new_args['count']);
localplain=new_args['plain']ortrue;

ifsource_str==''orpattern==''then
returnsource_str;
end
plain=str._getBoolean(plain);

ifplainthen
pattern=str._escapePattern(pattern);
replace=mw.ustring.gsub(replace,"%%","%%%%");--Only need to escape replacement sequences.
end

localresult;

ifcount~=nilthen
result=mw.ustring.gsub(source_str,pattern,replace,count);
else
result=mw.ustring.gsub(source_str,pattern,replace);
end

returnresult;
end

--[[
Funzione per utilizzare string.rep in un template.
]]

functionstr.rep(frame)
localrepetitions=tonumber(frame.args[2])
ifnotrepetitionsthen
ifframe.args[2]==''then-- se il secondo parametro è una stringa nulla ritorno una stringa nulla
return''
else
returnstr._error('la funzione rep si aspetta un secondo parametro con il numero di ripetizioni, ricevuto "'..(frame.args[2]or'')..' "')
end
end
returnmw.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:// mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#mw.uri.decode
]]

functionstr.decode(frame)
localvalid_enctype={QUERY=true,WIKI=true,PATH=true}

localnew_args=str._getParameters(frame.args,{'source','enctype'})
localsource=new_args['source']or''
localenc_type=new_args['enctype']or'QUERY'
ifnotvalid_enctype[enc_type]then
enc_type='QUERY'
end
returnmw.uri.decode(source,enc_type)
end

--[[
Funzione per semplificare stringhe con diacritici
]]

functionstr.collate(frame)

localcollation={
{'[áàăắằẵẳâấầẫẩǎåǻäǟãȧǡąāảȁȃạặậḁⱥᶏᴂɐᶐɒ]','a'},
{'[ÁÀĂẮẰẴẲÂẤẦẪẨǍÅÅǺÄǞÃȦǠĄĀẢȀȂẠẶẬḀȺᴁ]','A'},
{'[ḃḅḇbƀɓ]','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'},
}

localnew_args=str._getParameters(frame.args,{'source'})
localsource=new_args['source']or''
--local source = mw.ustring.toNFC(source)

for_,elinipairs(collation)do
source=mw.ustring.gsub(source,el[1],el[2])
end
returnsource
end

--[[
Funzione per estrarre da un titolo la stringa adatta all'ordinamento alfabetico.
]]

functionstr.titolo_alfa(frame)
-- Evito "I", "A", "Die"... che darebbero molte false corrispondenze in lingue diverse
localarticoli={"Il","Lo","La","L'","Gli","Le","Un","Uno","Una","Un'","The","An","Les","El","Los","Las","Der","Das"}

localsource=frame.args[1]
ifnotsourceorsource==''then
source=mw.title.getCurrentTitle().text
end
ifnotsourceorsource==''then
return''
end
source=mw.ustring.gsub(source,' %(.*%)$','')
source=str.collate({args={source}})
source=mw.ustring.gsub(source,"^['%(%.¡¿ ]*",'')
for_,articleinipairs(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)
returnsource
end


-- =================================================================
-- Classe per gestire i parametri
-- =================================================================
localParam={}
Param.__index=Param

functionParam.new(par_name,alt_name)
ifpar_name~="$index"andnotmw.ustring.find(par_name,'#')thenpar_name=par_name..'#'end;
returnsetmetatable({
name=par_name,
base_name=mw.ustring.gsub(par_name,'?#','',1),
alt=alt_nameor''
},Param)
end

functionParam:get_other_value(args,index)
ifself.name=='$index'then
returntostring(index),true
else
returnargs[mw.ustring.gsub(self.name,'#',tostring(index),1)]or'',false
end
end

functionParam:get_first_value(args,index,base_index)
functionvalue_or_nil(s)
ifsands~=''thenreturnsend
returnnil
end

ifself.name=='$index'then
returntostring(index),true
end
ifindex==base_indexthen
returnvalue_or_nil(args[mw.ustring.gsub(self.name,'#',tostring(index),1)])or
value_or_nil(args[self.base_name])orvalue_or_nil(args[self.alt])or'',false
else
returnvalue_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(_,...)returnParam.new(...)end})
-- =================================================================
-- fine dichiarazione classe per parametro
-- =================================================================

-- =================================================================
-- Classe per gestire il messaggio
-- =================================================================
localMessage={}
Message.__index=Message

functionMessage.new(msg)
-- converto parentesi graffe che sono state precedute da "\"
msg=mw.ustring.gsub(msg,'\\{','{')
msg=mw.ustring.gsub(msg,'\\}','}')
localframe=mw.getCurrentFrame():getParent()ormw.getCurrentFrame()

returnsetmetatable({
msg=msg,
values={},
frame=frame,
},Message)
end

functionMessage:reset_values()
self.values={}
end

functionMessage:add_value(value)
self.values[#self.values+1]=value
end

functionMessage:text()
returnself.frame:preprocess(mw.message.newRawMessage(self.msg,self.values):plain())
end

setmetatable(Message,{__call=function(_,...)returnMessage.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 }}

]]
functionstr.arraytostring(frame)

localbase_args=frame.args
localparams={}
ifnotbase_argsthenreturnstr._error('Lista parametri vuota')end
-- carico la lista dei parametri
localindex=1
whiletruedo
localpar_name=base_args['par'..index]or(index==1andbase_args['par'])or''
ifpar_name==''thenbreakend;
--carico eventuale nome alternativo per il primo parametro
localalt_name=base_args['altpar'..index]or(index==1andbase_args['altpar'])or''
params[index]=Param(par_name,alt_name)
index=index+1
end
--carico il messaggio
localmsg=base_args.msgor'$1'
--if msg == '' then return str._error('Manca il messaggio da riprodurre.') end
localmessage=Message(msg)
elements={}
-- carico gli altri parametri di formattazione
localNmax=tonumber(base_args.Nmax)ortonumber(base_args.nmax)or0
localbase_index=tonumber(base_args.baseindex)ortonumber(base_args.baseIndex)or1
localindex=tonumber(base_args.Nmin)ortonumber(base_args.nmin)orbase_index
localNobbligatori=tonumber(base_args.Nobbligatori)ortonumber(base_args.nobbligatori)orbase_index-1
localindentazione=base_args.indentazioneornil
localargs=frame:getParent().args
-- estraggo il primo valore
localfound=false

fori,paraminipairs(params)do
localv,is_index=param:get_first_value(args,index,base_index)
if(not(is_index)orbase_index<=Nobbligatori)andv~=''thenfound=trueend
message:add_value(v)
end
iffoundthen
elements[#elements+1]=message:text()
index=index+1
end
-- elaboro i valori successivi
whiletruedo
ifNmax>0andindex>Nmaxthenbreakend
message:reset_values()
found=false
fori,paraminipairs(params)do
localv,is_index=param:get_other_value(args,index)
if(not(is_index)orindex<=Nobbligatori)andv~=''thenfound=trueend
message:add_value(v)
end
iffoundthen
elements[#elements+1]=message:text()
elseifindex>=Nobbligatorithen
break
end
index=index+1
end
if#elements==0thenreturn''end
-- carico separatori, congiunzione, pre e postazione
localpre,post,separatore,congiunzione,indent='','','','',''
locallista=base_args.listaor''
iflista=='puntata'or(lista=='infobox'and#elements>1)then
pre='<UL><LI>'
post='</LI>\n</UL>'
separatore='</LI>\n<LI>'
congiunzione=separatore
elseiflista=='ordinata'then
pre='<OL><LI>'
post='</LI>\n</OL>'
separatore='</LI>\n<LI>'
congiunzione=separatore
else
pre=base_args.preor''
post=base_args.postor''
separatore=base_args.separatoreor''
congiunzione=base_args.congiunzioneorseparatore
end
ifindentazionethen
localcurrent_indentazione=indentazione
fori,msginipairs(elements)do
elements[i]=current_indentazione..elements[i]
current_indentazione=current_indentazione..indentazione
end
end
returnpre..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)

]]


functionstr.listtostring(frame)

localbase_args=frame.args
localparams={}
ifnotbase_argsthenreturnstr._error('Lista parametri vuota')end
-- carico la lista dei parametri
localbase_index=tonumber(base_args.base_index)or1
localpar_number=tonumber(base_args.par_number)or1
localNmax=tonumber(base_args.nmax)or0
localNobbligatori=tonumber(base_args.nobbligatori)orbase_index-1
--carico il messaggio
localmessage=Message(base_args.msgor'$1')
elements={}
-- carico gli altri parametri di formattazione
localindex=base_index
localargs=frame:getParent().args
-- elaboro i valori successivi
localfound=true
whiletruedo
ifNmax>0andindex>Nmaxthenbreakend
message:reset_values()
found=false
fori=index,index+par_number-1do
message:add_value(args[i]or'')
ifargs[i]then
found=true
end
end
iffoundthen
elements[#elements+1]=message:text()
elseifindex>Nobbligatorithen
break
end
index=index+par_number
end
if#elements==0thenreturn''end
-- carico separatori, congiunzione, pre e postazione
localpre,post,separatore,congiunzione='','','',''
locallista=base_args.listaor''
iflista=='puntata'or(lista=='infobox'and#elements>1)then
pre='<UL><LI>'
post='</LI>\n</UL>'
separatore='</LI>\n<LI>'
congiunzione=separatore
elseiflista=='ordinata'then
pre='<OL><LI>'
post='</LI>\n</OL>'
separatore='</LI>\n<LI>'
congiunzione=separatore
else
pre=base_args.preor''
post=base_args.postor''
separatore=base_args.separatoreor''
congiunzione=base_args.congiunzioneorseparatore
end
returnpre..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.
]]
functionstr._getParameters(frame_args,arg_list)
localnew_args={};
localindex=1;
localvalue;

fori,arginipairs(arg_list)do
value=frame_args[arg]
ifvalue==nilthen
value=frame_args[index];
index=index+1;
end
new_args[arg]=value;
end

returnnew_args;
end

--[[
Funzione di appoggio per gestire i messaggi di errore.
]]
functionstr._error(error_str)
localframe=mw.getCurrentFrame();
localerror_category=frame.args.error_categoryor'Errori riportati dal modulo String';
localignore_errors=frame.args.ignore_errorsorfalse;
localno_category=frame.args.no_categoryorfalse;

ifstr._getBoolean(ignore_errors)then
return'';
end

localerror_str='<strong class= "error" >Errore nel modulo String: '..error_str..'</strong>';
iferror_category~=''andnotstr._getBoolean(no_category)then
error_str='[[Categoria:'..error_category..']]'..error_str;
end

returnerror_str;
end

--[[
Funzione di appoggio per interpretare le stringhe come valori booleane
]]
functionstr._getBoolean(boolean_str)
localboolean_value;

iftype(boolean_str)=='string'then
boolean_str=boolean_str:lower();
ifboolean_str=='false'orboolean_str=='no'orboolean_str=='0'
orbooleean_str=='falso'orboolean_str==''then
boolean_value=false;
else
boolean_value=true;
end
elseiftype(boolean_str)=='boolean'then
boolean_value=boolean_str;
else
error('Nessun valore booleano trovato');
end
returnboolean_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.
]]
functionstr._escapePattern(pattern_str)
returnmw.ustring.gsub(pattern_str,"([%(%)%.%%%+%-%*%?%[%^%$%]])","%%%1");
end

returnstr

-- 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