Latest revision |
Your text |
Line 96: |
Line 96: |
| end | | end |
| | | |
− | --[[
| |
− | This function implements that features of {{str sub old}} and is kept in order
| |
− | to maintain these older templates.
| |
− | ]]
| |
| function str.sublength( frame ) | | function str.sublength( frame ) |
| local i = tonumber( frame.args.i ) or 0 | | local i = tonumber( frame.args.i ) or 0 |
Line 106: |
Line 102: |
| end | | 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|pos|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 ) | | function str.match( frame ) |
− | local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} ); | + | return mw.ustring.match( frame.args.s, frame.args.pattern, tonumber( frame.args.i ) ) |
− | 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 | | end |
| | | |
Line 381: |
Line 271: |
| | | |
| return result; | | 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( 'function rep expects a number as second parameter, received "' .. ( frame.args[2] or '' ) .. '"' )
| |
− | end
| |
− | return string.rep( frame.args[1] or '', repetitions )
| |
| end | | end |
| | | |