<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.bioeticawiki.com/w/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://www.bioeticawiki.com/w/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AString"/>
	<link rel="alternate" type="text/html" href="https://www.bioeticawiki.com/w/index.php?title=M%C3%B3dulo:String&amp;action=history"/>
	<updated>2026-05-05T11:20:07Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.37.0</generator>
	<entry>
		<id>https://www.bioeticawiki.com/w/index.php?title=M%C3%B3dulo:String&amp;diff=103450&amp;oldid=prev</id>
		<title>Fjramiro: 1 revisión importada</title>
		<link rel="alternate" type="text/html" href="https://www.bioeticawiki.com/w/index.php?title=M%C3%B3dulo:String&amp;diff=103450&amp;oldid=prev"/>
		<updated>2019-12-28T18:41:21Z</updated>

		<summary type="html">&lt;p&gt;1 revisión importada&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revisión del 20:41 28 dic 2019&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key w_bioeticawiki:diff::1.12:old-103449:rev-103450 --&gt;
&lt;/table&gt;</summary>
		<author><name>Fjramiro</name></author>
	</entry>
	<entry>
		<id>https://www.bioeticawiki.com/w/index.php?title=M%C3%B3dulo:String&amp;diff=103449&amp;oldid=prev</id>
		<title>W&gt;Abián: Cambió el nivel de protección de «Módulo:String»: Módulo muy utilizado, no más cambios previsibles a corto plazo ([Editar=Solo bibliotecarios] (indefinido) [Pueden trasladar=Solo bibliotecarios] (indefinido))</title>
		<link rel="alternate" type="text/html" href="https://www.bioeticawiki.com/w/index.php?title=M%C3%B3dulo:String&amp;diff=103449&amp;oldid=prev"/>
		<updated>2014-08-21T20:48:00Z</updated>

		<summary type="html">&lt;p&gt;Cambió el nivel de protección de «&lt;a href=&quot;/M%C3%B3dulo:String&quot; title=&quot;Módulo:String&quot;&gt;Módulo:String&lt;/a&gt;»: Módulo muy utilizado, no más cambios previsibles a corto plazo ([Editar=Solo bibliotecarios] (indefinido) [Pueden trasladar=Solo bibliotecarios] (indefinido))&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, {'s'} );&lt;br /&gt;
    local s = new_args['s'] or '';&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, { 's', 'i', 'j' } );&lt;br /&gt;
    local s = new_args['s'] or '';&lt;br /&gt;
    local i = tonumber( new_args['i'] ) or 1;&lt;br /&gt;
    local j = tonumber( new_args['j'] ) 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( 'Índice fuera del rango de la cadena' );&lt;br /&gt;
    end&lt;br /&gt;
    if j &amp;lt; i then&lt;br /&gt;
        return str._error( 'Índices de la cadena no ordenados' );&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 'false'. 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, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} );&lt;br /&gt;
    local s = new_args['s'] or '';&lt;br /&gt;
    local start = tonumber( new_args['start'] ) or 1;&lt;br /&gt;
    local plain_flag = str._getBoolean( new_args['plain'] or false );&lt;br /&gt;
    local pattern = new_args['pattern'] or '';&lt;br /&gt;
    local match_index = math.floor( tonumber(new_args['match']) or 1 );&lt;br /&gt;
    local nomatch = new_args['nomatch'];&lt;br /&gt;
    &lt;br /&gt;
    if s == '' then&lt;br /&gt;
        return str._error( 'La cadena donde buscar está vacía' );&lt;br /&gt;
    end&lt;br /&gt;
    if pattern == '' then&lt;br /&gt;
        return str._error( 'La cadena de búsqueda está vacía ' );&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( 'Índice d\'inicio fuera del rango de la cadena ' );&lt;br /&gt;
    end&lt;br /&gt;
    if match_index == 0 then&lt;br /&gt;
        return str._error( 'Número de coincidencias fuera de rango' );&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( 'Ninguna coincidencia encontrada' );&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, {'target', 'pos'} );&lt;br /&gt;
    local target_str = new_args['target'] or '';&lt;br /&gt;
    local pos = tonumber( new_args['pos'] ) 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( 'Índice fuera del rango de la cadena' );&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 'true'.&lt;br /&gt;
]]&lt;br /&gt;
function str.find( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } ); &lt;br /&gt;
    local source_str = new_args['source'] or '';&lt;br /&gt;
    local pattern = new_args['target'] or '';&lt;br /&gt;
    local start_pos = tonumber(new_args['start']) or 1;&lt;br /&gt;
    local plain = new_args['plain'] or true;&lt;br /&gt;
        &lt;br /&gt;
    if source_str == '' or pattern == '' 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 'true' &lt;br /&gt;
]]&lt;br /&gt;
function str.replace( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } ); &lt;br /&gt;
    local source_str = new_args['source'] or '';&lt;br /&gt;
    local pattern = new_args['pattern'] or '';&lt;br /&gt;
    local replace = new_args['replace'] or '';&lt;br /&gt;
    local count = tonumber( new_args['count'] );&lt;br /&gt;
    local plain = new_args['plain'] or true;&lt;br /&gt;
        &lt;br /&gt;
    if source_str == '' or pattern == '' 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;
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 '';&lt;br /&gt;
    if s  ~= '' then        &lt;br /&gt;
        local cambio = {};&lt;br /&gt;
        local modo = {};&lt;br /&gt;
        if string.find(s, '|') ~= nil then -- Enlaces con etiqueta&lt;br /&gt;
            modo = string.upper(string.match(s,'(|%a)'));&lt;br /&gt;
            cambio = string.gsub(s,'|%a', modo,1);&lt;br /&gt;
        elseif string.find(s, '[[]') ~= nil then -- Enlaces sin etiqueta&lt;br /&gt;
            modo = string.upper(string.match(s,'^(..%a)'));&lt;br /&gt;
            cambio = string.gsub(s,'^..%a', modo,1);&lt;br /&gt;
        elseif string.match(s,'^%a') ~= nil then -- Sin enlace&lt;br /&gt;
           modo = string.upper(string.match(s,'^(%a)'));&lt;br /&gt;
           cambio = string.gsub(s,'^%a', 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 'Errores detectados por el módulo String';&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 '';&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local error_str = '&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Error del módulo String: ' .. error_str .. '&amp;lt;/strong&amp;gt;';&lt;br /&gt;
    if error_category ~= '' and not str._getBoolean( no_category ) then&lt;br /&gt;
        error_str = '[[Categoría:Wikipedia:' .. error_category .. ']]' .. 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 ) == 'string' then&lt;br /&gt;
        boolean_str = boolean_str:lower();&lt;br /&gt;
        if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0' &lt;br /&gt;
                or boolean_str == '' 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 ) == 'boolean' then&lt;br /&gt;
        boolean_value = boolean_str;&lt;br /&gt;
    else&lt;br /&gt;
        error( 'Ningún valor booleano encontrado' );&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>W&gt;Abián</name></author>
	</entry>
</feed>