« Module:String » : différence entre les versions

Une page de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
pour alléger ce module, déplacement des fonctions simpletitle() et titledisambig() vers un module dédié Module:Titre sans précision
ce test n'avait plus pour seule utilité que de micro-optimiser dans le cas "chaîne vide", mais ce n'est généralement pas (peut-être même jamais) le cas, et de toute façon la fonction mw.ustring.rep() est très performante, en fait c'est un alias de string.rep()
 
(11 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 12 : Ligne 12 :
ignore_errors: If set to 'true' or 1, any error condition will result in
ignore_errors: If set to 'true' or 1, any error condition will result in
an empty string being returned rather than an error message.
an empty string being returned rather than an error message.

error_category: If an error occurs, specifies the name of a category to
error_category: If an error occurs, specifies the name of a category to
include with the error message. The default category is
include with the error message. The default category is
[Category:Errors reported by Module String].
[Category:Errors reported by Module String].

no_category: If set to 'true' or 1, no category will be added if an error
no_category: If set to 'true' or 1, no category will be added if an error
is generated.
is generated.

Unit tests for this module are available at Module:String/tests.
Unit tests for this module are available at Module:String/tests.
]]
]]
Ligne 42 : Ligne 42 :
]]
]]
function str.len( frame )
function str.len( frame )
local new_args = str._getParameters( frame.args, {'s'} )
local new_args = str._getParameters( frame.args, { 's' } )
local s = new_args['s'] or ''
local s = new_args[ 's' ] or ''
return mw.ustring.len( s )
return mw.ustring.len( s )
end
end
Ligne 61 : Ligne 61 :
i: The fist index of the substring to return, defaults to 1.
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.
j: The last index of the string to return, defaults to the last character.

The first character of the string is assigned an index of 1. If either i or j
The first character of the string is assigned an index of 1. If either i or j
is a negative value, it is interpreted the same as selecting a character by
is a negative value, it is interpreted the same as selecting a character by
Ligne 72 : Ligne 72 :
function str.sub( frame )
function str.sub( frame )
local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } )
local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } )
local s = new_args['s'] or ''
local s = new_args[ 's' ] or ''
local i = tonumber( new_args['i'] ) or 1
local i = tonumber( new_args[ 'i' ] ) or 1
local j = tonumber( new_args['j'] ) or -1
local j = tonumber( new_args[ 'j' ] ) or -1

local len = mw.ustring.len( s )
local len = mw.ustring.len( s )


Ligne 85 : Ligne 85 :
j = len + j + 1
j = len + j + 1
end
end

if i > len or j > len or i < 1 or j < 1 then
if i > len or j > len or i < 1 or j < 1 then
return str._error( 'String subset index out of range' )
return str._error( 'String subset index out of range' )
Ligne 92 : Ligne 92 :
return str._error( 'String subset indices out of order' )
return str._error( 'String subset indices out of order' )
end
end

return mw.ustring.sub( s, i, j )
return mw.ustring.sub( s, i, j )
end
end
Ligne 115 : Ligne 115 :
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
OR
OR
{{#invoke:String|pos|s=source_string|pattern=pattern_string|start=start_index
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index
|match=match_number|plain=plain_flag|nomatch=nomatch_output}}
|match=match_number|plain=plain_flag|nomatch=nomatch_output}}


Ligne 149 : Ligne 149 :
]]
]]
function str.match( frame )
function str.match( frame )
local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} )
local new_args = str._getParameters( frame.args, { 's', 'pattern', 'start', 'match', 'plain', 'nomatch' } )
local s = new_args['s'] or ''
local s = new_args[ 's' ] or ''
local start = tonumber( new_args['start'] ) or 1
local start = tonumber( new_args[ 'start' ] ) or 1
local plain_flag = str._getBoolean( new_args['plain'] or false )
local plain_flag = str._getBoolean( new_args[ 'plain' ] or false )
local pattern = new_args['pattern'] or ''
local pattern = new_args[ 'pattern' ] or ''
local match_index = math.floor( tonumber(new_args['match']) or 1 )
local match_index = math.floor( tonumber( new_args[ 'match' ] ) or 1 )
local nomatch = new_args['nomatch']
local nomatch = new_args[ 'nomatch' ]

