Module:String: Difference between revisions

    From Nonbinary Wiki
    m (use tabs instead of spaces, and remove trailing whitespace)
    m (9 revisions imported from wikipedia:Module:String: see Topic:Vtixlm0q28eo6jtf)
     
    (7 intermediate revisions by 3 users not shown)
    Line 42: Line 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
    Line 71: Line 71:
    ]]
    ]]
    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 )


    -- Convert negatives for range checking
    -- Convert negatives for range checking
    if i < 0 then
    if i < 0 then
    i = len + i + 1;
    i = len + i + 1
    end
    end
    if j < 0 then
    if j < 0 then
    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' )
    end
    end
    if j < i then
    if j < i then
    return str._error( 'String subset indices out of order' );
    return str._error( 'String subset indices out of order' )
    end
    end


    Line 107: Line 107:


    --[[
    --[[
    match
    _match


    This function returns a substring from the source string that matches a
    This function returns a substring from the source string that matches a
    specified pattern.
    specified pattern. It is exported for use in other modules


    Usage:
    Usage:
    {{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
    strmatch = require("Module:String")._match
    OR
    sresult = strmatch( s, pattern, start, match, plain, nomatch )
    {{#invoke:String|pos|s=source_string|pattern=pattern_string|start=start_index
        |match=match_number|plain=plain_flag|nomatch=nomatch_output}}


    Parameters
    Parameters
    Line 131: Line 129:
             text.  Defaults to false.
             text.  Defaults to false.
         nomatch: If no match is found, output the "nomatch" value rather than an error.
         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:
    For information on constructing Lua patterns, a form of [regular expression], see:
    Line 148: Line 137:


    ]]
    ]]
    function str.match( frame )
    -- This sub-routine is exported for use in other modules
    local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} );
    function str._match( s, pattern, start, match_index, plain_flag, 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'];