Módulo:StringFunc
Este módulo pode ter sua documentação deficiente. Por favor, documente-o ou melhore suas explicações caso o saiba usar ou tenha conhecimentos para tal. |
Este módulo está classificado como pré-alfa. Ele está incompleto, e pode ou não estar em desenvolvimento activo. Ele deve ser utilizado desde páginas do domínio artigos. Os módulos ficam em pre-alfa até o editor original (ou alguém que toma conta se ele for abandonado por algum tempo) está satisfeito com a estrutura básica. |
Este módulo é usado em aproximadamente 16 000 páginas. (Ver Wikipedia:Predefinições em alto risco) Para evitar sobrecargas desnecessárias ao servidor e outros transtornos, quaisquer mudanças devem ser previamente testadas, seja na subpágina de testes deste módulo, na subpágina de testes de módulos (ou ainda em sua subpágina de testes). Por favor, sempre considere expor eventuais mudanças na página de discussão, antes de implementá-las. |
Descrição
Este módulo tem funções auxiliares de cadeias de texto.
Uso
Outra documentação:
local p = {}
--[[
Strip
This function Strips characters from string
Usage:
{{#invoke:StringFunc|strip|source_string|characters_to_strip|plain_flag}}
Parameters
source: The string to strip
chars: The pattern or list of characters to strip from string, replaced with ''
plain: A flag indicating that the chars should be understood as plain text. defaults to true.
Leading and trailing whitespace is also automatically stripped from the string.
]]
function p.strip( frame )
local new_args = p._getParameters( frame.args, {'source', 'chars', 'plain'} )
local source_str = new_args['source'] or '';
local chars = new_args['chars'] or '' or 'characters';
source_str = mw.text.trim(source_str);
if source_str == '' or chars == '' then
return source_str;
end
local l_plain = p._getBoolean( new_args['plain'] or true );
if l_plain then
chars = p._escapePattern( chars );
end
local result;
result = mw.ustring.gsub(source_str, "["..chars.."]", '')
return result;
end
--[[
Split
This function Splits a string based on a pattern, returns nth substring based on count.
Usage:
{{#invoke:StringFunc|split|source_string|pattern|count|plain}}
Parameters:
source: The string to return a subset of
pattern: The pattern or string to split on
count: The nth substring based on the pattern to return
plain: A flag indicating if the pattern should be understood as plain text, defaults to true.
substrings: A flag to return the number of substrings instead of string, defaults to false.
]]
function p.split( frame )
local new_args = p._getParameters( frame.args, {'source', 'pattern', 'count', 'plain', 'substrings'} )
local source_str = new_args['source'] or '';
local pattern = new_args['pattern'] or '';
local substrings = p._getBoolean( new_args['substrings'] or false);
if source_str == '' or pattern == '' then
return source_str;
end
local l_plain = p._getBoolean( new_args['plain'] or true );
local iteradd = 1
local leng = mw.ustring.len(pattern)
if l_plain then
pattern = p._escapePattern( pattern );
iteradd = mw.ustring.len(pattern)
end
-- Not going to work correctly. More testing needed.
if leng ~= iteradd and l_plain == true then
l_plain = false;
iteradd = leng;
end
local ret_count = tonumber( new_args['count'] ) or 1;
local start = 1;
local iter = mw.ustring.find(source_str, pattern, start, l_plain);
if iter == nil then --No match found
if substring then
return 0
end
if ret_count == 1 then --If not asking for first substring return blank.
return source_str;
end
return '';
end
if iter == start then --we have a match;
iter = iter+iteradd --move starting postion
while(mw.ustring.find(source_str, pattern, iter, l_plain) == iter) do --check for match
iter = iter+iteradd --keep moving starting position
if(mw.ustring.len(source_str) <= iter) then
if substring then
return 0
end
return ''
end
end
--we have found a non-match so reset
start = iter
iter = mw.ustring.find(source_str, pattern, start, l_plain)
if iter == nil then --we are at the end of the string
if ret_count ~= 1 then
if substring then
return '1'
end
return ''
end
iter = mw.ustring.len(source_str)+1
end
end
if ret_count == 1 and substring == false then
return mw.ustring.sub( source_str, start, iter-1);
end
if substring then
ret_count=2 -- so it goes at least once more
end
for i=2, ret_count do
start = iter+iteradd;
iter = mw.ustring.find(source_str, pattern, start, l_plain);
if iter == start then --we have a match;
iter = iter+iteradd --move starting postion
while(mw.ustring.find(source_str, pattern, iter, l_plain) == iter) do --check for match
iter = iter+iteradd --keep moving starting position
end
--we have found a non-match so reset
start = iter
iter = mw.ustring.find(source_str, pattern, start, l_plain)
if iter == nil and i<ret_count then --at end of string and not what we are looking for
if substring then
return ret_count-1;
end
return ''
end
end
if iter == nil then
iter = mw.ustring.len(source_str)+1
break
end
if substring then
ret_count = ret_count+1 --count substrings, we have one, check for the next
end
end
if substring then
return ret_count-1; --went to far in substrings, return number of substrings
end
return mw.ustring.sub( source_str,start,iter-1);
end
function p.isNumber( frame )
local new_args = p._getParameters( frame.args, {'source'} );
local source_str = new_args['source'] or '';
if source_str == '' or source_str == '123123123125125125' then
return "false";
end
if tonumber(source_str) == nil then
return "false";
end
return "true"
end
-- Argument list helper function, as per Module:String
function p._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
-- Escape Pattern helper function so that all characters are treated as plain text, as per Module:String
function p._escapePattern( pattern_str)
return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" );
end
-- Helper Function to interpret boolean strings, as per Module:String
function p._getBoolean( boolean_str )
local boolean_value;
if type( boolean_str ) == 'string' then
boolean_str = boolean_str:lower();
if boolean_str == 'false' or boolean_str == 'no' or boolean_str == 'O' or boolean_str == '' then
boolean_value = false;
else
boolean_value = true;
end
elseif type(boolean_str) == 'boolean' then
boolean_value = boolean_str;
else
error( 'No boolean value found' );
end
return boolean_value
end
return p