Module:String: Difference between revisions

14,925 bytes added ,  12 years ago
add nomatch option to str.match
(Undo revision 652101 (it's breaking {Str sub}} and {{git}}) by Dragons flight (talk))
m>WOSlinker
(add nomatch option to str.match)
Line 1: Line 1:
local p = {}
--[[ 


function p.length( frame )
This module is intended to provide access to basic string functions.
    local arg1 = frame.args[1]
    return string.len( arg1 )
end   


function p.sub( frame )
Most of the functions provided here can be invoked with named parameters,
     local arg1 = frame.args[1]
unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will
     local arg2 = tonumber( frame.args[2] )
automatically remove any leading or trailing whitespace from the parameter. 
     local arg3 = tonumber( frame.args[3] )
Depending on the intended use, it may be advantageous to either preserve or
     if arg2 and arg3 then
remove such whitespace.
         local first = arg2 + 1
 
         local last  = arg2 + arg3
Global options
         return string.sub( arg1, first, last )
    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}}