if s == '' then
if s == '' then
-- return str._error( 'Target string is empty' )
-- return str._error( 'Target string is empty' )
Ligne 163 : Ligne 163 :
return str._error( 'Pattern string is empty' )
return str._error( 'Pattern string is empty' )
end
end
if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then
if math.abs( start ) < 1 or math.abs( start ) > mw.ustring.len( s ) then
-- return str._error( 'Requested start is out of range' )
-- return str._error( 'Requested start is out of range' )
end
end
Ligne 172 : Ligne 172 :
pattern = str._escapePattern( pattern )
pattern = str._escapePattern( pattern )
end
end

local result
local result
if match_index == 1 then
if match_index == 1 then
Ligne 181 : Ligne 181 :
s = mw.ustring.sub( s, start )
s = mw.ustring.sub( s, start )
end
end

local iterator = mw.ustring.gmatch(s, pattern)
local iterator = mw.ustring.gmatch( s, pattern )
if match_index > 0 then
if match_index > 0 then
-- Forward search
-- Forward search
Ligne 197 : Ligne 197 :
local count = 1
local count = 1
for w in iterator do
for w in iterator do
result_table[count] = w
result_table[ count ] = w
count = count + 1
count = count + 1
end
end

result = result_table[ count + match_index ]
result = result_table[ count + match_index ]
end
end
end
end

if result == nil then
if result == nil then
if nomatch == nil then
if nomatch == nil then
Ligne 242 : Ligne 242 :
]]
]]
function str.pos( frame )
function str.pos( frame )
local new_args = str._getParameters( frame.args, {'target', 'pos'} )
local new_args = str._getParameters( frame.args, { 'target', 'pos' } )
local target_str = new_args['target'] or ''
local target_str = new_args[ 'target' ] or ''
local pos = tonumber( new_args['pos'] ) or 0
local pos = tonumber( new_args[ 'pos' ] ) or 0


if pos == 0 or math.abs(pos) > mw.ustring.len( target_str ) then
if pos == 0 or math.abs( pos ) > mw.ustring.len( target_str ) then
return str._error( 'String index out of range' )
return str._error( 'String index out of range' )
end
end

return mw.ustring.sub( target_str, pos, pos )
return mw.ustring.sub( target_str, pos, pos )
end
end
Ligne 283 : Ligne 283 :
]]
]]
function str.find( frame )
function str.find( frame )
local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } )
local new_args = str._getParameters( frame.args, { 'source', 'target', 'start', 'plain', 'trim', 'default' } )
local source_str = new_args['source'] or ''
local source_str = new_args[ 'source' ] or ''
local pattern = new_args['target'] or ''
local pattern = new_args[ 'target' ] or ''
local start_pos = tonumber(new_args['start']) or 1
local start_pos = tonumber( new_args[ 'start' ] ) or 1
local plain = new_args['plain'] or true
local plain = new_args[ 'plain' ] or true
local trim = new_args[ 'trim' ] or false
local default = new_args[ 'default' ]
if default == 'empty' then default = '' else default = tonumber( default ) or 0 end

if source_str == '' or pattern == '' then
if source_str == '' or pattern == '' then
return 0
return 0
end
end

plain = str._getBoolean( plain )
plain = str._getBoolean( plain )
trim = str._getBoolean( trim )

if trim then source_str = mw.text.trim( source_str ) end


local start = mw.ustring.find( source_str, pattern, start_pos, plain )
local start = mw.ustring.find( source_str, pattern, start_pos, plain )
if start == nil then
if start == nil then
start = 0
start = default
end
end

