« Module:String » : différence entre les versions
Aller à la navigation
Aller à la recherche
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| | {{#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 = | 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| | {{#invoke:String|rep|s|n}} | ||
Paramètres : | Paramètres : | ||
la chaîne ' | la chaîne 's' dont on veut répeter | ||
l'entier ' | 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 | ||
return mw.ustring.rep( s, n ) | |||
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( | 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: ' .. | 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() |