Modulo:String: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
rimuovo funzione incompleta e rimpiazzata da Modulo:IP validator
separate annotations for str.match from those for str._match
Riga 1:
--[[
 
This module is intended to provide access to basic string functions.
Questo modulo serve a fornire l'accesso alle funzioni stringa base.
 
Most of the functions provided here can be invoked with named parameters,
La maggior parte delle funzioni di questo modulo possono essere invocate con
unnamed parameters, or a mixture. If named parameters are used, Mediawiki will
parametri con nome, senza nome o con un misto di entrambi. Quando vengono usati
automatically remove any leading or trailing whitespace from the parameter.
parametri con nome il software di Mediawiki rimuoverà ogni spazio iniziale o finale
Depending on the intended use, it may be advantageous to either preserve or
dal parametro. A seconda dell'uso che si vuole fare della funzione può essere
remove such whitespace.
vantaggioso conservare oppure rimuovere questi spazi.
 
Global options
Opzioni globali
ignore_errors: seIf settatoset ato 'true' oor 1, ogniany condizioneerror dicondition errorewill ritorneràresult una stringa vuotain
an empty string being returned rather than an error message.
piuttosto che un messaggio di errore.
 
error_category: nelIf casoan sierror verifichioccurs, unspecifies errorethe èname ilof nomea dicategory una categoria da includereto
include with the error message. The default category is
insieme al messaggio di errore. La categoria di default
[CategoriaCategory:ErroriErrors delreported by Module String]. (TODO:verificare)
 
no_category: SeIf settatoset ato 'true' oor 1, nonno verrannocategory aggiuntewill categoriebe inadded casoif dian errore.error
is generated.
 
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
 
Unit tests for this module are available at Module:String/tests.
]]
 
Line 34 ⟶ 28:
len
 
This function returns the length of the target string.
Questa funzione ritorna la lunghezza di una stringa.
 
