Module:String: Difference between revisions
(export str._match function for use in other modules - syncing from sandbox) |
m (9 revisions imported from wikipedia:Module:String: see Topic:Vtixlm0q28eo6jtf) |
||
| (6 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 | |||
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: | ||
strmatch = require("Module:String")._match | |||
sresult = strmatch( s, pattern, start, match, plain, nomatch ) | |||
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. | ||
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 149: | Line 138: | ||
]] | ]] | ||
-- This sub-routine is exported for use in other modules | -- This sub-routine is exported for use in other modules | ||
function str._match( s, pattern, start, match_index, | function str._match( s, pattern, start, match_index, plain_flag, 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 | 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 | |||