יחידה: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]. | [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. | |||
]] | ]] | ||
| שורה 80: | שורה 84: | ||
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 | |||
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 | 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 = | 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 ' | 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 | ||
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 | ||