<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://guanches.org/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AString</id>
	<title>Módulo:String - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://guanches.org/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AString"/>
	<link rel="alternate" type="text/html" href="https://guanches.org/index.php?title=M%C3%B3dulo:String&amp;action=history"/>
	<updated>2026-04-07T06:09:14Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://guanches.org/index.php?title=M%C3%B3dulo:String&amp;diff=218124&amp;oldid=prev</id>
		<title>GeminiFix en 19:13 6 feb 2026</title>
		<link rel="alternate" type="text/html" href="https://guanches.org/index.php?title=M%C3%B3dulo:String&amp;diff=218124&amp;oldid=prev"/>
		<updated>2026-02-06T19:13:57Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[  &lt;br /&gt;
Este módulo está destinado a proporcionar acceso a las funciones de cadena (string) básicas.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local str = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
len&lt;br /&gt;
&lt;br /&gt;
Parametros&lt;br /&gt;
    s: La cadena a encontrar su longitud &lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
function str.len( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;s&amp;#039;} );&lt;br /&gt;
    local s = new_args[&amp;#039;s&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    return mw.ustring.len( s )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
sub&lt;br /&gt;
&lt;br /&gt;
Parametros&lt;br /&gt;
    s: La cadena donde extraer la subcadena &lt;br /&gt;
    i: La cadena donde extraer la subcadena.&lt;br /&gt;
    j: Índice final de la subcadena, por defecto la longitud total, hasta el último carácter.&lt;br /&gt;
    &lt;br /&gt;
]]&lt;br /&gt;
function str.sub( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, { &amp;#039;s&amp;#039;, &amp;#039;i&amp;#039;, &amp;#039;j&amp;#039; } );&lt;br /&gt;
    local s = new_args[&amp;#039;s&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local i = tonumber( new_args[&amp;#039;i&amp;#039;] ) or 1;&lt;br /&gt;
    local j = tonumber( new_args[&amp;#039;j&amp;#039;] ) or -1;&lt;br /&gt;
    &lt;br /&gt;
    local len = mw.ustring.len( s );&lt;br /&gt;
&lt;br /&gt;
    -- Convertir negativos para la comprobación de rango&lt;br /&gt;
    if i &amp;lt; 0 then&lt;br /&gt;
        i = len + i + 1;&lt;br /&gt;
    end&lt;br /&gt;
    if j &amp;lt; 0 then&lt;br /&gt;
        j = len + j + 1;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if i &amp;gt; len or j &amp;gt; len or i &amp;lt; 1 or j &amp;lt; 1 then&lt;br /&gt;
        return str._error( &amp;#039;Índice fuera del rango de la cadena&amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    if j &amp;lt; i then&lt;br /&gt;
        return str._error( &amp;#039;Índices de la cadena no ordenados&amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return mw.ustring.sub( s, i, j )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
match&lt;br /&gt;
&lt;br /&gt;
Parametros&lt;br /&gt;
   s: cadena donde se hace la búsqueda &lt;br /&gt;
   pattern: patrón o cadena a buscar. &lt;br /&gt;
   start: índice de la cadena dónde empezar a buscar, por defecto 1, el primer carácter. &lt;br /&gt;
   match: si se encuentran múltiples coincidencias, especifica cuál de ellas devolver. Por defecto es 1, l&lt;br /&gt;
       la primera coincidencia encontrada. Un número negativo cuenta desde el final, por lo tanto &lt;br /&gt;
       match = -1 es la última coincidencia. &lt;br /&gt;
   plain: indica si el patrón debe interpretarse como texto limpio, por defecto &amp;#039;false&amp;#039;. nomatch: en caso de &lt;br /&gt;
       no encontrar ninguna coincidencia, devuelve el valor de &amp;quot;nomatch&amp;quot; en lugar de un error. &lt;br /&gt;
       Si el número match o el índice start están fuera del rango de la cadena, entonces la función genera un error. &lt;br /&gt;
       También genera un error si no encuentra ninguna coincidencia. &lt;br /&gt;
       Con el parámetro global ignore_errors = true se suprime el    &lt;br /&gt;
       error y devuelve una cadena vacía.&lt;br /&gt;
]]&lt;br /&gt;
function str.match( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;s&amp;#039;, &amp;#039;pattern&amp;#039;, &amp;#039;start&amp;#039;, &amp;#039;match&amp;#039;, &amp;#039;plain&amp;#039;, &amp;#039;nomatch&amp;#039;} );&lt;br /&gt;
    local s = new_args[&amp;#039;s&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local start = tonumber( new_args[&amp;#039;start&amp;#039;] ) or 1;&lt;br /&gt;
    local plain_flag = str._getBoolean( new_args[&amp;#039;plain&amp;#039;] or false );&lt;br /&gt;
    local pattern = new_args[&amp;#039;pattern&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local match_index = math.floor( tonumber(new_args[&amp;#039;match&amp;#039;]) or 1 );&lt;br /&gt;
    local nomatch = new_args[&amp;#039;nomatch&amp;#039;];&lt;br /&gt;
    &lt;br /&gt;
    if s == &amp;#039;&amp;#039; then&lt;br /&gt;
        return str._error( &amp;#039;La cadena donde buscar está vacía&amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    if pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
        return str._error( &amp;#039;La cadena de búsqueda está vacía &amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    if math.abs(start) &amp;lt; 1 or math.abs(start) &amp;gt; mw.ustring.len( s ) then&lt;br /&gt;
        return str._error( &amp;#039;Índice d\&amp;#039;inicio fuera del rango de la cadena &amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    if match_index == 0 then&lt;br /&gt;
        return str._error( &amp;#039;Número de coincidencias fuera de rango&amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    if plain_flag then&lt;br /&gt;
        pattern = str._escapePattern( pattern );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local result&lt;br /&gt;
    if match_index == 1 then&lt;br /&gt;
        -- Encontrar la primera coincidencia es un caso sencillo.&lt;br /&gt;
        result = mw.ustring.match( s, pattern, start )&lt;br /&gt;
    else&lt;br /&gt;
        if start &amp;gt; 1 then&lt;br /&gt;
            s = mw.ustring.sub( s, start );&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        local iterator = mw.ustring.gmatch(s, pattern);&lt;br /&gt;
        if match_index &amp;gt; 0 then&lt;br /&gt;
            -- Búsqueda hacia adelante&lt;br /&gt;
            for w in iterator do&lt;br /&gt;
                match_index = match_index - 1;&lt;br /&gt;
                if match_index == 0 then&lt;br /&gt;
                    result = w;&lt;br /&gt;
                    break;&lt;br /&gt;
                end&lt;br /&gt;
            end    &lt;br /&gt;
        else&lt;br /&gt;
            -- Invierte búsqueda&lt;br /&gt;
            local result_table = {};&lt;br /&gt;
            local count = 1;&lt;br /&gt;
            for w in iterator do&lt;br /&gt;
                result_table[count] = w;&lt;br /&gt;
                count = count + 1;&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            result = result_table[ count + match_index ];            &lt;br /&gt;
        end&lt;br /&gt;
    end        &lt;br /&gt;
    &lt;br /&gt;
    if result == nil then&lt;br /&gt;
        if nomatch == nil then&lt;br /&gt;
            return str._error( &amp;#039;Ninguna coincidencia encontrada&amp;#039; );&lt;br /&gt;
        else&lt;br /&gt;
            return nomatch;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        return result;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
pos&lt;br /&gt;
&lt;br /&gt;
Parámetros&lt;br /&gt;
   target: Cadena donde buscar. &lt;br /&gt;
   pos: Índice del carácter a devolver. &lt;br /&gt;
]]&lt;br /&gt;
function str.pos( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;target&amp;#039;, &amp;#039;pos&amp;#039;} );&lt;br /&gt;
    local target_str = new_args[&amp;#039;target&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local pos = tonumber( new_args[&amp;#039;pos&amp;#039;] ) or 0;&lt;br /&gt;
&lt;br /&gt;
    if pos == 0 or math.abs(pos) &amp;gt; mw.ustring.len( target_str ) then&lt;br /&gt;
        return str._error( &amp;#039;Índice fuera del rango de la cadena&amp;#039; );&lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    return mw.ustring.sub( target_str, pos, pos );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
find&lt;br /&gt;
&lt;br /&gt;
Parametros&lt;br /&gt;
    source: Cadena donde buscar. &lt;br /&gt;
    target: Cadena a buscar o patrón de búsqueda. &lt;br /&gt;
    start: Índice de la cadena fuente donde empezar a buscar, por defecto 1, el primer carácter. &lt;br /&gt;
    plain: Indica si la búsqueda debe interpretarse como texto limpio, de lo contrario como patrón Lua. &lt;br /&gt;
        Por defecto es &amp;#039;true&amp;#039;.&lt;br /&gt;
]]&lt;br /&gt;
function str.find( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;source&amp;#039;, &amp;#039;target&amp;#039;, &amp;#039;start&amp;#039;, &amp;#039;plain&amp;#039; } ); &lt;br /&gt;
    local source_str = new_args[&amp;#039;source&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local pattern = new_args[&amp;#039;target&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local start_pos = tonumber(new_args[&amp;#039;start&amp;#039;]) or 1;&lt;br /&gt;
    local plain = new_args[&amp;#039;plain&amp;#039;] or true;&lt;br /&gt;
        &lt;br /&gt;
    if source_str == &amp;#039;&amp;#039; or pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
        return 0;&lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    plain = str._getBoolean( plain );&lt;br /&gt;
&lt;br /&gt;
    local start = mw.ustring.find( source_str, pattern, start_pos, plain )&lt;br /&gt;
    if start == nil then&lt;br /&gt;
        start = 0&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
replace&lt;br /&gt;
&lt;br /&gt;
Parámetros&lt;br /&gt;
    source: Cadena donde buscar &lt;br /&gt;
    pattern: Cadena de búsqueda o patrón a buscar &lt;br /&gt;
    replace: Texto de reemplazo &lt;br /&gt;
    count: Número de ocurrencias a reemplazar, por defecto todas. &lt;br /&gt;
    plain: Indica si la búsqueda debe interpretarse como texto limpio, de lo contrario como patrón Lua. Por &lt;br /&gt;
        defecto es &amp;#039;true&amp;#039; &lt;br /&gt;
]]&lt;br /&gt;
function str.replace( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;source&amp;#039;, &amp;#039;pattern&amp;#039;, &amp;#039;replace&amp;#039;, &amp;#039;count&amp;#039;, &amp;#039;plain&amp;#039; } ); &lt;br /&gt;
    local source_str = new_args[&amp;#039;source&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local pattern = new_args[&amp;#039;pattern&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local replace = new_args[&amp;#039;replace&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local count = tonumber( new_args[&amp;#039;count&amp;#039;] );&lt;br /&gt;
    local plain = new_args[&amp;#039;plain&amp;#039;] or true;&lt;br /&gt;
        &lt;br /&gt;
    if source_str == &amp;#039;&amp;#039; or pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
        return source_str;&lt;br /&gt;
    end    &lt;br /&gt;
    plain = str._getBoolean( plain );&lt;br /&gt;
&lt;br /&gt;
    if plain then&lt;br /&gt;
        pattern = str._escapePattern( pattern );&lt;br /&gt;
        replace = mw.ustring.gsub( replace, &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot; ); --Sólo es necesario secuencias de escape.&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local result;&lt;br /&gt;
&lt;br /&gt;
    if count ~= nil then&lt;br /&gt;
        result = mw.ustring.gsub( source_str, pattern, replace, count );&lt;br /&gt;
    else&lt;br /&gt;
        result = mw.ustring.gsub( source_str, pattern, replace );&lt;br /&gt;
    end        &lt;br /&gt;
&lt;br /&gt;
    return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
count&lt;br /&gt;
&lt;br /&gt;
Esta funsción cuenta el número de existencias de un carácter o una cadena (no supuerpuestos) dentro de otra cadena.&lt;br /&gt;
]]&lt;br /&gt;
function str.count(frame)&lt;br /&gt;
	local args = str._getParameters(frame.args, {&amp;#039;source&amp;#039;, &amp;#039;pattern&amp;#039;, &amp;#039;plain&amp;#039;})&lt;br /&gt;
	local source = args.source or &amp;#039;&amp;#039;&lt;br /&gt;
	local pattern = args.pattern or &amp;#039;&amp;#039;&lt;br /&gt;
	local plain = str._getBoolean(args.plain or true)&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern(pattern)&lt;br /&gt;
	end&lt;br /&gt;
	local _, count = mw.ustring.gsub(source, pattern, &amp;#039;&amp;#039;)&lt;br /&gt;
	return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function str.mayuscula(frame) -- Convierte en mayúsculas la primera letra que aparece en la edición de una cadena&lt;br /&gt;
    local s = frame.args[1] or &amp;#039;&amp;#039;;&lt;br /&gt;
    if s  ~= &amp;#039;&amp;#039; then        &lt;br /&gt;
        local cambio = {};&lt;br /&gt;
        local modo = {};&lt;br /&gt;
        if string.find(s, &amp;#039;|&amp;#039;) ~= nil then -- Enlaces con etiqueta&lt;br /&gt;
            modo = string.upper(string.match(s,&amp;#039;(|%a)&amp;#039;));&lt;br /&gt;
            cambio = string.gsub(s,&amp;#039;|%a&amp;#039;, modo,1);&lt;br /&gt;
        elseif string.find(s, &amp;#039;[[]&amp;#039;) ~= nil then -- Enlaces sin etiqueta&lt;br /&gt;
            modo = string.upper(string.match(s,&amp;#039;^(..%a)&amp;#039;));&lt;br /&gt;
            cambio = string.gsub(s,&amp;#039;^..%a&amp;#039;, modo,1);&lt;br /&gt;
        elseif string.match(s,&amp;#039;^%a&amp;#039;) ~= nil then -- Sin enlace&lt;br /&gt;
           modo = string.upper(string.match(s,&amp;#039;^(%a)&amp;#039;));&lt;br /&gt;
           cambio = string.gsub(s,&amp;#039;^%a&amp;#039;, modo, 1);&lt;br /&gt;
        else&lt;br /&gt;
           cambio = s;&lt;br /&gt;
        end&lt;br /&gt;
        return cambio;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Función de ayuda que rellena la lista de argumentos, para que el usuario pueda utilizar una combinación de&lt;br /&gt;
 parámetros con nombre y sin nombre. Esto es importante porque los parámetros con nombre no funcionan igual &lt;br /&gt;
 que los parámetros sin nombre cuando se encadenan recortes, y cuando se trata de cadenas&lt;br /&gt;
 a veces se debe conservar o quitar espacios en blanco dependiendo de la aplicación. &lt;br /&gt;
]]&lt;br /&gt;
function str._getParameters( frame_args, arg_list )&lt;br /&gt;
    local new_args = {};&lt;br /&gt;
    local index = 1;&lt;br /&gt;
    local value;&lt;br /&gt;
    &lt;br /&gt;
    for i,arg in ipairs( arg_list ) do&lt;br /&gt;
        value = frame_args[arg]&lt;br /&gt;
        if value == nil then&lt;br /&gt;
            value = frame_args[index];&lt;br /&gt;
            index = index + 1;&lt;br /&gt;
        end&lt;br /&gt;
        new_args[arg] = value;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return new_args;&lt;br /&gt;
end        &lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Función de ayuda para controlar los mensajes de error.&lt;br /&gt;
]]&lt;br /&gt;
function str._error( error_str )&lt;br /&gt;
    local frame = mw.getCurrentFrame();&lt;br /&gt;
    local error_category = frame.args.error_category or &amp;#039;Errores detectados por el módulo String&amp;#039;;&lt;br /&gt;
    local ignore_errors = frame.args.ignore_errors or false;&lt;br /&gt;
    local no_category = frame.args.no_category or false;&lt;br /&gt;
    &lt;br /&gt;
    if str._getBoolean(ignore_errors) then&lt;br /&gt;
        return &amp;#039;&amp;#039;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local error_str = &amp;#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Error del módulo String: &amp;#039; .. error_str .. &amp;#039;&amp;lt;/strong&amp;gt;&amp;#039;;&lt;br /&gt;
    if error_category ~= &amp;#039;&amp;#039; and not str._getBoolean( no_category ) then&lt;br /&gt;
        error_str = &amp;#039;[[Categoría:Wikipedia:&amp;#039; .. error_category .. &amp;#039;]]&amp;#039; .. error_str;&lt;br /&gt;
    end        &lt;br /&gt;
    &lt;br /&gt;
    return error_str;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Función de ayuda para interpretar cadenas booleanas.&lt;br /&gt;
]]&lt;br /&gt;
function str._getBoolean( boolean_str )&lt;br /&gt;
    local boolean_value;&lt;br /&gt;
    &lt;br /&gt;
    if type( boolean_str ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
        boolean_str = boolean_str:lower();&lt;br /&gt;
        if boolean_str == &amp;#039;false&amp;#039; or boolean_str == &amp;#039;no&amp;#039; or boolean_str == &amp;#039;0&amp;#039; &lt;br /&gt;
                or boolean_str == &amp;#039;&amp;#039; then&lt;br /&gt;
            boolean_value = false;&lt;br /&gt;
        else&lt;br /&gt;
            boolean_value = true;&lt;br /&gt;
        end    &lt;br /&gt;
    elseif type( boolean_str ) == &amp;#039;boolean&amp;#039; then&lt;br /&gt;
        boolean_value = boolean_str;&lt;br /&gt;
    else&lt;br /&gt;
        error( &amp;#039;Ningún valor booleano encontrado&amp;#039; );&lt;br /&gt;
    end    &lt;br /&gt;
    return boolean_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Función de ayuda que escapa a todos los caracteres de patrón para que puedan ser tratados&lt;br /&gt;
como texto sin formato.&lt;br /&gt;
]]&lt;br /&gt;
function str._escapePattern( pattern_str )&lt;br /&gt;
    return mw.ustring.gsub( pattern_str, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$%]])&amp;quot;, &amp;quot;%%%1&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return str&lt;/div&gt;</summary>
		<author><name>GeminiFix</name></author>
	</entry>
</feed>