return start
return start
end
end
Ligne 324 : Ligne 330 :
]]
]]
function str.replace( frame )
function str.replace( frame )
local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } )
local new_args = str._getParameters( frame.args, { 'source', 'pattern', 'replace', 'count', 'plain' } )
local source_str = new_args['source'] or ''
local source_str = new_args[ 'source' ] or ''
local pattern = new_args['pattern'] or ''
local pattern = new_args[ 'pattern' ] or ''
local replace = new_args['replace'] or ''
local replace = new_args[ 'replace' ] or ''
local count = tonumber( new_args['count'] )
local count = tonumber( new_args[ 'count' ] )
local plain = new_args['plain'] or true
local plain = new_args[ 'plain' ] or true

if source_str == '' or pattern == '' then
if source_str == '' or pattern == '' then
return source_str
return source_str
Ligne 340 : Ligne 346 :
replace = mw.ustring.gsub( replace, "%%", "%%%%" ); --Only need to escape replacement sequences.
replace = mw.ustring.gsub( replace, "%%", "%%%%" ); --Only need to escape replacement sequences.
end
end

local result
local result


Ligne 353 : Ligne 359 :


--[[
--[[
rep
trim


Cette fonction retourne son unique paramètre en supprimant les espaces
Cette fonction retourne la concaténation de son premier paramètre n fois où n est le deuxième paramètre (fonction "rep" ou "repeat")
et sauts de ligne au début et à la fin (fonction "trim")


Usage :
Usage :
{{#invoke:String|trim|string}}
{{#invoke:String|rep|s|n}}


Paramètres :
Paramètres :
la chaîne 'string' dont on veut supprimer les éventuels espaces
la chaîne 's' dont on veut répeter
l'entier 'n' le nombre d'itération
et sauts de ligne au début et/ou à la fin
]]
]]
function str.trim(frame)
function str.rep( frame )
local txt = frame.args[1]
local new_args = str._getParameters( frame.args, { 's', 'n' } )
if not txt or txt == "" then
local s = new_args[ 's' ] or ''
local n = tonumber( new_args[ 'n' ] ) or 1
return ""
return mw.ustring.rep( s, n )
end
return mw.text.trim(txt)
end
end



--[[
--[[
count
rep
This function counts the number of occurrences of one string in another.

Cette fonction retourne la concaténation de son premier paramètre n fois où n est le deuxième paramètre (fonction "rep" ou "repeat")

Usage :
{{#invoke:String|rep|string|int}}

Paramètres :
la chaîne 'string' dont on veut répeter
l'entier 'int' le nombre d'itération
]]
]]
function str.rep(frame)
function str.count( frame )
local new_args = str._getParameters( frame.args, { 's', 'n' } )
local args = str._getParameters( frame.args, { 'source', 'pattern', 'plain' } )
local s = new_args['s'] or ''
local source = args.source or ''
local n = tonumber( new_args['n'] ) or 1
local pattern = args.pattern or ''
local plain = str._getBoolean( args.plain or true )
if not s or s == '' then
if plain then
return ''
pattern = str._escapePattern( pattern )
end
end
local _, count = mw.ustring.gsub( source, pattern, '' )
if not n or n <0 then
return s
return count
end
end

return mw.ustring.rep(s,n)
--[[
non_latin
Retire tous les caractères latins d'une chaîne de caractères. Rend la chaîne vide "" si le paramètre est un texte entièrement latin.
Paramètre : source
]]
function str.non_latin( frame )
local args = str._getParameters( frame.args, { 'source' } )
local s = args.source or ''
s = mw.text.decode( s, true )
s = mw.ustring.lower( mw.ustring.gsub( mw.ustring.toNFD( s ), "[^%w]", "" ) )
s = mw.ustring.gsub( s, "[!-˿Ḁ-ỿ]", "" ) -- U+0021-02FF, U+1E00-1EFF
return s
end
end


Ligne 409 : Ligne 417 :
local new_args = {}
local new_args = {}
local index = 1
local index = 1

for i = 1, #arg_list do
for i = 1, #arg_list do
local arg = arg_list[i]
local arg = arg_list[ i ]
local value = frame_args[arg]
local value = frame_args[ arg ]
if value == nil then
if value == nil then
value = frame_args[index]
value = frame_args[ index ]
index = index + 1
index = index + 1
end
end
new_args[arg] = value
new_args[ arg ] = value
end
end

return new_args
return new_args
end
end
Ligne 426 : Ligne 434 :
Helper function to handle error messages.
Helper function to handle error messages.
]]
]]
function str._error( error_str )
function str._error( error_msg )
local frame = mw.getCurrentFrame()
local frame = mw.getCurrentFrame()
local error_category = frame.args.error_category or 'Errors reported by Module String'
local error_category = frame.args.error_category or 'Errors reported by Module String'
local ignore_errors = frame.args.ignore_errors or false
local ignore_errors = frame.args.ignore_errors or false
local no_category = frame.args.no_category or false
local no_category = frame.args.no_category or false

if str._getBoolean(ignore_errors) then
if str._getBoolean( ignore_errors ) then
return ''
return ''
end
end

local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>'
local error_str = '<strong class="error">String Module Error: ' .. error_msg .. '</strong>'
if error_category ~= '' and not str._getBoolean( no_category ) then
if error_category ~= '' and not str._getBoolean( no_category ) then
error_str = '[[Category:' .. error_category .. ']]' .. error_str
error_str = '[[Category:' .. error_category .. ']]' .. error_str
end
end

return error_str
return error_str
end
end
Ligne 449 : Ligne 457 :
function str._getBoolean( boolean_str )
function str._getBoolean( boolean_str )
local boolean_value
local boolean_value

if type( boolean_str ) == 'string' then
if type( boolean_str ) == 'string' then
boolean_str = boolean_str:lower()
boolean_str = boolean_str:lower()
Ligne 472 : Ligne 480 :
function str._escapePattern( pattern_str )
function str._escapePattern( pattern_str )
return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" )
return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" )
end

--[[
count
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'})
local source = args.source or ''
local pattern = args.pattern or ''
local plain = str._getBoolean(args.plain or true)
if plain then
pattern = str._escapePattern(pattern)
end
local _, count = mw.ustring.gsub(source, pattern, '')
return count
end
end



Dernière version du 17 février 2024 à 01:11

 Documentation[voir] [modifier] [historique] [purger]

Le module String (un mot anglais signifiant chaîne de caractères) permet de manipuler des chaînes de caractères. Les fonctions fournies par ce module sont prévues pour un appel depuis des modèles. Appeler ce module depuis un autre module a peu d'intérêt car les fonctions fournies sont des reprennent les fonctions natives de lua et les fonctions fournies par la bibliothèque mw.ustring.

Utilisation

Fonctions exportables :

  • len – renvoie le nombre de caractères dans une chaîne, prend en compte les caractères multi-octets (len ou length signifie taille, longueur)
  • sub – renvoie une partie de la chaîne de caractères (sub ou sub-string signifie sous-chaîne)
  • match – renvoie la première correspondance d'un motif dans une chaîne de caractères
  • pos – renvoie le caractère à une position donnée d'une chaîne de caractères
  • find – renvoie les indices de fin de chaque occurrence d'un motif dans une chaîne de caractères
  • replace – renvoie la chaîne de caractères initiale dans laquelle un motif est remplacé par un autre
  • rep – renvoie la chaîne de caractères passée en argument répété autant de fois que souhaité
  • count – renvoie le nombre d'occurrences d'un motif dans une chaîne de caractères

Autres fonctions : « Helper functions » (fonctions qui auraient pu être locales, mais pour une raison inconnue sont publiques)

  • _getParameters – permet l'extraction dans un tableau des arguments du frame
  • _error – permet la mise en forme des messages d'erreur
  • _getBoolean – permet l'interprétation de chaînes de caractères comme booléens
  • _escapePattern – permet d'« échapper » tous les caractères spéciaux afin qu'ils soient pris en compte comme du texte et non comme des paramètres d'un motif.

Modules externes et autres éléments dont ce module a besoin pour fonctionner :

  • Bibliothèque mw.ustring :
    • mw.ustring.len – Renvoie la longueur d'une chaîne de caractères ;
    • mw.ustring.sub – Renvoie une tranche d'une chaîne de caractères ;
    • mw.ustring.gsub – Renvoie une chaîne de caractères dans laquelle toutes les occurrences d'un motif sont remplacées par une chaîne de remplacement ;
    • mw.ustring.match – Renvoie la première correspondance d'un motif dans une chaine de caractères ;
    • mw.ustring.gmatch – Renvoie un itérateur contenant toutes les correspondances d'un motif dans une chaine de caractères ;
    • mw.ustring.find – Renvoie les indices de fin des occurrences d'un motif dans une chaîne de caractères ;
    • mw.ustring.rep – Renvoie une chaîne de caractères répétée plusieurs fois ;
  • mw.getCurrentFrame – Renvoie l'objet frame courant, généralement l'objet frame du dernier appel à #invoke.

len

Adapte mw.ustring.len pour un appel depuis un modèle.

Cette fonction renvoie la longueur de la chaîne de caractère cible.

Utilisation
{{#invoke:String|len|chaîne_de_caractère_cible}}

OU

{{#invoke:String|len|s=chaîne_de_caractère_cible}}
Paramètres
  • s : la chaîne de caractère dont la longueur doit être signalée

S'il est appelé à l'aide de paramètres nommés, MediaWiki supprimera automatiquement tout espace blanc de début ou de fin de la chaîne de caractère cible.

sub

Adapte mw.ustring.sub pour un appel depuis un modèle.

Cette fonction renvoie une sous-chaîne de caractère spécifiée par des indices numériques d'une chaîne cible.

Utilisation
{{#invoke:String|sub|chaîne_de_caractère_cible|indice_de_départ|indice_de_fin}}

OU

{{#invoke:String|sub|s=chaîne_de_caractère_cible|i=indice_de_départ|j=indice_de_fin}}
Paramètres
  • s : la chaîne de caractère de départ
  • i : le début de la sous-chaîne de caractère commence à l'entier indiqué par ce paramètre, par défaut à 1.
  • j : la fin de la sous-chaîne de caractère finit à l'entier indiqué par ce paramètre.

Le premier caractère de la chaîne se voit attribuer un indice de 1. Si i ou j est une valeur négative, cela est interprété comme la sélection d'un caractère en comptant à rebours à partir de la fin de la chaîne de caractère cible. Par conséquent, une valeur de -1 revient à sélectionner le dernier caractère de la chaîne.

Si les indices demandés sont hors limites pour la chaîne donnée, une erreur est signalée. Si un paramètre d'indice est omis, la chaîne de caractère cible est reprise à l'identique, au commencement ou à la fin suivant l'omission et le signe du paramètre restant.

match

Adapte mw.ustring.match et mw.ustring.gmatch pour un appel depuis un modèle. pour un appel depuis un modèle.

Cette fonction renvoie une sous-chaîne de caractères issue de la chaîne de caractères source correspondant à un motif spécifique.

Utilisation
{{#invoke:String|match|source_string|pattern_string|start_indice|match_number|plain_flag|nomatch_output}}

OU

{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_indice
    |match=match_number|plain=plain_flag|nomatch=nomatch_output}}
Paramètres
  • s : La chaîne de caractères sur laquelle effectuer la recherche
  • pattern : Le motif recherché
  • start : L'indice de s auquel commencer la recherche. Le premier caractère de la chaîne de caractères a pour indice 1. Par défaut, 1.
  • match : Dans certains cas, il est possible d'effectuer plusieurs correspondances sur une seule chaîne. Le paramètre match spécifie la correspondance à conserver, défini tel que pour la première correspondance match = 1. Si un nombre négatif est donné comme valeur de match, la correspondance est renvoyée en partant de la fin. Ainsi, match = -1 est équivalent à demander la dernière correspondance. Par défaut, 1.
  • plain : Booléen indiquant si le motif doit être interprété en tant que texte brut. Par défaut, false.
  • nomatch : Valeur à retourner si aucune correspondance n'est trouvée.

Lorsqu'invoqué en utilisant des paramètres nommés, Mediawiki retire automatiquement tout espace vide en début et en fin d'une chaîne de caractères. Dans certaines situations, ce comportement est désirable. Dans d'autres, on veut l'éviter.

Si les valeurs des paramètres match ou start sont plus élevées que la longueur de la chaîne de caractères s, cette fonction génère une erreur. Une erreur est aussi générée si aucune correspondance n'est trouvée et que le paramètre nomatch n'est pas défini. En ajoutant le paramètre ignore_errors=true, les erreurs seront supprimées et remplacées par le renvoi d'un chaîne de caractères vide.

Pour davantage d'informations sur la construction de motifs Lua qui sont une forme d'expression régulière, voir :

pos

Cette fonction renvoie le caractère d'une chaîne de caractères situé à la position pos.

Utilisation
{{#invoke:String|pos|target_string|indice_value}}

OU

{{#invoke:String|pos|target=target_string|pos=indice_value}}
Paramètres
  • target : La chaîne de caractère à explorer
  • pos : L'indice du caractère à renvoyer au sein de la chaîne target.

Lorsqu'invoqué en utilisant des paramètres nommés, Mediawiki retire automatiquement tout espace vide en début et en fin d'une chaîne de caractères. Dans certaines situations, ce comportement est désirable. Dans d'autres, on veut l'éviter.

Le premier caractère de la chaîne se voit attribuer un indice de 1.

Si un nombre négatif est donné comme valeur de target, la fonction compte en partant de la fin. Ainsi, target = -1 est équivalent à demander le dernier caractère.

Un indice de 0 ou supérieur à la longueur de la chaîne de caractères renvoie une erreur.

find

Adapte mw.ustring.find pour un appel depuis un modèle.

Cette fonction permet la recherche d'une chaîne de caractères ou d'un motif au sein d'une autre chaîne de caractères.

Utilisation
{{#invoke:String|find|source_str|target_string|start_indice|plain_flag}}

OR

{{#invoke:String|find|source=source_str|target=target_str|start=start_indice|plain=plain_flag}}
Paramètres
  • source : La chaîne de caractère à explorer
  • target : Le motif ou la chaîne de caractères à trouver
  • start : L'indice de source auquel commencer la recherche. Le premier caractère de la chaîne de caractères a pour indice 1.
  • plain : Indicateur booléen indiquant que le modèle doit être compris comme du texte brut et non comme une expression régulière de style Lua compatible Unicode; la valeur par défaut est true

Lorsqu'invoqué en utilisant des paramètres nommés, Mediawiki retire automatiquement tout espace vide en début et en fin d'une chaîne de caractères. Dans certaines situations, ce comportement est désirable. Dans d'autres, on veut l'éviter.

Cette fonction renvoie le premier indice de source en commençant de start auquel on peut trouver target. Si target n'est pas trouvée, cette fonction renvoie 0. Si l'un des deux paramètres source ou target est omis ou vide, cette fonction retourne également 0.

Cette fonction fonctionne pour les chaînes de caractères encodées en UTF-8.

replace

Adapte mw.ustring.gsub pour un appel depuis un modèle.

Cette fonction permet le remplacement d'une chaîne de caractères ou d'un motif cible au sein d'une chaîne de caractères par une autre chaîne de caractères.

Utilisation
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}

OR

{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|
   count=replacement_count|plain=plain_flag}}
Paramètres
  • source : La chaîne de caractère à explorer
  • pattern : Le motif ou la chaîne de caractères à trouver dans source
  • replace : Le texte de remplacement
  • count : Le nombre d'occurrences à remplacer. Par défaut, toutes.
  • plain : Indicateur booléen indiquant que le modèle doit être compris comme du texte brut et non comme une expression régulière de style Lua compatible Unicode; la valeur par défaut est true


rep

Adapte mw.ustring.rep pour un appel depuis un modèle.

Cette fonction répète la même chaîne de multiple fois.

Utilisation
{{#invoke:String|rep|texte|nombre}}

Paramètres :

  • texte : le texte à répéter
  • nombre : le nombre de répétition

count

Cette fonction utilise une fonctionnalité de mw.ustring.gsub.

Cette fonction compte le nombre de fois qu'un motif apparaît dans la chaîne de caractère.

Utilisation
{{#invoke:String|count|texte|motif|plain_flag}}
Paramètres
  • texte : la chaîne de caracère
  • motif : le motif (ou pattern) a rechercher
  • plain_flag : Indicateur booléen indiquant que le modèle doit être compris comme du texte brut et non comme une expression régulière de style Lua compatible Unicode; la valeur par défaut est true

Exemples

len

{{#invoke:String|len|ABCDEFGHIJ}}
renvoie 10
{{#invoke:String|len|É}} 
renvoie 1, même si É occupe 2 octets
{{#invoke:String|len| }}  
renvoie 1 , les espaces blancs sont pris en compte

sub

{{#invoke:String|sub|ABCDEFGHIJ|0}}        renvoie une erreur, ici l'indice commence à 1 (contrairement à d'autres langages de programmation)
{{#invoke:String|sub|ABCDEFGHIJ|5}}        renvoie EFGHIJ, on commence à partir du 5ème caractère et on prend le reste
{{#invoke:String|sub|ABCDEFGHIJ|1|3}}      renvoie ABC, on commence à partir du 1er jusqu'au 3ème
{{#invoke:String|sub|ABCDEFGHIJ|1|1}}      renvoie A
{{#invoke:String|sub|ABCDEFGHIJ|-1}}       renvoie J, l'indice est inversé on commence à la fin
{{#invoke:String|sub|ABCDEFGHIJ|-5|-2}}    renvoie FGHI
{{#invoke:String|sub|ABCDEFGHIJ|-5|2}}     renvoie une erreur, l'indice de fin doit être après l'indice de début (2 est placé avant -5) 
{{#invoke:String|sub|ABCDEFGHIJ|-5|7}}     renvoie FGHI, l'indice de fin est bien après l'indice de début

count

Exemples :

  • {{#invoke:String|count|aabbcc|a}} : 2 --nombre de a
  • {{#invoke:String|count|aabbcc|z}} : 0 --nombre de z
  • {{#invoke:String|count|aabbcc|[ac]|plain=false}} : 4 --nombre de a ou de c
  • {{#invoke:String|count|11-aa-2587|[0-9]|plain=false}} : 6 --nombre de chiffres
  • {{#invoke:String|count|Il était une fois| |plain=true}} : 3 --nombre de blancs
  • {{#invoke:String|count|Il était une fois|[ ]|plain=false}} : 3 --nombre de blancs

Voir aussi


--[[

This module is intended to provide access to basic string functions.

Most of the functions provided here can be invoked with named parameters,
unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will
automatically remove any leading or trailing whitespace from the parameter.
Depending on the intended use, it may be advantageous to either preserve or
remove such whitespace.

Global options
	ignore_errors: If set to 'true' or 1, any error condition will result in
		an empty string being returned rather than an error message.

	error_category: If an error occurs, specifies the name of a category to
		include with the error message.  The default category is
		[Category:Errors reported by Module String].

	no_category: If set to 'true' or 1, no category will be added if an error
		is generated.

Unit tests for this module are available at Module:String/tests.
]]

local str = {}

--[[
len

This function returns the length of the target string.

Usage:
{{#invoke:String|len|target_string|}}
OR
{{#invoke:String|len|s=target_string}}

Parameters
	s: The string whose length to report

If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the target string.
]]
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

This function returns a substring of the target string at specified indices.

Usage:
{{#invoke:String|sub|target_string|start_index|end_index}}
OR
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}

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.

The first character of the string is assigned an index of 1.  If either i or j
is a negative value, it is interpreted the same as selecting a character by
counting from the end of the string.  Hence, a value of -1 is the same as
selecting the last character of the string.

If the requested indices are out of range for the given string, an error is
reported.
]]
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( 'String subset index out of range' )
	end
	if j < i then
		return str._error( 'String subset indices out of order' )
	end

	return mw.ustring.sub( s, i, j )
end

--[[
This function implements that features of {{str sub old}} and is kept in order
to maintain these older templates.
]]
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

This function returns a substring from the source string that matches a
specified pattern.

Usage:
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
OR
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index
	|match=match_number|plain=plain_flag|nomatch=nomatch_output}}

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.

If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from each string.  In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.

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

]]
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( 'Target string is empty' )
	end
	if pattern == '' then
		return str._error( 'Pattern string is empty' )
	end
	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

--[[
pos

This function returns a single character from the target string at position pos.

Usage:
{{#invoke:String|pos|target_string|index_value}}
OR
{{#invoke:String|pos|target=target_string|pos=index_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
trailing whitespace from the target string.  In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.

The first character has an index value of 1.

If one requests a negative value, this function will select a character by counting backwards
from the end of the string.  In other words pos = -1 is the same as asking for the last character.

A requested value of zero, or a value greater than the length of the string returns an error.
]]
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( 'String index out of range' )
	end

	return mw.ustring.sub( target_str, pos, pos )
end

--[[
find

This function allows one to search for a target string or pattern within another
string.

Usage:
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}
OR
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}

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

If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the parameter.  In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.

This function returns the first index >= "start" where "target" can be found
within "source".  Indices are 1-based.  If "target" is not found, then this
function returns 0.  If either "source" or "target" are missing / empty, this
function also returns 0.

This function should be safe for UTF-8 strings.
]]
function str.find( frame )
	local new_args = str._getParameters( frame.args, { 'source', 'target', 'start', 'plain', 'trim', 'default' } )
	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
	local trim = new_args[ 'trim' ] or false
	local default = new_args[ 'default' ]
	if default == 'empty' then default = '' else default = tonumber( default ) or 0 end

	if source_str == '' or pattern == '' then
		return 0
	end

	plain = str._getBoolean( plain )
	trim = str._getBoolean( trim )

	if trim then source_str = mw.text.trim( source_str ) end

	local start = mw.ustring.find( source_str, pattern, start_pos, plain )
	if start == nil then
		start = default
	end

	return start
end

--[[
replace

This function allows one to replace a target string or pattern within another
string.

Usage:
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}
OR
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|
   count=replacement_count|plain=plain_flag}}

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

--[[
rep

Cette fonction retourne la concaténation de son premier paramètre n fois où n est le deuxième paramètre (fonction "rep" ou "repeat")

Usage :
{{#invoke:String|rep|s|n}}

Paramètres :
	la chaîne 's' dont on veut répeter
	l'entier 'n' le nombre d'itération
]]
function str.rep( frame )
	local new_args = str._getParameters( frame.args, { 's', 'n' } )
	local s = new_args[ 's' ] or ''
	local n = tonumber( new_args[ 'n' ] ) or 1
	return mw.ustring.rep( s, n )
end

--[[
count
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' } )
	local source = args.source or ''
	local pattern = args.pattern or ''
	local plain = str._getBoolean( args.plain or true )
	if plain then
		pattern = str._escapePattern( pattern )
	end
	local _, count = mw.ustring.gsub( source, pattern, '' )
	return count
end

--[[
non_latin
Retire tous les caractères latins d'une chaîne de caractères. Rend la chaîne vide "" si le paramètre est un texte entièrement latin.
Paramètre : source
]]
function str.non_latin( frame )
	local args = str._getParameters( frame.args, { 'source' } )
    local s = args.source or ''
    s = mw.text.decode( s, true )
    s = mw.ustring.lower( mw.ustring.gsub( mw.ustring.toNFD( s ), "[^%w]", "" ) )
    s = mw.ustring.gsub( s, "[!-˿Ḁ-ỿ]", "" ) -- U+0021-02FF, U+1E00-1EFF
    return s
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

	for i = 1, #arg_list do
		local arg = arg_list[ i ]
		local 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_msg )
	local frame = mw.getCurrentFrame()
	local error_category = frame.args.error_category or 'Errors reported by Module 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">String Module Error: ' .. error_msg .. '</strong>'
	if error_category ~= '' and not str._getBoolean( no_category ) then
		error_str = '[[Category:' .. 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( 'No boolean value found' )
	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