Module:String: Difference between revisions
Content added Content deleted
Enwikipedia>Dragons flight (fix pattern escape in replace function) |
Enwikipedia>Dragons flight (adds updated match support with wider parameter choices, whitespace handling, etc.) |
||
Line 96: | Line 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 |
||
Line 102: | Line 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}} |
|||
OR |
|||
{{#invoke:String|pos|s=source_string|pattern=pattern_string|start=start_index |
|||
|match=match_number|plain=plain_flag}} |
|||
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_flag: A flag indicating that the pattern should be understood as plain |
|||
text. Defaults to false. |
|||
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 ) |
||
local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain'} ); |
|||
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 ); |
|||
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 |
|||
return str._error( 'Match not found' ); |
|||
else |
|||
return result; |
|||
end |
|||
end |
end |
||