Modulo:String/sandbox
Aspetto
--[[
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|pos|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 )
local new_args = str._getParameters( frame.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 str._error( 'La stringa in cui cercare è vuota' );
end
if pattern == '' then
return 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 str._error( 'La posizione iniziale richiesta è fuori dagli estremi della stringa' );
end
if match_index == 0 then
return 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}}
Parameters
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 templates.
]]
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 trasformare una lista di valori in stringa
--]]
function str.arraytostring(frame)
local new_args = str._getParameters( frame.args, {'varname', 'format', 'separator', 'conjunction'} );
local varname = news_args['varname'] or ""
if not mw.ustring.gmatch(varname, '#') then
return str._error( 'Non precisato segnaposto per indice' );
end
local format = news_args['format'] or "%0"
local separator = news_args['separator'] or ""
local conjunction = news.args['conjunction'] or separator
local vars = {}
local index = 1
local pframe = frame:getParent()
while true do
local value = pframe.args[mw.ustring.gsub(varname, '#', tostring(index))]
if not value and index == 1 then
value = pframe.args[mw.ustring.gsub(varname, '#', "")]
end
if not value then break end
vars[#vars+1] = mw.ustring.gsub(value, '.*', format)
end
return mw.text.listToText(vars, separator, conjunction )
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