Usage:
Uso:
{{#invoke:String|len|stringatarget_string|}}
OR
O
{{#invoke:String|len|s=stringatarget_string}}
 
Parameters
Parametri
s: LaThe stringastring diwhose cuilength ritornareto la lunghezzareport
 
If invoked using named parameters, Mediawiki will automatically remove any leading or
Se invocata usando parametri nominati, Mediawiki rimuoverà automaticamente ogni spazio iniziale
trailing whitespace from the target string.
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
 
Line 56 ⟶ 50:
sub
 
This function returns a substring of the target string at specified indices.
Questa funzione ritorna la sottostringa di una stringa bersaglio, come indicato dagli indici
 
Usage:
Uso:
{{#invoke:String|sub|stringa_bersagliotarget_string|indice_inizialestart_index|indice_finaleend_index}}
OR
O
{{#invoke:String|sub|s=stringa_bersagliotarget_string|i=indice_inizialestart_index|j=indice_finaleend_index}}
 
Parameters
s: LaThe stringastring dato cuireturn estrarrea unasubset sottostringaof
i: The fist index of the substring to return, defaults to 1.
i: La posizione iniziale del primo carattere della sottostringa da ritornare, se non
j: The last index of the string to return, defaults to the last character.
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).
 
The first character of the string is assigned an index of 1. If either i or j
I caratteri della stringa sono numerati a partire da 1. Se i o j hanno un valore negativo allora
is a negative value, it is interpreted the same as selecting a character by
contano la posizione contando dalla fine della stringa, -1 è l'ultimo carattere della stringa,
counting from the end of the string. Hence, a value of -1 is the same as
-2 il penultimo, ecc...
selecting the last character of the string.
 
If the requested indices are out of range for the given string, an error is
Se le posizioni sono al di fuori degli estremi della stringa viene ritornato un messaggio di
reported.
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( 'IndiciString fuorisubset dagliindex estremiout dellaof stringarange' );
end
if j < i then
return str._error( 'IndiciString subset indices inout ordineof sbagliatoorder' );
end
 
return mw.ustring.sub( s, i, j )
end
 
--[[
QuestaThis funzionefunction implementaimplements tuttethat le caratteristiche difeatures of {{str sub old}} eand vieneis mantenutakept perin motiviorder
to maintain these older templates.
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
match
 
This function returns a substring from the source string that matches a
Questa funzione ritorna dalla stringa bersaglio una sottostringa corrispondente a un pattern
specified pattern. It is exported for use in other modules
specificato.
 
Usage:
Uso:
strmatch = require("Module:String")._match
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
sresult = strmatch( s, pattern, start, match, plain, nomatch )
O
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index
|match=match_number|plain=plain_flag|nomatch=nomatch_output}}
 
Parameters
Parametri
s: LaThe stringastring dato cercaresearch
pattern: IlThe pattern daor cercarestring nellato stringafind within the string
start: LaThe posizioneindex inizialewithin dathe cuisource iniziarestring lato ricerca,start sethe nonsearch. specificato èThe 1.first
character of the string has index 1. Defaults to 1.
match: Se c'è ci sono corrispondenze multiple quale ritornare, 1 per la prima
match: In some cases it may be possible to make multiple matches on a single
corrispondenza, 2 per la seconda ecc.. Un valore negativo indica di contare
string. This specifies which match to return, where the first match is
all'indietro a partire dall'ultima corrispondenza, quindi match = -1 significa
match= 1. If a negative number is specified then a match is returned
chiedere l'ultima corrispondenza. Se non specificato è 1
counting from the last match. Hence match = -1 is the same as requesting
plain: Se vero specifica che il pattern deve essere considerato come una
the last match. Defaults to 1.
stringa normale, piuttosto che un pattern Lua. Se non specificata è falsa.
plain: A flag indicating that the pattern should be understood as plain
nomatch: Il valore da ritornare se non ci sono corrispondenze, invece di ritornare
text. Defaults to un errorefalse.
nomatch: If no match is found, output the "nomatch" value rather than an error.
 
For information on constructing Lua patterns, a form of [regular expression], see:
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.
 
* http://www.lua.org/manual/5.1/manual.html#5.4.1
Se match_number o start_index sono al di fuori degli estremi della stringa s, allora
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
la funzione ritorna un errore. Viene generato un errore anche se il non vengono trovate
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
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.
 
]]
-- This sub-routine is exported for use in other modules
function str.match(frame)
function str._match( s, pattern, start, match_index, plain_flag, nomatch )
return str._match(frame.args)
if s == '' then
return str._error( 'Target string is empty' )
end
if pattern == '' then
return str._error( 'Pattern string is empty' )
end
start = tonumber(start) or 1
if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then
return str._error( 'Requested start is out of range' )
end
if match_index == 0 then
return str._error( 'Match index is out of range' )
end
if plain_flag then
pattern = str._escapePattern( pattern )
end
 
local result
if match_index == 1 then
-- Find first match is simple case
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
-- Forward search
for w in iterator do
match_index = match_index - 1
if match_index == 0 then
result = w
break
end
end
else
-- Reverse search
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( 'Match not found' )
else
return nomatch
end
else
return result
end
end
 
--[[
match
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'];
 
This function returns a substring from the source string that matches a
if s == '' then
specified pattern.
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
 
Usage:
local result
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
if match_index == 1 then
OR
-- Il caso più semplice, trova la prima corrispondenza
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index
result = mw.ustring.match( s, pattern, start )
|match=match_number|plain=plain_flag|nomatch=nomatch_output}}
else
if start > 1 then
s = mw.ustring.sub( s, start );
end
 
Parameters
local iterator = mw.ustring.gmatch(s, pattern);
s: The string to search
if match_index > 0 then
pattern: The pattern or string to find within the string
-- Ricerca in avanti
start: The index within the source string to start the search. The first
for w in iterator do
character of the string has index 1. match_index = match_indexDefaults -to 1;.
match: In some cases it may be possible to make multiple matches on a single
if match_index == 0 then
string. This specifies which match to return, where the first match result = w;is
match= 1. If a negative number is specified then a match break;is returned
counting from the last match. Hence match = -1 is the same as requesting
end
the last match. endDefaults to 1.
plain: A flag indicating that the pattern should be understood as plain
else
text. Defaults to false.
-- Ricerca all'indietro deve estrarre tutte le corrispondenze
nomatch: If no match is found, output the "nomatch" value rather than an error.
local result_table = {};
local count = 1;
for w in iterator do
result_table[count] = w;
count = count + 1;
end
 
If invoked using named parameters, Mediawiki will automatically remove any leading or
result = result_table[ count + match_index ];
trailing whitespace from each string. In some circumstances this is desirable, in
end
other cases one may want to preserve the whitespace.
end
 
If the match_number or start_index are out of range for the string being queried, then
this function generates an error. An error is also generated if no match is found.
If one adds the parameter ignore_errors=true, then the error will be suppressed and
an empty string will be returned on any failure.
 
For information on constructing Lua patterns, a form of [regular expression], see:
 
* 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
 
]]
if result == nil then
-- This is the entry point for #invoke:String|match
if nomatch == nil then
function str.match( frame )
return str._error( 'Corrispondenza non trovata' );
local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} )
else
local s = new_args['s'] or ''
return nomatch;
local start = tonumber( new_args['start'] ) or 1
end
local plain_flag = str._getBoolean( new_args['plain'] or false )
else
local pattern = new_args['pattern'] or ''
return result;
local match_index = math.floor( tonumber(new_args['match']) or 1 )
end
local nomatch = new_args['nomatch']
 
return str._match( s, pattern, start, match_index, plain_flag, nomatch )
end
 
Line 226 ⟶ 257:
pos
 
This function returns a single character from the target string at position pos.
Questa funzione ritorna il carattere della stringa in posizione pos.
 
Usage:
Uso:
{{#invoke:String|pos|stringa_bersagliotarget_string|indiceindex_value}}
OR
O
{{#invoke:String|pos|target=stringa_bersagliotarget_string|pos=indiceindex_value}}
 
Parameters
target: The string to search
pos: The index for the character to return
 
If invoked using named parameters, Mediawiki will automatically remove any leading or
Parametri
trailing whitespace from the target string. In some circumstances this is desirable, in
target: La stringa in cui cercare
other cases one may want to preserve the whitespace.
pos: La posizione del carattere da ritornare
 
The first character has an index value of 1.
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.
 
If one requests a negative value, this function will select a character by counting backwards
I caratteri della stringa sono numerati a partire da 1. Se pos è un valore negativo allora
from the end of the string. In other words pos = -1 is the same as asking for the last character.
conta la posizione partendo dalla fine della stringa, -1 è l'ultimo carattere della stringa,
-2 il penultimo, ecc...
 
A requested value of zero, or a value greater than the length of the string returns an error.
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 dellaString stringaindex fuoriout dagliof estremirange' );
end
 
return mw.ustring.sub( target_str, pos, pos );
end
 
Line 263 ⟶ 294:
str_find
 
QuestaThis funzionefunction duplicaduplicates ilthe comportamento dibehavior of {{str_find}}, inclusoincluding all iof suoiits comportamentiquirks.
This is provided in order to support existing templates, but is NOT RECOMMENDED for
irregolari. Questa funzione è fornita per motivi di compatibilità con i vecchi template,
new code and templates. New code is recommended to use the "find" function instead.
ma SI RACCOMANDA di non utilizzarla in nuovi template. Nello sviluppo di nuovo codice
si raccomanda di usare la funzione "find".
 
Returns the first index in "source" that is a match to "target". Indexing is 1-based,
Parametri
and the function returns -1 if the "target" string is not present in "source".
source: La stringa in cui cercare
target: la stringa da cercare
 
Important Note: If the "target" string is empty / missing, this function returns a
Ritorna la posizione nella stringa source del primo carattere in cui c'è è stata
value of "1", which is generally unexpected behavior, and must be accounted for
trovata la stringa target. I caratteri della stringa sono numerati a partire da 1. La funzione
separatetly.
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
 
Line 299 ⟶ 325:
find
 
This function allows one to search for a target string or pattern within another
Questa funzione permette di cercare una stringa bersaglio o un pattern Lua all'interno di
string.
un'altra stringa.
 
Usage:
Uso:
{{#invoke:String|find|stringa_sorgentesource_str|stringa_bersagliotarget_string|indice_inizialestart_index|plain_flag}}
OR
O
{{#invoke:String|find|source=stringa_sorgentesource_str|target=stringa_bersagliotarget_str|start=indice_inizialestart_index|plain=plain_flag}}
 
Parameters
Parametri
source: LaThe stringastring into cui cercaresearch
target: LaThe stringastring oor pattern Luato dafind cercarewithin source
start: LaThe posizioneindex dawithin cuithe iniziaresource lastring ricerca,to sestart nonthe search, specificatodefaults èto 1
plain: SeBoolean èflag veroindicating indica che la stringathat target deveshould esserebe considerataunderstood comeas unaplain
text and not testoas normalea eLua nonstyle comeregular un pattern Luaexpression, se non specificatadefaults èto veratrue
 
If invoked using named parameters, Mediawiki will automatically remove any leading or
Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli
trailing whitespace from the parameter. In some circumstances this is desirable, in
spazi iniziali e finali. In alcune circostanze questo può essere il comportamento
other cases one may want to preserve the whitespace.
desiderato, in altre si potrebbe volerli conservare.
 
This function returns the first index >= "start" where "target" can be found
Questa funzione ritorna la prima posizione maggiore o uguale a "start" a partire dalla quale
within "source". Indices are 1-based. If "target" is not found, then this
"target" si trova in "source". I caratteri della stringa sono numerati a partire da 1.
Sefunction "target"returns non0. viene trovatoIf ritorna 0. Seeither "source" oor "target" sonoare mancantimissing o/ vuotiempty, ritorna 0.this
function also returns 0.
 
This function should be safe for UTF-8 strings.
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
 
Line 348 ⟶ 375:
replace
 
This function allows one to replace a target string or pattern within another
Questa funzione permette di rimpiazzare una stringa o pattern bersaglio con un'altra
string.
stringa.
 
Usage:
Uso:
{{#invoke:String|replace|stringa_sorgentesource_str|stringa_patternpattern_string|nuova_stringareplace_string|numero_di_sostituzionireplacement_count|plain_flag}}
OR
O
{{#invoke:String|replace|source=stringa_sorgentesource_string|pattern=stringa_patternpattern_string|replace=nuova_stringareplace_string|
count=numero_di_sostituzionireplacement_count|plain=plain_flag}}
 
Parameters
Parametri:
source: LaThe stringastring dato cercaresearch
pattern: LaThe stringastring oor pattern Luato da trovare infind within source
replace: IlThe testoreplacement di sostituzionetext
count: IlThe numeronumber diof volteoccurences into cui rimpiazzare la stringareplace, se nondefaults specificatoto tutteall.
plain: SeBoolean veroflag indicaindicating che ilthat pattern deve essere considerato comeshould testobe normaleunderstood eas nonplain
text and not comeas patterna Lua, ilstyle valoreregular diexpression, defaultdefaults èto verotrue
]]
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
 
--[[
Funzionesimple perfunction utilizzareto pipe string.rep in unto templatetemplates.
]]
 
function str.rep( frame )
local repetitions = tonumber( frame.args[2] )
if not repetitions then
return str._error( 'function rep expects a number as second parameter, received "' .. ( frame.args[2] or '' ) .. '"' )
if frame.args[2] == '' then -- se il secondo parametro è una stringa nulla ritorno una stringa nulla
end
return ''
return string.rep( frame.args[1] or '', repetitions )
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
 
--[[
escapePattern
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
]]
 
This function escapes special characters from a Lua string pattern. See [1]
function str.decode( frame )
for details on how patterns work.
local valid_enctype = { QUERY = true, WIKI = true, PATH = true}
 
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
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
 
Usage:
--[[
{{#invoke:String|escapePattern|pattern_string}}
Funzione per semplificare stringhe con diacritici
 
Parameters
pattern_string: The pattern string to escape.
]]
function str.escapePattern( frame )
 
local pattern_str = frame.args[1]
function str.collate( frame )
if not pattern_str then
 
return str._error( 'No pattern string specified' )
local collation = {
end
{ '[áàăắằẵẳâấầẫẩǎåǻäǟãȧǡąāảȁȃạặậḁⱥᶏᴂɐᶐɒ]' , 'a'},
local result = str._escapePattern( pattern_str )
{'[ÁÀĂẮẰẴẲÂẤẦẪẨǍÅÅǺÄǞÃȦǠĄĀẢȀȂẠẶẬḀȺᴁ]', 'A'},
return result
{'[ḃḅḇ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'},
}
 
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
 
--[[
count
Funzione per estrarre da un titolo la stringa adatta all'ordinamento alfabetico.
This function counts the number of occurrences of one string in another.
]]
function str.count(frame)
 
local args = str._getParameters(frame.args, {'source', 'pattern', 'plain'})
function str.titolo_alfa(frame)
local source = args.source or ''
-- Evito "I", "A", "Die"... che darebbero molte false corrispondenze in lingue diverse
local pattern = args.pattern or ''
local articoli = {"Il ", "Lo ", "La ", "L'", "Gli ", "Le ", "Un ", "Uno ", "Una ", "Un'", "The ", "An ", "Les ", "El ", "Los ", "Las ", "Der ", "Das "}
local plain = str._getBoolean(args.plain or true)
 
if plain then
local source = frame.args[1]
pattern = str._escapePattern(pattern)
if not source or source == '' then
end
source = mw.title.getCurrentTitle().text
local _, count = mw.ustring.gsub(source, pattern, '')
end
return count
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 or ''
}, 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
-- =================================================================
 
 
 
--[[
endswith
Funzione per unire una o più liste di valori in una stringa.
This function determines whether a string ends with another string.
 
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.arraytostringendswith(frame)
local args = str._getParameters(frame.args, {'source', 'pattern'})
 
local base_argssource = frameargs.argssource or ''
local pattern = args.pattern or ''
local params = {}
if pattern == '' then
if not base_args then return str._error('Lista parametri vuota') end
-- All strings end with the empty string.
-- carico la lista dei parametri
return "yes"
local index = 1
end
while true do
if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then
local par_name = base_args['par' .. index] or (index == 1 and base_args['par']) or ''
return "yes"
if par_name == '' then break end;
else
--carico eventuale nome alternativo per il primo parametro
return ""
local alt_name = base_args['altpar' .. index] or (index == 1 and base_args['altpar']) or ''
end
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
 
--[[
join
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)
 
Join all non empty arguments together; the first argument is the separator.
Usage:
{{#invoke:String|join|sep|one|two|three}}
]]
function str.join(frame)
 
local args = {}
 
local sep
function str.listtostring(frame)
for _, v in ipairs( frame.args ) do
 
if sep then
local base_args = frame.args
if v ~= '' then
local params = {}
table.insert(args, v)
if not base_args then return str._error('Lista parametri vuota') end
end
-- carico la lista dei parametri
else
local base_index = tonumber(base_args.base_index) or 1
sep = v
local par_number = tonumber(base_args.par_number) or 1
end
local Nmax = tonumber(base_args.nmax) or 0
end
local Nobbligatori = tonumber(base_args.nobbligatori) or base_index-1
return table.concat( args, sep or '' )
--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
 
--[[
Helper function that populates the argument list given that user may need to use a mix of
Funzione di aiuto che popola la lista di argomenti, dato che l'utente può voler utilizzare sia
named and unnamed parameters. This is relevant because named parameters are not
parametri nominati che non nominati. Questo è rilevante perchè gli spazi iniziali iniziali
identical to unnamed parameters due to string trimming, and when dealing with strings
e finali dei parametri nominati sono eliminati, mentre quelli dei parametri non nominati
we sometimes want to either preserve or remove that whitespace depending on the application.
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
 
--[[
Helper function to handle error messages.
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 'ErroriErrors riportatireported dalby moduloModule 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">ErroreString nelModule modulo StringError: ' .. error_str .. '</strong>';
if error_category ~= '' and not str._getBoolean( no_category ) then
error_str = '[[CategoriaCategory:' .. error_category .. ']]' .. error_str;
end
 
return error_str;
end
 
--[[
Helper Function to interpret boolean strings
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( 'NessunNo valoreboolean booleanovalue trovatofound' );
end
return boolean_value
end
 
--[[
Helper function that escapes all pattern characters so that they will be treated
Funzione di appoggio per aggiungere un carattere di escape a tutti i caratteri speciali,
as plain text.
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