Manual:Recursive conversion of wikitext/es

Normalmente, un wikitexto tal como {{subst:a}} no se guarda como {{subst:a}} si existe {{template:a}}, ya que subst: guarda en su lugar el código de template:a.

Con una determinada codificación, subst: no realizará la conversión automática la primera vez que se guarde. Un editor puede crear un wikitexto que solo se convierte cuando se vuelva a guardar, o que se puede volver a convertir cada vez que se guarde.

Retrasar la sustitución mediante Template:subst

Es posible retrasar la sustitución en una operación de guardado mediante Template:Subst, que contiene «Subst».

Esta plantilla podrá tener nombres diferentes en función del wiki. Por ejemplo, en Wikipedia en inglés, se denomina Template:Delay subst. En Wikipedia en español, a fecha de junio de 2025, no existe la plantilla.
Plantilla utilizada Código de la plantilla Pega o escribe Guarda Resultado
Template:subst {{subst: {{subst:subst}}a|b}} save page {{subst:a|b}}
  1. El archivo que se pretende guardar en un principio contiene {{subst:subst}}a|b}}.
  2. Al guardarlo por primera vez, {{subst:subst}} es sustituido por el contenido de la plantilla subst, limitada a la parte incluida, es decir, {{subst:.
  3. Después de guardar, el archivo guardado ahora contiene {{subst:a|b}}.
  4. En el próximo guardado (se hayan hecho o no ediciones en otra parte de la página), se realizará la sustitución normal de la plantilla «a».


Ejemplos más complejos

En {{subst:substancia}}a|b}}, las llaves explícitas no están correctamente equilibradas: hay dos { y cuatro }.

El problema de las llaves disparejas es que, cuando este código está incluido en el ámbito de un {{subst: ... | ... | ... }} que lo engloba, el analizador sintáctico identificará los parámetros del {{subst: que lo engloba bajo la asunción de que lo que está entre las plecas (o las llaves de cierre) es un texto normal de plantilla que debe de estar equilibrado. Así que, si {{subst:subst}}a|b}} está entre otro par de llaves dobles, las llaves de cierre finales }} del código interno se interpretarán como llaves de cierre del par externo.

Véase el ejemplo con:

Plantilla utilizada Código de la plantilla Pega o escribe Guarda Resultado
Template:T1demo start-{{{1}}}-end {{subst:t1demo|{{subst:subst}}a|b}}|c}} save page start-{{subst:a-end|c}}
  1. Al guardar el archivo. el primer subst:t1demo significa que, en lugar de guardar el archivo tal como está, se debe llamar a la plantilla T1demo con lo que parezcan ser sus parámetros, sustituyendo el resultado la secuencia de la llamada. La plantilla T1demo debe por tanto inicializar su parámetro:
  2. El análisis formal percibe la secuencia {{subst:subst}}a entre la primera pleca y la segunda como bien equilibrada: así, se pasa esta cadena como el parámetro 1.
  3. Se percibe entonces el término «b» entre la pleca y unas llaves de cierre, y se identifica así como el parámetro 2.
  4. Entonces, se evalúa el contenido de la plantilla, reemplazándose {{{1}}}} por el valor identificado como el parámetro 1, y la plantilla aparentemente no hace uso de un parámetro 2.

Debido a estas llaves disparejas, la secuencia {{subst:subst}}a|b}} ya no puede funcionar más, dado que está desarticulada y desordenada por la llamada a la plantilla que la llama.

Las llaves se pueden reequilibrar mediante Template:)), que es sustituida por dos llaves de cierre.

Plantilla utilizada Código de la plantilla Pega o escribe Guarda Resultado
Template:)) }} {{subst:subst}}a|b{{subst:))}} save page {{subst:a|b}}
Template:T1demo start-{{{1}}}-end {{subst:t1demo|{{subst:subst}}a|b}}|c{{subst:))}} save page start-{{subst:a-end|c}}

Esta vez, a guardar el archivo, el primer subst:t1demo identificará correctamente las llaves de cierre que se emparejan con las de apertura. Pero el código interno que es identificado como los parámetros lee {{subst:subst}}a|b{{subst:))}}|c, y el analizador ahora ve dos parámetros separados por una pleca:

  1. {{subst:subst}}a
  2. b{{subst:))}}

Ahora el problema es que las llaves de apertura del pretendido segundo subst: han estado ocultas al analizador dentro de un {{subst:subst}} formalmente equilibrado y las llaves de cierre también han estado ocultas dentro de un {{))}} formalmente equilibrado, y el analizador no puede ver que la pleca de en medio debía estar considerada dentro de uno de los pares de llaves del código interno, por lo que se interpreta como separador de parámetros de la plantilla o función del analizador que se encuentra fuera.

Para ocultar esta pleca del primer análisis, ahora necesitamos también la palabra mágica «!», que equivale a {{subst:!}}:

