Vés al contingut

Mòdul:StringFunc

De Viquidites

Aquest mòdul conté funcions complementàries a les del Mòdul:String. A diferència d'aquest últim, les funcions no han estat provades extensament i poden contenir errors.

Suprimeix caràcters de la cadena. Sintaxi:

{{#invoke:StringFunc|strip|cadena|caràcters|text_pla}}
{{#invoke:StringFunc|strip|source=cadena|chars=caràcters|plain=text_pla}}

Paràmetres:

source: La cadena a tractar
chars: El patró o llista de caràcters a suprimir de la cadena
plain: Indicador sobre si el paràmetre chars ha de ser entès com a text pla (si és true) o si ha de ser entès com a expressió regular de tipus Lua (si és false). Per defecte és true.

Els espais en blanc del principi i el final també se suprimeixen de la cadena

Trosseja una cadena segons un separador, i retorna el tros n-èssim, segons l'índex donat. Sintaxi:

{{#invoke:StringFunc|split|cadena|separador|índex}}
{{#invoke:StringFunc|split|source=cadena|separator=separador|count=índex}}

Paràmetres:

source: La cadena a tractar
separator: El separador pel qual s'ha de trossejar la cadena
count: L'índex del tros a retornar

Estableix si la cadena és un nombre. Sintaxi:

{{#invoke:StringFunc|isNumber|cadena}}
{{#invoke:StringFunc|isNumber|source=cadena}}

Paràmetres:

source: La cadena a tractar

local p = {}

--[[ 
Strip

This function Strips charecters from string

Usage:
{{#invoke:StringFunc|strip|source_string|charecters_to_strip|plain_flag}}

Parameters
	source: The string to strip
	chars:  The pattern or list of charecters 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 '';
	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 separator, returns nth substring based on count.

Usage:
{{#invoke:StringFunc|split|source_string|separator|count}}

Parameters:
	source:    The string to return a subset of
	separator: The string to split on 
	count:     The nth substring based on the separator to return
]]
function p.split( frame )
	local new_args = p._getParameters( frame.args, {'source', 'separator', 'count'} )
	local source_str = new_args['source'] or '';
	local separator = new_args['separator'] or '';
	local separator_len = mw.ustring.len(separator);
	if source_str == '' or separator == '' then
		return source_str;
	end
	local ret_count = tonumber( new_args['count'] ) or 1;
	if ret_count < 1 then
		return "";
	end
	local start = 1;
	local iter = mw.ustring.find(source_str, separator, start, true);
	if iter == nil then
		if ret_count == 1 then
			return source_str;
		else
			return "";
		end
	else
		iter = iter - 1;
	end
	if ret_count == 1 then
		return mw.ustring.sub( source_str, start, iter);
	end
    for i=2, ret_count do
    	start = iter+separator_len + 1;
    	iter = mw.ustring.find(source_str, separator, start, true);
    	if iter == nil then
    		if ret_count == i then
    			return mw.ustring.sub(source_str, start, mw.ustring.len(source_str));
    		else
    			return "";
    		end
    	else
    		iter = iter - 1;
    	end
    end
    return mw.ustring.sub( source_str,start,iter); 
end

function p.isNumber( frame )
	local new_args = p._getParameters( frame.args, {'source'} )
	local source_str = new_args['source'] or ''
	if source_str == '' then
	   return "false"
	end
	if tonumber(source_str) == nil and tonumber(string.gsub(source_str, ",", ".", 1) .. '') == 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 charecters 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