La sustitución es una función mediante la cual, cuando un editor guarda una página, un elemento del código wiki se reemplaza permanentemente con su valor actual. En particular, se pueden sustituir plantillas y palabras mágicas , como alternativa a la transclusión . La diferencia es que cuando se sustituye una plantilla en una página, su apariencia en esa página ya no se verá afectada por los cambios posteriores realizados en la propia plantilla (como es el caso de una plantilla transcluida).
La sustitución se realiza utilizando el subst:
modificador que aparece después de las llaves de apertura dobles. Por ejemplo, para sustituir la plantilla {{ afd }} , escriba {{subst:afd}}
. Puede comprobar el wikitexto resultante antes de guardarlo haciendo clic en "Mostrar cambios" (y ver cómo se verá la página haciendo clic en "Mostrar vista previa").
Las variables y funciones del analizador también se pueden sustituir, lo que significa que su valor actual se registrará permanentemente en la página; no se volverán a evaluar cada vez que alguien visite la página.
En términos generales, las plantillas se transcluyen en lugar de sustituirse, aunque hay algunas que están diseñadas específicamente para ser sustituidas (y es posible que no funcionen si se transcluyen). Algunas razones para sustituir plantillas incluyen:
Las desventajas de la sustitución pueden incluir:
<!-- Template:Foo -->
al final de su salida para mitigar este problema.Se sustituyen las variables dependientes del tiempo para que la página generada sea independiente del momento en el que se la visualice. La sustitución de variables dependientes de la página hace que el wikitexto resultante sea independiente del cambio de nombre de la página y de la copia a otra página.
Para obtener una guía más detallada, incluidas listas de plantillas que deben o no sustituirse, consulte Wikipedia:Sustitución .
Para sustituir una plantilla, utilice la misma sintaxis que para la transclusión , pero incluya subst:
después de las llaves dobles de apertura. Por ejemplo, para sustituir la plantilla {{ afd }} , escriba {{subst:afd}}
. Se pueden incluir parámetros como en el caso de la transclusión, por ejemplo {{subst:afd|Some article}}
.
También se pueden sustituir las páginas que no están en el espacio de nombres de la plantilla, por ejemplo {{subst:User:Cleverclogs/My box}}
. Para sustituir el contenido actual de una página en el espacio principal (es decir, una que no tiene prefijo de espacio de nombres), se requieren dos puntos, como en {{subst::Page}}
. Si no existe una página o plantilla sustituida, la expresión completa (con llaves y subst:) permanecerá sin cambios en el wikitexto y en la página.
Utilice la misma sintaxis para sustituir variables y funciones del analizador, por ejemplo {{subst:PAGENAME}}
o {{subst:#switch:{{NUMBEROFADMINS}}|1=Foo|1000=Bar|#default=Baz}}
.
Puede haber espacios en blanco entre las llaves de apertura y el "subst:". Sin embargo, se recomienda no dejar ningún espacio ni líneas nuevas inmediatamente después del "subst:", ya que esto no funcionará en todos los casos.
La sustitución es parte del proceso que se realiza al guardar una página y hace que el wikitexto guardado como resultado de la edición sea diferente del texto que el usuario ingresó en la ventana de edición. Otros reemplazos que se realizan durante este proceso incluyen la expansión de enlaces mediante el truco de la barra vertical y el reemplazo de múltiples tildes con firmas y marcas de tiempo.
Esto significa que la sustitución necesariamente ocurre antes de cualquier acción realizada en el momento de la representación de la página (conversión del wikitexto almacenado a HTML). En particular, las sustituciones se realizan antes de las transclusiones . Por lo tanto, al escribir {{subst:Help:L{{in(tut)}}k}}
no se realizará la sustitución, aunque {{ in(tut) }} devuelva el texto "in" y exista Help:Link . La transclusión de {{ in(tut) }} aún no se ha realizado cuando se intenta la sustitución. Sin embargo, al reemplazar {{in(tut)}}
con {{subst:in(tut)}}
, ambas sustituciones se realizarán en el orden esperado.
Similarmente:
{{subst:#if:{{x0}}|yes|no}}
el wikitexto responde "sí", aunque {{ x0 }} es una plantilla vacía, ya que el parámetro condicional se evalúa como la cadena no vacía "{{x0}}". Sin embargo, {{subst:#if:{{subst:x0}}|yes|no}}
produce "no", ya que la sustitución interna se realiza primero.{{subst:#expr:2*{{{p|3}}}}}
se devuelve un error de expresión: carácter de puntuación no reconocido "{" , ya que el parámetro indefinido {{{p}}} no ha sido reemplazado por su valor predeterminado (3) cuando se produce la sustitución.{{ {{subst:t6}} }}
producirá el wikitexto "{{ t2|a }}", representado como "[[w:List of people by name: a{{{2}}}|a{{{2}}}]]". Contraste esto con el comportamiento de {{ {{t6}} }}
, que se representa como "{{ t2|a }}", porque el analizador no reinterpreta la barra vertical como un separador durante la etapa de expansión no sustituida. (De manera similar, {{subst:{{subst:t6}} }}
da el wikitexto {{subst:t2|a }}
, que solo en la próxima edición será sustituido por [[w:List of people by name: a{{{2}}}|a{{{2}}}]].)Al hacer clic en el botón "Mostrar cambios" durante la edición, se muestra el wikitexto que resultará después de que se realicen las sustituciones y otros reemplazos inmediatos. Al hacer clic en "Mostrar vista previa", se muestra cómo se verá la página renderizada después de estos reemplazos.
Si una página se sustituye a sí misma (por ejemplo, en la parte noinclude de una página de plantilla), sustituye a la versión anterior, tal como estaba antes de la edición actual.
Si la expansión de una plantilla sustituida contiene instancias de la subst:
sintaxis, las sustituciones se realizan de forma recursiva. Sin embargo, la sustitución no es automáticamente recursiva : si una plantilla sustituida contiene transclusiones ordinarias o variables y funciones del analizador que no se sustituyen explícitamente, estas no se sustituirán.
Tenga en cuenta también que si aparecen instancias de la subst:
sintaxis en una plantilla que se está transcluyendo , se reproducirán sin cambios (como "{{subst:...}}"), ya que no es posible realizar sustituciones en el wikitexto en la etapa de reproducción. Esta característica se puede aprovechar para controlar el comportamiento de la plantilla (consulte § Hacer que las plantillas se comporten de forma diferente cuando se transcluyen o sustituyen). Sin embargo, puede resultar inconveniente cuando una plantilla está diseñada para que sea posible transcluirla y sustituirla; en este caso, safesubst:
se puede utilizar en lugar de subst:
(consulte § El modificador safesubst:).
El subst:
modificador puede reemplazarse por el modificador alternativo safesubst:
. Ambos tienen el mismo comportamiento, excepto cuando se encuentran durante la expansión no sustituida (transclusión o visualización directa) de una plantilla. En tal situación, el código {{subst:...}}
permanece sin analizar, mientras que el {{safesubst:...}}
se trata como si no hubiera ningún modificador presente, y por lo tanto se transcluye la subplantilla o se evalúa la variable o la función del analizador.
Por lo tanto, el safesubst:
modificador se utiliza en el código de plantillas que están diseñadas para producir una sustitución recursiva cuando se sustituyen, pero que también están pensadas para funcionar cuando se las transcluye o simplemente para que se las visualice directamente. A diferencia del uso del subst:
modificador, dichas plantillas se romperían en dichos casos de transclusión (y posiblemente en la visualización directa).
Para obtener detalles sobre cómo implementar esto (en particular, cómo evitar que se realice la sustitución tan pronto como se guarda el código de la plantilla), consulte § Sustitución recursiva.
Como se mencionó anteriormente, la sustitución no es recursiva de forma automática. Por lo tanto, si una plantilla sustituida tiene código que contiene inclusiones de otras plantillas y funciones del analizador, ese código se copiará "tal cual" en el wikitexto resultante; los elementos incluidos en la inclusión no se sustituirán.
Para que la sustitución funcione de forma recursiva, debe incluir la subst:
sintaxis en el código de la plantilla que realiza la llamada. Sin embargo, no puede hacerlo simplemente escribiendo "subst:" dentro de la plantilla, ya que la sustitución se realizaría tan pronto como se guarde la plantilla. Hay dos formas de solucionar este problema:
subst:<noinclude/>
en lugar de subst:
un código simple. La etiqueta noinclude rompe la sintaxis de sustitución cuando se guarda la plantilla, pero se eliminará cuando se sustituya más adelante, lo que permitirá que la sustitución interna surta efecto. Alternativamente, se puede envolver una parte más grande del código de la plantilla en <onlyinclude>...</onlyinclude>
. Luego, el código envuelto se ignora en la página de la plantilla en sí, pero no cuando se transcluye.{{{subst-foo|subst:}}}
, que se evaluará como "subst:" siempre que el parámetro subst-foo no esté establecido. Esta es una solución más flexible, ya que permite controlar el comportamiento a través del parámetro. Por ejemplo, una plantilla de este tipo podría llamarse utilizando , asignando al parámetro un valor vacío y desactivando así el segundo nivel de sustitución. Si no se planea utilizar el parámetro, el nombre del parámetro suele elegirse como la cadena vacía, lo que da como resultado , pero esto puede tener resultados inesperados si se asigna un valor al parámetro de cadena vacía (por ejemplo, ).{{subst:Templatename|subst-foo=|...}}
{{{|subst:}}}
{{Templatename|=foo}}
Para garantizar que la plantilla seguirá funcionando como se espera si se la transcluye en lugar de sustituirla, utilice safesubst:
en lugar de subst:
. Esto también se aplica si la plantilla también se va a ver directamente, en su propia página (aunque en este caso, si se utiliza el primero de los métodos anteriores, subst: seguirá funcionando, ya que las etiquetas includeonly harán que el analizador ignore subst: en la visualización directa).
Para ver lo que producirá una plantilla cuando esté completamente expandida, sin la necesidad de sustituir explícitamente todas las subplantillas, etc., se puede utilizar la herramienta Especial:ExpandTemplates .
Para obtener más información, consulte la página de ayuda Conversión recursiva de wikitexto en Meta. Consulte también Ayuda:Cálculo § Sustitución , m:Plantilla:Tabla de ejemplo con cálculos, con sustitución opcional (edición de vínculos de retroceso) y la solicitud de función en substall.
Las visitas guiadas pueden realizar publicaciones en nombre de los usuarios, como publicar automáticamente el contenido de una página wiki en una página de discusión. Sin embargo, a diferencia de la sustitución o transclusión normal, esta función de las visitas guiadas no respeta <includeonly>...</includeonly>
ningún marcado similar. Para que la sustitución recursiva funcione mediante la publicación de visitas guiadas, puede utilizar el método Retrasar la sustitución con Template:subst.
Este es un ejemplo que utiliza la plantilla real:Like y una plantilla hipotética:Foo. Intenta incluir la plantilla:Foo e indirectamente la plantilla:Like en una tercera página mediante transclusión y sustitución. La plantilla:Like muestra este símbolo: Like
Por ejemplo, supongamos que la plantilla:Foo contiene el wikitexto {{Like}}
. Si luego lo transcluyes, utilizando el wikitexto {{Foo}}
, se transcluirá la plantilla:Like como cabría esperar. Pero si utilizas el wikitexto {{subst:Foo}}
, cuando lo guardes, encontrarás el wikitexto {{Like}}
sustituido en lugar del wikitexto de la página Template:Like. La sustitución no ha sido recursiva.
Un ejemplo de recursión sería si la plantilla:Foo contuviera el wikitexto {{{{{|safesubst:}}}Like}}
. Ahora bien, si la transcluyes, utilizando el wikitexto {{Foo}}
, esto transcluirá la plantilla:Like tal como antes. Y si {{subst:Foo}}
la guardas, sustituirá el wikitexto real completo de la plantilla:Like. Por lo tanto, habrás logrado una sustitución recursiva.
Nota: {{!}} sustituye a |.
A veces es deseable hacer que una plantilla se comporte de manera diferente cuando se sustituye en lugar de cuando se transcluye. Un truco común para hacer esto es usar una expresión como {{{{{subst|subst:}}}ns:0}}
. Esto evalúa a la cadena vacía si se está sustituyendo la plantilla (ya que la sustitución interna surte efecto, dando el prefijo del espacio de nombres 0, que está vacío), pero a "{{subst:ns:0}}" si se está transcluyendo la plantilla (ya que la sustitución no puede tener lugar después de la transclusión).
Una aplicación común es en plantillas que están diseñadas solo para ser sustituidas, para que produzcan una advertencia si se las transcluye por error. Esto se hace en plantillas como {{ prod }} , que están diseñadas para producir una marca de tiempo (por ejemplo, para agregar páginas a categorías con fecha) y no podrán hacer esto si se las transcluye.
Se ha creado una plantilla, {{ issubst }} , para simplificar esto. Devuelve "sí" si se está realizando una sustitución, o la cadena vacía en caso contrario. Esto se puede utilizar como parámetro de una función de analizador condicional para hacer que la plantilla muestre un método de advertencia si se está transcluyendo, o para cambiar de otro modo el comportamiento de una plantilla dependiendo de si se está transcluyendo o sustituyendo.
El uso de una plantilla subst:
no aparece automáticamente en los historiales de páginas. Por lo tanto, es especialmente útil incluir la línea de wikitexto que contiene "subst:" en el resumen de edición .
Además, las páginas con una plantilla sustituida no aparecen en los vínculos de retroceso y la plantilla no aparece en la lista de plantillas transcluidas en la página de edición. La plantilla podría agregar páginas a una categoría para realizar un seguimiento de las sustituciones, pero incluir esta categoría en una página puede saturar la lista de categorías basadas en contenido en las que se encuentra la página. Además, los comentarios fuera de las etiquetas noinclude se incluyen en el wikitexto. Por lo tanto, se puede usar un comentario para mencionar la plantilla. La sustitución de parámetros no funciona dentro de los comentarios, pero una solución alternativa para esto es comenzar un comentario previsto con <!<noinclude />--
para que se convierta en un comentario una vez transcluido.
La sustitución no está disponible dentro de las etiquetas <ref>...</ref>
y <gallery>...</gallery>
. Si escribe {{subst:foo}}
, no se sustituye ni se transcluye, sino que permanece tal como está (es un error conocido, consulte T4700 y gerrit:272916 para conocer el estado actual).
Sin embargo, es posible evitar esta limitación utilizando la palabra mágica #tag. Si escribe, por ejemplo, , se sustituirá {{safesubst:#tag:ref|content of the reference}}
el contenido de la referencia{{#tag:ref|...}}
y se reemplazará con <ref>...</ref>
. Un ejemplo más concreto: si escribe, por ejemplo {{safesubst:#tag:ref|...Title=ExampleTitle|archivedate={{subst:TODAY}}|Edition=Hardcover...}}
, entonces el software realizará sustituciones en el texto dentro del último campo y se {{#tag:ref|...}}
reemplazará con <ref>...</ref>
alrededor del texto modificado, y la referencia se guardará con la sustitución; se guardará como " {{|...Title=ExampleTitle|archivedate=29 January 2016|Edition=Hardcover|...}}
" con <ref>...</ref>
alrededor de él. En otras palabras, primero el software expandirá las plantillas y luego colocará ese texto expandido dentro de las etiquetas de referencia.