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'];
     
    if s == '' then
    if s == '' then
    return str._error( 'Target string is empty' );
    return str._error( 'Target string is empty' )
    end
    end
    if pattern == '' then
    if pattern == '' then
    return str._error( 'Pattern string is empty' );
    return str._error( 'Pattern string is empty' )
    end
    end
    start = tonumber(start) or 1
    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
    if match_index == 0 then
    if match_index == 0 then
    return str._error( 'Match index is out of range' );
    return str._error( 'Match index is out of range' )
    end
    end
    if plain_flag then
    if plain_flag then
    pattern = str._escapePattern( pattern );
    pattern = str._escapePattern( pattern )
    end
    end


    Line 179: Line 162:
    else
    else
    if start > 1 then
    if start > 1 then
    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
    for w in iterator do
    for w in iterator do
    match_index = match_index - 1;
    match_index = match_index - 1
    if match_index == 0 then
    if match_index == 0 then
    result = w;
    result = w
    break;
    break
    end
    end
    end
    end
    else
    else
    -- Reverse search
    -- Reverse search
    local result_table = {};
    local result_table = {}
    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
    Line 207: Line 190:
    if result == nil then
    if result == nil then
    if nomatch == nil then
    if nomatch == nil then
    return str._error( 'Match not found' );
    return str._error( 'Match not found' )
    else
    else
    return nomatch;
    return nomatch
    end
    end
    else
    else
    return result;
    return result
    end
    end
    end
    --[[
    match
    This function returns a substring from the source string that matches a
    specified pattern.