יחידה:String: הבדלים בין גרסאות בדף

improves commenting, adds whitespace and error handling to sub, improvements to error handling generally.
מ 16 גרסאות של הדף wikipedia:he:יחידה:String יובאו
 
(46 גרסאות ביניים של 15 משתמשים אינן מוצגות)
שורה 15: שורה 15:
     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]. If set to an empty
         [Category:Errors reported by Module String].
        string, no category will be added during an error.  
       
    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.
]]
]]


שורה 80: שורה 84:
     if j < 0 then
     if j < 0 then
         j = len + j + 1;
         j = len + j + 1;
    end
    if j < i then
        return str._error( 'String subset indices out of order' );
     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
    if j < i then
        return str._error( 'String subset indices out of order' );
     end
     end
      
      
שורה 92: שורה 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
שורה 98: שורה 106:
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 )
     return mw.ustring.match( frame.args.s, frame.args.pattern, tonumber( frame.args.i ) )
     local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', '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
        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


שורה 255: שורה 369:
     if plain then
     if plain then
         pattern = str._escapePattern( pattern );
         pattern = str._escapePattern( pattern );
         replace = str._escapePattern( replace );
         replace = mw.ustring.gsub( replace, "%%", "%%%%" ); --Only need to escape replacement sequences.
     end
     end
      
      
שורה 268: שורה 382:
     return result;
     return result;
end
end
--[[
"Reverse" reverses a string, a'la string.reverse()
]]
str.reverse = function( frame )
    local tab = mw.text.split( frame.args[1] or '', '' )
    local restab = {}
    for i = #tab, 1, -1 do table.insert( restab, tab[i] ) end
    return table.concat( restab )
end
str['היפוך'] = str.reverse


--[[
--[[
שורה 297: שורה 423:
function str._error( error_str )
function str._error( error_str )
     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 'שגיאות טיפול במחרוזת';
     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;
      
      
     if str._getBoolean(ignore_errors) then
     if str._getBoolean(ignore_errors) then
שורה 305: שורה 432:
      
      
     local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>';
     local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>';
     if error_category ~= '' then
     if error_category ~= '' and not str._getBoolean( no_category ) then
        error_str = '[[Category:' .. error_category .. ']]' .. error_str;
    if mw.title.getCurrentTitle().namespace ~= 10 then
        error_str = '[[Category:' .. error_category .. ']]' .. error_str;
        end
     end         
     end         
      
      
שורה 320: שורה 449:
     if type( boolean_str ) == 'string' then
     if type( boolean_str ) == 'string' then
         boolean_str = boolean_str:lower();
         boolean_str = boolean_str:lower();
         if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0' then
         if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'
                or boolean_str == '' then
             boolean_value = false;
             boolean_value = false;
         else
         else
שורה 339: שורה 469:
function str._escapePattern( pattern_str )
function str._escapePattern( pattern_str )
     return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" );
     return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" );
end
--[[
contains_any
This function returns the first matched element or empty string
Usage:
{{#invoke:String|contains_any|string|search1|search2|search3...}}
Parameters
    1: string
    2...: strings to search within the first string
]]
function str.contains_any( frame )
for i,v in pairs(frame.args) do
if i>1 then
local m=mw.ustring.find( frame.args[1], v, 0, true)
if m then
    return v
    end
end
    end
    return
end
--[[
contains_any_csv
This function returns the first matched element or empty string.
Usage:
{{#invoke:String|contains_any_csv|string|search1,search2,search3}}
Parameters
    1: string
    2: comma seperated list of strings to search within the first string
]]
function str.contains_any_csv( frame )
for word in mw.ustring.gmatch(frame.args[2], '([^,]+)') do
local m=mw.ustring.find( frame.args[1], word, 0, true)
if m then
    return word
  end
    end
    return
end
str.rep = function( frame )
local strval, repval = frame.args[1] or '', tonumber( frame.args[2] )
if not repval then return '' end
return string.rep( strval, repval )
end
str.join = function(frame)
local res = {}
local sep = ', '
for k,v in pairs(frame.args) do
if k=='sep' then
sep = v
else
if #v>0 then -- avoid empty string
table.insert(res, v)
end
end
end
return table.concat( res, sep)
end
str.encode = function(frame)
return mw.text.encode( frame.args[1] or "" )
end
str["קידוד"] = str.encode
str['מיצוי מספר'] = function(frame)
local s = frame.args[1]
local def = frame.args[2] or ''
if not s then return def end
local int, frac = s:match('[^%d.-]*(%-?[%d,]*)(%.%d+)')
if int or frac then
int = string.gsub(int or '', ',', '') -- remove commas
frac = frac or ''
return int .. frac
end
int = s:match('[^%d.-]*(%-?[%d,]*)')
int = int and string.gsub(int or '', ',', '')
return int or def
end
end


return str
return str