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
Vegeu també
--[[ 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