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

Aller à la navigation Aller à la recherche
766 octets ajoutés ,  16 février 2024
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()
m (1 version importée)
Modèle:Infobox Musique (œuvre)>Od1n
(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())
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 358 : Ligne 364 :


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


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


Ligne 381 : Ligne 381 :
This function counts the number of occurrences of one string in another.
This function counts the number of occurrences of one string in another.
]]
]]
function str.count(frame)
function str.count( frame )
local args = str._getParameters(frame.args, {'source', 'pattern', 'plain'})
local args = str._getParameters( frame.args, { 'source', 'pattern', 'plain' } )
local source = args.source or ''
local source = args.source or ''
local pattern = args.pattern or ''
local pattern = args.pattern or ''
local plain = str._getBoolean(args.plain or true)
local plain = str._getBoolean( args.plain or true )
if plain then
if plain then
pattern = str._escapePattern(pattern)
pattern = str._escapePattern( pattern )
end
end
local _, count = mw.ustring.gsub(source, pattern, '')
local _, count = mw.ustring.gsub( source, pattern, '' )
return count
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
end


Ligne 403 : 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 420 : 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 443 : 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()

Menu de navigation