Pega o escribe Guarda Resultado
{{subst:t1|{{subst:subst}}a{{subst:!}}b{{subst:))}}|c}} Save page start-{{subst:a|b}}-end
  1. En la primera llamada, el analizador identificad correctamente los parámetros de t1 como:
    {{subst:subst}}a{{subst:!}}b{{subst:))}}|c
  2. Este bloque de parámetros consta de dos parámetros separados por una pleca de primer nivel:
    1. {{subst:subst}}a{{subst:!}}b{{subst:))}}
    2. c
  3. Ahora se debe evaluar el valor de ambos parámetros, lo que da:
    1. {{subst:a|b}}
    2. c
  4. Ahora se introduce el valor de estos parámetros en el texto de sustitución start-{{{1}}}-end de t1, lo que devuelve el resultado correcto.


Crear una página que se autoconvierte recursivamente

La página resultante puede tener la misma propiedad de crear una página guardada que contenga subst si utilizamos una plantilla «a» especialmente diseñada para tal propósito.. Al utilizarse en la página que hace la llamada, esta plantilla puede ser capaz de insertar un subst: activo en el resultado. Pero estas llamadas de sustitución (que normalmente actúan cuando se guarda una página) deben ser neutralizadas hasta que la plantilla misma sea incluida en algún lugar: no se deben activar al guardar la propia plantilla especial. Para que esta plantilla sea estática, hay dos estrategias posibles:

  • Se pone <includeonly></includeonly> antes (o alrededor) (o dentro) de cada subst:, impidiendo que el analizador lo vea como una llamada subst: válida (y activa),
  • o, alternativamente, se reemplaza cada subst: por {{{|subst:}}}. Este bonito apaño utiliza la asignación del valor predeterminado para los parámetros indefinidos, que normalmente utiliza la sintaxis {{{a|b}}}, que significa «al sustituir, utiliza aquí el valor dado del parámetro a, pero si a no está definido, utiliza b como valor predeterminado». Dado que en este caso no hay nombre de variable, la variable sin nombre siempre estará indefinida y siempre se traducirá a su valor predeterminado cuando la plantilla sea incluida.

Una forma básica es la de Template:tsubst, que contiene «a{{{{{|subst:}}}subst}}tsubst|b{{{{{|subst:}}}))}}c<noinclude>{{doc|content=This template is used as an example at [[Manual:Recursive conversion of wikitext]][[Category:Demo templates]]}}</noinclude>», donde b representa los parámetros, a la salida antes de la llamada a la plantilla, y c la salida después de la llamada a la plantilla. Todos estos pueden depender de los parámetros. Por sí mismo, este contenido no tiene un subst: activo, así que no se modifica en el guardado. Ahora, si template:tsubst aparece en un archivo dentro de un {{subst:tsubst|..}}, la primera vez que se guarde el archivo, se ejecutará por tanto el {{subst:tsubst|..}} de nivel superior.

  1. Para empezar, el analizador delimitará los parámetros del código que hace la llamada, obtendrá su expresión textual y determinará el valor de estos parámetros.
  2. Dado que el contenido template:tsubst no tiene un nombre válido de parámetro, su contenido siempre se traducirá de forma idéntica en la sustitución: los dos pseudoparámetros {{{|subst:}}} serán reemplazados por su valor predeterminado subst:. El contenido textual efectivo de tsubst después de la sustitución de los parámetros será por tanto a{{subst:subst}}tsubst|b{{subst:rb}}c.
  3. El valor de esta secuencia inicial se expandirá después de su propia sustitución para ser reemplazado por a{{subst:tsubst|b}}c en el archivo que hace la llamada.

Como resultado de ello, empezando con el wikitexto {{subst:tsubst|..}}, el wikitexto será reemplazado por a{{subst:tsubst|b}}c al guardar el archivo que hace la llamada. Recursivamente, en cada guardado, se añade «a» antes de las llaves, se reemplazan los valores de los parámetros y se añade «c» después de las llaves.

Los wikitextos «a», «b» y «c» que aparecen en este sencillo ejemplo de template:tsubst son marcadores de posición de ejemplo para {{{{{|subst:}}}..}} cuando se vaya a utilizar en plantillas más elaboradas, en cuyo caso, el wikitexto producido es el resultado de la expansión de la variable, función del analizador o plantilla, tal como se indica en la plantilla elaborada a la que se llama, en el momento en que se guarda el archivo que hace la llamada.

  • Así, la sustitución del texto «b» representa la situación en que se guardó por última vez el archivo que hace la llamada; la sucesión de «a» refleja el historial de los sucesivos guardados, del más antiguo al más reciente; y la sucesión de «c», el historial de guardados, del más reciente al más antiguo. En otras palabras, el orden cronológico es hacia dentro, hacia la llamada a la plantilla; el historial crece desde el interior, donde la plantilla se mantiene recursivamente activa.
  • Además, ~{{{|~~}}} proporciona la firma del usuario.
  • De forma más general, una página puede contener varias llamadas a plantillas, pudiendo generar a su vez cada una de ellas varias llamadas a plantillas.
  • Si se desea, se puede hacer que la plantilla deje de reproducirse bajo una determinada condición (p. ej., sustituyendo una página vacía), dejando atrás únicamente las versiones anteriores de «a» y «c», y, en su caso, el resultado de la última sustitución en medio.


Ajustar la salida generada

