Module:String: Difference between revisions
Content added Content deleted
(add support for finding the position of a string or pattern inside another string.) |
(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". |
||
strings have any leading or trailing whitespace removed before searching. |
|||
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 |
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. |
||
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}} |
|||
⚫ | |||
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. |
|||
Both "source" and "target" will be trimmed so that any leading or trailing |
|||
whitespace is removed prior to searching. This function should be safe for |
|||
UTF-8 strings. |
|||
]====] |
]====] |
||
function str.find( frame ) |
function str.find( frame ) |
||
local |
local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } ); |
||
local |
local source_str = new_args['source'] or ''; |
||
local |
local pattern = new_args['target'] or ''; |
||
local |
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; |
|||
⚫ | |||
new_args[arg] = value; |
|||
end |
|||
return new_args; |
|||
end |
|||
return str |
return str |