Module:String: Difference between revisions
Update to allow for unnamed parameters. This is necessary because some string function need to preserve leading / trailing whitespace in order to work properly.
m>Dragons flight (add support for finding the position of a string or pattern inside another string.) |
m>Dragons flight (Update to allow for unnamed parameters. This is necessary because some string function need to preserve leading / trailing whitespace in order to work properly.) |
||
Line 27: | Line 27: | ||
Returns the first index in "source" that is a match to "target". Indexing is 1-based, | Returns the first index in "source" that is a match to "target". Indexing is 1-based, | ||
and the function returns -1 if the "target" string is not present in "source" | and the function returns -1 if the "target" string is not present in "source". | ||
Important Note: If the "target" string is empty / missing, this function returns a | Important Note: If the "target" string is empty / missing, this function returns a | ||
Line 35: | Line 34: | ||
]====] | ]====] | ||
function str.str_find( frame ) | function str.str_find( frame ) | ||
local | local new_args = str._getParameters( frame.args, {'source', 'target'} ); | ||
local target_str = | local source_str = new_args['source'] or ''; | ||
local target_str = new_args['target'] or ''; | |||
if target_str == '' then | |||
return 1; | return 1; | ||
end | end | ||
Line 55: | Line 56: | ||
string. | string. | ||
Parameters | Usage: | ||
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}} | |||
OR | |||
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}} | |||
Parameters | |||
source: The string to search | source: The string to search | ||
target: The string or pattern to find within source | target: The string or pattern to find within source | ||
Line 61: | Line 67: | ||
plain: Boolean flag indicating that target should be understood as plain | plain: Boolean flag indicating that target should be understood as plain | ||
text and not as a Lua style regular expression, defaults to true | text and not as a Lua style regular expression, defaults to true | ||
If invoked using named parameters, Mediawiki will automatically remove any leading or | |||
trailing whitespace from the parameter. In some circumstances this is desirable, in | |||
other cases one may want to preserve the whitespace. | |||
This function returns the first index >= "start" where "target" can be found | This function returns the first index >= "start" where "target" can be found | ||
within "source". Indices are 1-based. If "target" is not found, then this | within "source". Indices are 1-based. If "target" is not found, then this | ||
Line 67: | Line 77: | ||
function also returns 0. | function also returns 0. | ||
This function should be safe for UTF-8 strings. | |||
UTF-8 strings. | |||
]====] | ]====] | ||
function str.find( frame ) | function str.find( frame ) | ||
local | local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } ); | ||
local pattern = | local source_str = new_args['source'] or ''; | ||
local start_pos = tonumber( | local pattern = new_args['target'] or ''; | ||
local plain = | local start_pos = tonumber(new_args['start']) or 1; | ||
local plain = new_args['plain'] or true; | |||
if source_str == '' or pattern == '' then | if source_str == '' or pattern == '' then | ||
Line 97: | Line 106: | ||
return start | return start | ||
end | end | ||
--[====[ | |||
Helper function that populates the argument list given that user may need to use a mix of | |||
named and unnamed parameters. This is relevant because named parameters are not | |||
identical to unnamed parameters due to string trimming, and when dealing with strings | |||
we sometimes want to either preserve or remove that whitespace depending on the application. | |||
]====] | |||
function str._getParameters( frame_args, arg_list ) | |||
local new_args = {}; | |||
local index = 1; | |||
local value; | |||
for i,arg in ipairs( arg_list ) do | |||
value = frame_args[arg] | |||
if value == nil then | |||
value = frame_args[index]; | |||
index = index + 1; | |||
end | |||
new_args[arg] = value; | |||
end | |||
return new_args; | |||
end | |||
return str | return str |