Se puede utilizar <span style="display:none">..</span> para ocultar la llamada a la plantilla. El correcto anidamiento dentro o alrededor de pares de dobles o triples llaves no es necesario; durante la expansión de plantillas, estas etiquetas se tratan como texto plano. Así, p. ej., la etiqueta de apertura puede estar en «b» y la de cierre en «c».

Si tenemos un «c» no vacío, «c» tiene que empezar por «</span>» para ocultar las llaves de cierre. Las etiquetas span de apertura y cierre deben estar bien emparejadas para evitar que la llamada a la plantilla y/o su salida afecte al estilo después de ello. Esto requiere que una etiqueta span de apertura en «c» se empareje con una etiqueta de cierre en el «c» introducido anteriormente. Puede venir tanto inmediatamente después de la etiqueta de cierre al comienzo de «c» (especificando opcionalmente un estilo que sobreescriba el estilo externo) como al final de «c» (en cuyo caso el estilo externo también se aplica a «c»). Si tenemos un «a» no vacío, «a» tiene que empezar por «<span style="display:none">» para ocultar las llaves de apertura. Así, «a» debe empezar por una etiqueta span de cierre para emparejarse con la etiqueta span de apertura del «a» anterior (el estilo externo también se aplica a «a» a menos que contenga un par adicional de etiquetas span). Por último, para emparejar la etiqueta span de cierre del inicio del «a» situado más a la izquierda (el más antiguo), es necesaria una etiqueta span de apertura a la izquierda de esta; mientras que para emparejar la etiqueta span de apertura del «c» más a la derecha (el más antiguo), es necesaria una etiqueta span de cierre a la derecha de esta. Si «a» está vacío, también se introduce esta etiqueta span de apertura; de forma similar, si «c» está vacío, también se introduce esta etiqueta span de cierre.

Así, la llamada completa a la plantilla, incluyendo «b», está oculta a menos que dentro de «b» tengamos «</span>» y «<span style="display:none">»; en ese caso, la parte interior de «b» tiene el estilo externo a menos que contenga un par adicional de etiquetas span.

De vez en cuando, se pueden podar a mano los pares de etiquetas span vacías (que no tengan nada entre ellas o que carezcan de especificación de estilo).

Documentación

En el caso de la conversión automática de wikitexto, el wikitexto original no se documenta automáticamente. Para eso puede ser útil el resumen de edición. Además, en el caso de la conversión automática mediante un simple clic en Editar y Publicar cambios, el wikitexto, tanto antes como después de la conversión, está en el historial de ediciones. Se puede indicar un código en el resumen de edición para indicar «sin cambios manuales en el wikitexto». Así, solo el wikitexto introducido inicialmente no está documentado a menos que se utilice en un resumen de edición (la capacidad del cual puede no ser suficiente) o se guarde en etiquetas pre o nowiki en la misma página o en su documentación.


Ejemplo simple en vivo

Se discutieron las plantillas anteriores de la forma Template:Tsubst con el contenido «a{{{{{|subst:}}}subst}}tsubst|b{{{{{|subst:}}}))}}c<noinclude>{{doc|content=This template is used as an example at [[Manual:Recursive conversion of wikitext]][[Category:Demo templates]]}}</noinclude>», donde «b» representa parámetros, «a» la salida antes de la llamada a la plantilla y «c» la salida después de la llamada a la plantilla. Todos estos pueden depender de los parámetros. Un ejemplo simple es esta misma plantilla, sin parámetros, donde «a», «b» y «c» son simplemente estas letras explícitas.

A partir del wikitexto {{subst:tsubst|b}}, en cada guardado, se añade «a» antes de las llaves de apertura y «c» después de las llaves de cierre.

{{void~1= Ejemplo en vivo (cambia automáticamente cada vez que se pulsa Publicar cambios):

a{{subst:tsubst|b}}c }}

Otros ejemplos

Ejemplos:

Ejemplos de plantillas diseñadas para utilizarse con el preprocesador pre-2008, con el cual proporcionaron un número arbitrario de niveles de sustitución:

  • m:Template:square root A – calcula, con el método de Newton, la raíz cuadrada del parámetro 1, con la estimación inicial en el parámetro 2 y un criterio de parada de error absoluto (se para si la diferencia absoluta entre dos estimaciones consecutivas es menor que el parámetro 3), en dos guardados (o, mediante una función del analizador, en un guardado), imprimiendo todas las estimaciones sucesivas y las diferencias entre estimaciones consecutivas
  • m:Template:square root B igual que m:Template:square root A, pero solo se imprime el resultado final
  • m:Template:sqr – ídem, con un criterio fijo de parada de error relativo <1e-11 (basado en el uso de un servidor con resultados de 12 cifras); devuelve un solo valor, la llamada puede estar dentro de una expresión
  • m:Template:multiple substs – un subst genera varios substs en cada nivel, en dos guardados (o, mediante una función del analizador, en un guardado)


Previsualización

Ten en cuenta que la previsualización antes de hacer cambios manuales en el wikitexto (o sin haberlos hecho) no es lo mismo que la representación de la página actual

Véase también

Category:Parser manuals/es
Category:Parser manuals/es