Mòdul:String
Aquest mòdul proporciona accés a funcions bàsiques sobre cadenes (strings).
La majoria d'aquestes funcions es poden invocar amb paràmetres amb nom, sense nom o una barreja. Si s'usen paràmetres amb nom cal tenir en compte que el Mediawiki elimina els espais en blanc inicials i finals del valor del paràmetre. Segons l'ús previst pot ser convenient tant conservar-los com eliminar-los.
Algunes funciones admeten paràmetres amb patrons Lua que són una mena d'expressions regulars. Vegeu en el manual: patterns i Ustring patterns.
Opcions globals:
ignore_errors
: posat a 'true' o 1, en cas d'error retorn una cadena buida en lloc del missatge d'error.error_category
: si es detecta un error especifica el nom de la categoria a incloure amb el missatge d'error. Per defecte és Categoria:Errors detectats pel mòdul String.no_category
: posat a 'true' o 1, no afegeix cap categoria si es genera un error.
Funcions:
len
Retorna la longitud de la cadena. Sintaxi:
{{#invoke:string|len|cadena}}
{{#invoke:string|len|s=cadena}}
Paràmetres:
s
: La cadena a trobar la seva longitud
sub
Retorna una subcadena de la cadena indicada en els índex especificats. Sintaxi:
{{#invoke:string|sub|cadena|índex inicial|índex final}}
{{#invoke:string|sub|s=cadena|i=índex inicial|j=índex final}}
Paràmetres:
s
: la cadena on extraure la subcadenai
: índex inicial de la subcadena, per defecte 1, el primer caràcter de la cadena.j
: índex final de la subcadena, per defecte la longitud total, fins l'últim caràcter.
Si qualsevol dels dos índexs tenen valor negatiu llavors comptarà des del final de la cadena. Així, -1 és l'índex de l'últim caràcter de la cadena. Si els índexs són superiors a la longitud de la cadena llavors reportarà un error.
match
Retorna una subcadena de la cadena indicada que coincideixi amb un patró especificat.
{{#invoke:string|match|cadena|patró|índex inicial|número coincidència|indicador text net|text no coincidència}}
{{#invoke:string|match|s=cadena|pattern=patró|start=índex inicial|match=número coincidència|plain=indicador text net|nomatch=text no coincidència}}
Paràmetres:
s
: cadena on es fa la cercapattern
: patró o cadena a cercar.start
: índex de la cadena on començar a cercar, per defecte 1, el primer caràcter.match
: si es troben múltiples coincidències, especifica quina d'elles retornar. Per defecte és 1, la primera coincidència trobada. Un número negatiu compta des del final, per tant match=-1 és l'última coincidència.plain
: indica si el patró s'ha d'interpretar com a text net, per defecte 'false'.nomatch
: en cas de no trobar cap coincidència, retorna el valor de "nomatch" en lloc d'un error.
Si el número match
o l'índex start
estan fora del rang de la cadena, llavors la funció genera un error. També genera un error si no troba cap coincidència. Amb el paràmetre global ignore_errors=true
se suprimeix l'error i retorna una cadena buida.
pos
Retorna el caràcter de la cadena que es troba en la posició indicada.
{{#invoke:string|pos|cadena|índex}}
{{#invoke:string|pos|target=cadena|pos=índex}}
Paràmetres:
target
: cadena on cercarpos
: índex del caràcter a retornar
El primer caràcter té l'índex 1. L'últim és -1, comptant des del final. Si età fora del rang de la cadena llavors retornarà un error.
find
Retorna la posició on es troba una cadena o patró cercant en una altra cadena.
{{#invoke:string|find|cadena|cerca|índex inicial|indicador text net}}
{{#invoke:string|find|source=cadena|target=cerca|start=índex inicial|plain=indicador text net}}
Paràmetres:
source
: cadena on cercartarget
: cadena a cercar o patró de cercastart
: índex de la cadena font on començar a cercar, per defecte 1, el primer caràcter.plain
: indica si la cerca s'ha d'interpretar com a text net, en cas contrari com a patró Lua. Per defecte és 'true'.
Retorna el primer índex, major o igual que "start", on "target" s'ha trobat a "source". Si no el troba retorna 0. Si "source" o "target" estan buits o indefinits també retorna 0. Se suposa que funciona bé amb cadenes UTF-8.
replace
Permet reemplaçar una cadena o patró en una altra cadena.
{{#invoke:string|replace|cadena|patró|reemplaçament|comptador|indicador text net}}
{{#invoke:string|replace|source=cadena|pattern=patró|replace=reemplaçament|count=comptador|plain=indicador text net}}
Paràmetres:
source
: cadena on cercarpattern
: cadena de cerca o patró a cercarreplace
: text de reemplaçamentcount
: número d'ocurrències a reemplaçar, per defecte totes.plain
: indica si la cerca s'ha d'interpretar com a text net, en cas contrari com a patró Lua. Per defecte és 'true'.
rep
Repeteix la cadena un número de vegades.
{{#invoke:string|rep|cadena|vegades}}
Paràmetres:
cadena
: cadena a repetirvegades
: número de vegades a repetir
--[[
This module is intended to provide access to basic string functions.
]]
local str = {}
--[[
len
Parameters
s: The string whose length to report
]]
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
Parameters
s: The string to return a subset of
i: The fist index of the substring to return, defaults to 1.
j: The last index of the string to return, defaults to the last character.
]]
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( 'Índex fora del rang de la cadena' );
end
if j < i then
return str._error( 'Índexs de la cadena no ordenats' );
end
return mw.ustring.sub( s, i, j )
end
--[[
match
Parameters
s: The string to search
pattern: The pattern or string to find within the string
start: The index within the source string to start the search. The first
character of the string has index 1. Defaults to 1.
match: In some cases it may be possible to make multiple matches on a single
string. This specifies which match to return, where the first match is
match= 1. If a negative number is specified then a match is returned
counting from the last match. Hence match = -1 is the same as requesting
the last match. Defaults to 1.
plain: A flag indicating that the pattern should be understood as plain
text. Defaults to false.
nomatch: If no match is found, output the "nomatch" value rather than an error.
]]
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( 'Cadena on cercar està buida' );
end
if pattern == '' then
return str._error( 'Cadena de cerca està buida' );
end
if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then
return str._error( 'Índex d\'inici fora del rang de la cadena' );
end
if match_index == 0 then
return str._error( 'Número de coincidència fora de rang' );
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( 'Cap coincidència trobada' );
else
return nomatch;
end
else
return result;
end
end
--[[
pos
Parameters
target: The string to search
pos: The index for the character to return
]]
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( 'Índex fora del rang de la cadena' );
end
return mw.ustring.sub( target_str, pos, pos );
end
--[[
find
Parameters
source: The string to search
target: The string or pattern to find within source
start: The index within the source string to start the search, defaults to 1
plain: Boolean flag indicating that target should be understood as plain
text and not as a Lua style regular expression, defaults to true
]]
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
Parameters
source: The string to search
pattern: The string or pattern to find within source
replace: The replacement text
count: The number of occurences to replace, defaults to all.
plain: Boolean flag indicating that pattern should be understood as plain
text and not as a Lua style regular expression, defaults to true
]]
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
--[[
simple function to pipe string.rep to templates.
]]
function str.rep( frame )
local repetitions = tonumber( frame.args[2] )
if not repetitions then
return str._error( "s'esperava un número com a segon paràmetre; trobat: " .. ( frame.args[2] or '' ))
end
return string.rep( frame.args[1] or '', repetitions )
end
--[[
Helper function that populates the argument list given that user may need to use a mix of
named and unnamed parameters. This is relevant because named parameters are not
identical to unnamed parameters due to string trimming, and when dealing with strings
we sometimes want to either preserve or remove that whitespace depending on the application.
]]
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.
]]
function str._error( error_str )
local frame = mw.getCurrentFrame();
local error_category = frame.args.error_category or 'Errors detectats pel mòdul 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">Error del mòdul 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
--[[
Helper Function to interpret boolean strings
]]
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 boolean_str == '' then
boolean_value = false;
else
boolean_value = true;
end
elseif type( boolean_str ) == 'boolean' then
boolean_value = boolean_str;
else
error( 'Cap valor booleà trobat' );
end
return boolean_value
end
--[[
Helper function that escapes all pattern characters so that they will be treated
as plain text.
]]
function str._escapePattern( pattern_str )
return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" );
end
return str