🏛️ ¡La Enciclopedia Colchagüina te necesita!
Día a día trabajamos con pasión para rescatar y compartir la historia, cultura y memoria de nuestra tierra. Para que este proyecto siga siendo 100% libre y gratuito, necesitamos de tu apoyo para cubrir los costos de funcionamiento y mantención.
Si valoras lo que hacemos, por favor considera apoyarnos. Puedes ayudarnos desde tan solo $2.000 pesos. ¡Cada granito de arena construye nuestra historia!
Diferencia entre revisiones de «Ayuda:Sustitución»
Sin resumen de edición |
Sin resumen de edición |
||
| Línea 34: | Línea 34: | ||
Algunas extensiones de MediaWiki tienen la restricción de que si se usan en una plantilla con parámetros, solo funcionan si la plantilla es sustituida. | Algunas extensiones de MediaWiki tienen la restricción de que si se usan en una plantilla con parámetros, solo funcionan si la plantilla es sustituida. | ||
== | ==Visión general== | ||
Para la discusión de la '''sustitución''', una ''"plantilla ordinaria"'' es la página a la que se hace referencia en el patrón {{tmpl|0={{((}}subst:$1<small> </small>{{))}}|''nombre de la página''}} (para páginas en el espacio de nombres de la plantilla) o {{tmpl|0={{((}}subst:$1<small> </small>{{))}}|''nombre de la página completa''}} (para páginas en otros espacios de nombres). | |||
Una ''"plantilla predefinida"'' es una [[Special:MyLanguage/Help:variable|variable]] o [[Special:MyLanguage/Help:parser function|función de análisis]] que se sustituye de manera similar. | |||
La sustitución es un proceso separado que se realiza antes de la expansión de cualquier plantilla, variable, función de análisis o parámetro no sustituido. | |||
Una llamada de sustitución puede tener otras llamadas de sustitución incrustadas en ella. | |||
De manera similar, la plantilla sustituida de una sustitución puede contener otras llamadas de sustitución. | |||
Las sustituciones en la expresión del nombre de la plantilla o función de análisis, en las definiciones de parámetros de la plantilla o función de análisis sustituidos y en el cuerpo de la plantilla sustituida se realizan primero. | |||
Dado que la expansión se realiza más tarde, cualquier expresión utilizada en una sustitución que contenga pares de llaves dobles tendrá las llaves tratadas como texto plano. | |||
Así, durante la sustitución puede haber un nombre de parámetro con llaves en la llamada de sustitución (por ejemplo, <code><nowiki>{{subst:foo|a{{bc}}d=...}}</nowiki></code>) que coincida con un parámetro con el mismo nombre en el cuerpo de la plantilla (por ejemplo, <code><nowiki>{{{a{{bc}}d}}}</nowiki></code>). | |||
Si se intenta aplicar la sustitución a una plantilla u otro elemento que no existe, no hay sustitución, el prefijo "subst:" se mantiene en el wikitexto. | |||
Después del proceso de sustitución, la expansión de plantillas, etc., y otros procesamientos del wikitexto resultante funcionan como de costumbre. | |||
Debido a que la sustitución ha terminado, esto no puede deshacer una falta de coincidencia de nombres de parámetros que ocurrió durante la sustitución (ver también la sección "[[#Partial substitution|Sustitución parcial]]" a continuación). | |||
La sustitución solo es posible si lo siguiente se ha evaluado completamente: | |||
* | *el nombre de la plantilla, variable o función de análisis | ||
* | *en el caso de una plantilla: los nombres de parámetros en la llamada de la plantilla y en la plantilla misma | ||
* | *en el caso de #if, #ifexpr, #ifexist y #iferror, el parámetro después de los dos puntos | ||
* | *en el caso de #ifeq, el parámetro después de los dos puntos y el siguiente | ||
* | *en el caso de #switch, el parámetro después de los dos puntos y las expresiones a la izquierda de los signos de igual | ||
Dado que, como se dijo, la sustitución se realiza antes de la expansión de otros elementos, la evaluación requerida anteriormente no ha tenido lugar si las expresiones involucran una expansión no sustituida. | |||
También en el caso de otras funciones de análisis que no se mencionan, un parámetro no completamente evaluado después de los dos puntos hace que la función de análisis se aplique al wikitexto con llaves y no al wikitexto expandido, afectando el resultado. | |||
Ejemplos: | |||
*{{subst:Help:L<nowiki>{{</nowiki>tc}}k}} | *{{subst:Help:L<nowiki>{{</nowiki>tc}}k}} utilizando [[Template:tc]], no realiza sustitución, porque Help:L<nowiki>{{</nowiki>tc}}k no es una página existente, aunque <nowiki>Help:L{{tc}}k</nowiki> se renderiza como Help:L{{tc}}k. Por lo tanto, el wikitexto resultante es el mismo que el wikitexto original y se renderiza como {{subst:Help:L{{tc}}k}}. | ||
*<nowiki>{{#if:{{void|abc}}| | *<nowiki>{{#if:{{void|abc}}|sí|no}}</nowiki> (usando [[Template:void]]) se renderiza como "{{#if:{{void|abc}}|sí|no}}", y así <nowiki>{{subst:#if:{{subst:void|abc}}|sí|no}}</nowiki> da el wikitexto "no". Por otro lado, <nowiki>{{subst:#if:{{void|abc}}|sí|no}}</nowiki> da el wikitexto "sí", porque [[Template:void]] no se resuelve hasta después de la sustitución. | ||
En principio, el wikitexto resultante de la sustitución completa se renderiza de inmediato de la misma manera que el wikitexto con inclusión ordinaria. | |||
Sin embargo, tenga en cuenta que en la sustitución de una función de análisis, un parámetro no definido con un valor predeterminado, utilizado en un valor de parámetro, no se reemplaza por la [[w:Help:Parameter default|predeterminada]] (en la Wikipedia en inglés), y por ejemplo, no está permitido en la expresión numérica evaluada en la sustitución de #expr: | |||
: | :<nowiki>{{#expr:2{{{p|3}}}}}</nowiki> da {{#expr:2*{{{p|3}}}}}, mientras que <nowiki>{{subst:#expr:2*{{{p|3}}}}}</nowiki> da "Error de expresión: carácter de puntuación no reconocido "{"". En la sustitución de una plantilla que contiene esto, <nowiki>{{{p|3}}}</nowiki> se reemplaza por el valor de {{{p}}} o por 3, por lo que entonces no hay complicaciones. | ||
<nowiki>{{ {{t6}} }}</nowiki> | <nowiki>{{ {{t6}} }}</nowiki> utilizando {{tcw|t6}} se renderiza como {{ {{t6}} }}; <nowiki>{{subst:{{subst:t6}} }}</nowiki> da el wikitexto <nowiki>{{subst:t2demo|a }}</nowiki> renderizado de la misma manera que el wikitexto, y en la siguiente edición se cambia a <!--t2-->start-a -middle-{{{2}}}-end; <nowiki>{{ {{subst:t6}} }}</nowiki> da el wikitexto <nowiki>{{ t2demo|a }}</nowiki>, renderizado como {{ t2demo|a }}. Esto se debe a que, tanto sin sustitución como en el caso de la sustitución completa, los caracteres de barra vertical en las llamadas a plantillas, excluyendo aquellos dentro de llamadas internas de plantillas, parámetros de plantillas, enlaces y etiquetas de imágenes, determinan la separación de las definiciones de parámetros entre sí y del nombre de la plantilla. Esta separación no depende de los posibles caracteres de barra vertical adicionales en la forma expandida del nombre de la plantilla y las definiciones de parámetros. Sin embargo, si después de la sustitución de una plantilla interna el carácter de barra vertical está en la llamada de la plantilla externa, es como cualquier otro y desempeña su papel en la determinación de la separación. En otras palabras, el análisis se realiza primero una vez para la sustitución y luego una vez para el renderizado, pero en ambos casos no hay una vez extra en el medio. En el caso de la sustitución de la plantilla interna solamente, son efectivos dos análisis sucesivos. | ||
Al sustituir una plantilla que contiene <nowiki>{{{p|q}}}</nowiki> (una etiqueta de parámetro con valor predeterminado), esto resulta en el valor de p si está definido y, de lo contrario, en q. Por ejemplo, usando [[w:Template:Timc|{{timc|t pd}}]] (en la Wikipedia en inglés), <nowiki>{{subst:t pd}}</nowiki> da el wikitexto 2. | |||
Si una página se sustituye a sí misma (por ejemplo, en la parte de noinclude de una página de plantilla), sustituye la versión anterior. | |||
==Consideraciones de uso== | |||
Como se mencionó, un cambio en una plantilla ordinaria después de la sustitución no afecta a la página en la que se sustituyó, y una variable sustituida que depende del tiempo ya no depende del tiempo, etc. Sin embargo, una sustitución de, por ejemplo, <nowiki>{{#expr:2*3}}</nowiki> no afecta en absoluto al renderizado. | |||
La relación entre el wikitexto de una página y su renderizado puede volverse más fácil de entender después de la sustitución, porque se tiene todo el wikitexto juntos y las sustituciones de parámetros se han realizado. | |||
También puede volverse más complejo. Centrarse por separado en entender una llamada de plantilla y entender el contenido de la plantilla puede ser más fácil. El wikitexto después de la sustitución a menudo es más complejo que cuando el wikitexto requerido se habría escrito directamente. | |||
A diferencia de una llamada de plantilla (si se conocen las plantillas), el wikitexto después de la sustitución no muestra cómo se puede producir un resultado similar. El wikitexto puede ser largo y complicado, y por lo tanto incómodo de ''escribir'' directamente, o puede ser simple, por ejemplo, un número resultante de un cálculo, pero incómodo de ''encontrar'' directamente. Al estudiar el wikitexto de una página, uno puede pensar que este wikitexto es lo que se supone que debe escribir y encontrar directamente para obtener el resultado, incluso en casos donde eso sería muy impráctico. | |||
En tales casos, la documentación de la llamada de la plantilla es útil. Al igual que en la programación de computadoras cambiamos el [[w:código fuente|código fuente]] y/o los datos para producir nuevos resultados, y no cambiamos directamente el [[w:archivo objeto|archivo objeto]], aquí cambiaríamos las llamadas de las plantillas y/o las plantillas, en lugar de cambiar directamente el wikitexto resultante de la sustitución. | |||
=== | ===Plantillas ordinarias=== | ||
En el caso de sustituir una plantilla ordinaria, la etiqueta de la plantilla se reemplaza por el wikitexto de la plantilla, con los valores de los parámetros sustituidos por los parámetros. | |||
; | ;Ejemplo: {{tim|t2}}, que contiene | ||
::<code><nowiki>start-{{{1}}}-middle-{{{2}}}-end</nowiki></code> | ::<code><nowiki>start-{{{1}}}-middle-{{{2}}}-end</nowiki></code> | ||
: | : y se llama como '''<code><nowiki>{{subst:t2|[[a]]|{{tc}}}}</nowiki></code>''' (ver {{tl|tc}}) da el wikitexto: | ||
::<code><nowiki>start-[[a]]-middle-{{tc}}-end</nowiki></code>, | ::<code><nowiki>start-[[a]]-middle-{{tc}}-end</nowiki></code>, que se renderiza como | ||
::start-[[a]]-middle-{{tc}}-end. | ::start-[[a]]-middle-{{tc}}-end. | ||
La sustitución elimina las partes de noinclude y las etiquetas de includeonly. | |||
Parámetros: | |||
* | *Una sustitución con p=r reemplaza {{{p}}} y <nowiki>{{{p|q}}}</nowiki> por r; esto incluye los casos en que r tiene la forma {{{s}}} o <nowiki>{{{s|t}}}</nowiki>. | ||
* | *Una sustitución con p indefinido conserva {{{p}}} y reemplaza <nowiki>{{{p|q}}}</nowiki> por la [[w:Help:Parameter default|predeterminada]] q (en la Wikipedia en inglés). | ||
Con "subst:", el reemplazo de una etiqueta de plantilla por wikitexto no funciona de forma recursiva. Para una sustitución recursiva completa, use [[Special:ExpandTemplates]]. Consulte también [[mediazilla:2777|substall]] y [[#Sustitución multilevel|sustitución multilevel]] a continuación. | |||
La sustitución paso a paso de plantillas que incluyen otras plantillas que incluyen más plantillas, etc., puede ser útil para analizar y documentar el comportamiento de plantillas complejas, para un ejemplo, consulte [[m:Template talk:Lop]]. | |||
Sin embargo, después de una sustitución, una página puede renderizarse de manera diferente, por ejemplo, si las plantillas producen llaves, barras verticales y/o signos de igual que después de la sustitución determinan la expansión de otras plantillas, pero sin sustitución se tratan como texto simple. | |||
En ausencia de parámetros, la sustitución de plantillas se puede comparar con copiar el wikitexto o el renderizado de una inclusión de {{tmpl|0={{((}}<small> </small><code>[[Special:MyLanguage/Help:Magic words|msgnw:]]</code>$2<small> </small>{{))}}|$1|''pagename''}} previsualizada o guardada. Sin embargo, la sustitución de plantillas excluye las partes de {{tag|noinclude|open}}, elimina las etiquetas de {{tag|includeonly|open}} y reemplaza los parámetros no definidos por sus valores predeterminados. | |||
=== | ===Plantillas predefinidas=== | ||
En el caso de sustituir una plantilla predefinida, sin parámetros que dependan de otras plantillas, la etiqueta se reemplaza por el resultado. | |||
''' | '''Nota''': <code>subst:</code> debe agregarse directamente antes del nombre de la plantilla predefinida '''sin espacios intermedios'''. | ||
Aplicar subst a una variable funciona como aplicarlo a una plantilla. Por ejemplo, una marca de tiempo: | |||
;<nowiki>{{subst:CURRENTYEAR}}-{{subst:CURRENTMONTH}}-{{subst:CURRENTDAY}} T {{subst:CURRENTTIME}} [[w:UTC|]]</nowiki>: | ;<nowiki>{{subst:CURRENTYEAR}}-{{subst:CURRENTMONTH}}-{{subst:CURRENTDAY}} T {{subst:CURRENTTIME}} [[w:UTC|]]</nowiki>: | ||
puede dar el wikitexto | |||
:<nowiki>2010-04-10 T 06:30 [[w:UTC|UTC]]</nowiki> | :<nowiki>2010-04-10 T 06:30 [[w:UTC|UTC]]</nowiki>, que se renderiza como | ||
:2010-04-10 T 06:30 [[w:UTC|UTC]]. | |||
:2010-04-10 T 06:30 [[w:UTC|UTC]] | |||
In the case of substituting a predefined template with a parameter depending on another template, that has to be substituted too, with a separate <code>subst:</code> modifier, otherwise the result is undefined. | In the case of substituting a predefined template with a parameter depending on another template, that has to be substituted too, with a separate <code>subst:</code> modifier, otherwise the result is undefined. | ||
Revisión del 15:16 15 ene 2024
| Nota: Los contenidos de esta página se encuentran bajo la licencia CC0, y han sido importados desde MediaWiki.org. Estas páginas están disponibles aquí a modo informativo, y puede que algunas se encuentren en el idioma inglés. Algunas antiguas revisiones de esta página se encontraban bajo la licencia CC BY-SA. Solo las nuevas contribuciones son de dominio público. |
Sustitución es la conversión automática de wikitexto de una página cuando se guarda, en el caso de que el wikitexto se refiera a uno o más plantillas, variables, o funciones de análisis.
En el caso de la sustitución de plantillas, la llamada a la plantilla se reemplaza por el contenido de la plantilla con la sustitución de los parámetros. Así, una plantilla se utiliza como macro y la página se expande como macro cuando se guarda la página en lugar de, como suele suceder, cuando se visualiza la página.
En el caso de la sustitución de una variable o función de análisis, la referencia a ella se reemplaza por el valor resultante.
La sustitución se realiza colocando la palabra mágica subst: o safesubst: después de las dobles llaves de apertura sin espacios intermedios, como en los ejemplos: {{subst:FULLPAGENAME}} y {{safesubst:FULLPAGENAME}}.
El código safesubst: es útil en la sustitución multinivel, consulta abajo.
El resultado (en forma de diferencia con el wikitexto guardado) se puede ver antes (o sin) guardar presionando "Mostrar cambios". Sin embargo, si el texto abarca más de un párrafo, esta página de diferencia no es muy adecuada para copiar el resultado (por ejemplo, para la sustitución paso a paso sin guardar en cada paso), debido a los signos de más en el margen.
Aplicaciones
Sustitución de una plantilla:
- Hacer una página rendereada independiente de la plantilla:
- La página rendereada no cambia cuando se edita la plantilla.
- La página se puede copiar a otro wiki de MediaWiki sin copiar la plantilla.
- Facilitar la representación de la página y, por lo tanto, acelerar el servidor.
- Analizar y demostrar el funcionamiento de las plantillas. Sin embargo, en algunos casos, la sustitución funciona de manera diferente.
- Facilitar la comprensión de la correspondencia entre el wikitexto y la página renderizada (esto puede aplicarse, también puede aplicarse lo contrario).
Sustitución de una variable dependiente del tiempo:
- Hacer una página rendereada independiente del tiempo.
Sustitución de una variable dependiente de la página:
- Hacer una página rendereada independiente de cambiar el nombre de la página y de copiar el wikitexto a otra página (lo contrario se aplica si la variable PAGENAME se usa en una parte no incluida de la página para incluir la página misma).
Algunas extensiones de MediaWiki tienen la restricción de que si se usan en una plantilla con parámetros, solo funcionan si la plantilla es sustituida.
Visión general
Para la discusión de la sustitución, una "plantilla ordinaria" es la página a la que se hace referencia en el patrón {{subst:nombre de la página }} (para páginas en el espacio de nombres de la plantilla) o {{subst:nombre de la página completa }} (para páginas en otros espacios de nombres). Una "plantilla predefinida" es una variable o función de análisis que se sustituye de manera similar.
La sustitución es un proceso separado que se realiza antes de la expansión de cualquier plantilla, variable, función de análisis o parámetro no sustituido.
Una llamada de sustitución puede tener otras llamadas de sustitución incrustadas en ella. De manera similar, la plantilla sustituida de una sustitución puede contener otras llamadas de sustitución. Las sustituciones en la expresión del nombre de la plantilla o función de análisis, en las definiciones de parámetros de la plantilla o función de análisis sustituidos y en el cuerpo de la plantilla sustituida se realizan primero.
Dado que la expansión se realiza más tarde, cualquier expresión utilizada en una sustitución que contenga pares de llaves dobles tendrá las llaves tratadas como texto plano.
Así, durante la sustitución puede haber un nombre de parámetro con llaves en la llamada de sustitución (por ejemplo, {{subst:foo|a{{bc}}d=...}}) que coincida con un parámetro con el mismo nombre en el cuerpo de la plantilla (por ejemplo, {{{a{{bc}}d}}}).
Si se intenta aplicar la sustitución a una plantilla u otro elemento que no existe, no hay sustitución, el prefijo "subst:" se mantiene en el wikitexto.
Después del proceso de sustitución, la expansión de plantillas, etc., y otros procesamientos del wikitexto resultante funcionan como de costumbre. Debido a que la sustitución ha terminado, esto no puede deshacer una falta de coincidencia de nombres de parámetros que ocurrió durante la sustitución (ver también la sección "Sustitución parcial" a continuación).
La sustitución solo es posible si lo siguiente se ha evaluado completamente:
- el nombre de la plantilla, variable o función de análisis
- en el caso de una plantilla: los nombres de parámetros en la llamada de la plantilla y en la plantilla misma
- en el caso de #if, #ifexpr, #ifexist y #iferror, el parámetro después de los dos puntos
- en el caso de #ifeq, el parámetro después de los dos puntos y el siguiente
- en el caso de #switch, el parámetro después de los dos puntos y las expresiones a la izquierda de los signos de igual
Dado que, como se dijo, la sustitución se realiza antes de la expansión de otros elementos, la evaluación requerida anteriormente no ha tenido lugar si las expresiones involucran una expansión no sustituida.
También en el caso de otras funciones de análisis que no se mencionan, un parámetro no completamente evaluado después de los dos puntos hace que la función de análisis se aplique al wikitexto con llaves y no al wikitexto expandido, afectando el resultado.
Ejemplos:
- {{subst:Help:L{{tc}}k}} utilizando Template:tc, no realiza sustitución, porque Help:L{{tc}}k no es una página existente, aunque Help:L{{tc}}k se renderiza como Help:Link. Por lo tanto, el wikitexto resultante es el mismo que el wikitexto original y se renderiza como {{subst:Help:Link}}.
- {{#if:{{void|abc}}|sí|no}} (usando Template:void) se renderiza como "no", y así {{subst:#if:{{subst:void|abc}}|sí|no}} da el wikitexto "no". Por otro lado, {{subst:#if:{{void|abc}}|sí|no}} da el wikitexto "sí", porque Template:void no se resuelve hasta después de la sustitución.
En principio, el wikitexto resultante de la sustitución completa se renderiza de inmediato de la misma manera que el wikitexto con inclusión ordinaria.
Sin embargo, tenga en cuenta que en la sustitución de una función de análisis, un parámetro no definido con un valor predeterminado, utilizado en un valor de parámetro, no se reemplaza por la predeterminada (en la Wikipedia en inglés), y por ejemplo, no está permitido en la expresión numérica evaluada en la sustitución de #expr:
- {{#expr:2{{{p|3}}}}} da 6, mientras que {{subst:#expr:2*{{{p|3}}}}} da "Error de expresión: carácter de puntuación no reconocido "{"". En la sustitución de una plantilla que contiene esto, {{{p|3}}} se reemplaza por el valor de {{{p}}} o por 3, por lo que entonces no hay complicaciones.
{{ {{t6}} }} utilizando Plantilla:t6 conteniendo "t2demo|a" se renderiza como {{ t2demo|a }}; {{subst:{{subst:t6}} }} da el wikitexto {{subst:t2demo|a }} renderizado de la misma manera que el wikitexto, y en la siguiente edición se cambia a start-a -middle-{{{2}}}-end; {{ {{subst:t6}} }} da el wikitexto {{ t2demo|a }}, renderizado como start-a -middle-{{{2}}}-end. Esto se debe a que, tanto sin sustitución como en el caso de la sustitución completa, los caracteres de barra vertical en las llamadas a plantillas, excluyendo aquellos dentro de llamadas internas de plantillas, parámetros de plantillas, enlaces y etiquetas de imágenes, determinan la separación de las definiciones de parámetros entre sí y del nombre de la plantilla. Esta separación no depende de los posibles caracteres de barra vertical adicionales en la forma expandida del nombre de la plantilla y las definiciones de parámetros. Sin embargo, si después de la sustitución de una plantilla interna el carácter de barra vertical está en la llamada de la plantilla externa, es como cualquier otro y desempeña su papel en la determinación de la separación. En otras palabras, el análisis se realiza primero una vez para la sustitución y luego una vez para el renderizado, pero en ambos casos no hay una vez extra en el medio. En el caso de la sustitución de la plantilla interna solamente, son efectivos dos análisis sucesivos.
Al sustituir una plantilla que contiene {{{p|q}}} (una etiqueta de parámetro con valor predeterminado), esto resulta en el valor de p si está definido y, de lo contrario, en q. Por ejemplo, usando [[w:Template:Timc|Plantilla:Timc]] (en la Wikipedia en inglés), {{subst:t pd}} da el wikitexto 2.
Si una página se sustituye a sí misma (por ejemplo, en la parte de noinclude de una página de plantilla), sustituye la versión anterior.
Consideraciones de uso
Como se mencionó, un cambio en una plantilla ordinaria después de la sustitución no afecta a la página en la que se sustituyó, y una variable sustituida que depende del tiempo ya no depende del tiempo, etc. Sin embargo, una sustitución de, por ejemplo, {{#expr:2*3}} no afecta en absoluto al renderizado.
La relación entre el wikitexto de una página y su renderizado puede volverse más fácil de entender después de la sustitución, porque se tiene todo el wikitexto juntos y las sustituciones de parámetros se han realizado.
También puede volverse más complejo. Centrarse por separado en entender una llamada de plantilla y entender el contenido de la plantilla puede ser más fácil. El wikitexto después de la sustitución a menudo es más complejo que cuando el wikitexto requerido se habría escrito directamente.
A diferencia de una llamada de plantilla (si se conocen las plantillas), el wikitexto después de la sustitución no muestra cómo se puede producir un resultado similar. El wikitexto puede ser largo y complicado, y por lo tanto incómodo de escribir directamente, o puede ser simple, por ejemplo, un número resultante de un cálculo, pero incómodo de encontrar directamente. Al estudiar el wikitexto de una página, uno puede pensar que este wikitexto es lo que se supone que debe escribir y encontrar directamente para obtener el resultado, incluso en casos donde eso sería muy impráctico.
En tales casos, la documentación de la llamada de la plantilla es útil. Al igual que en la programación de computadoras cambiamos el código fuente y/o los datos para producir nuevos resultados, y no cambiamos directamente el archivo objeto, aquí cambiaríamos las llamadas de las plantillas y/o las plantillas, en lugar de cambiar directamente el wikitexto resultante de la sustitución.
Plantillas ordinarias
En el caso de sustituir una plantilla ordinaria, la etiqueta de la plantilla se reemplaza por el wikitexto de la plantilla, con los valores de los parámetros sustituidos por los parámetros.
- Ejemplo
- m:Template:t2, que contiene
start-{{{1}}}-middle-{{{2}}}-end
- y se llama como
{{subst:t2|[[a]]|{{tc}}}}(ver {{tc}}) da el wikitexto:start-[[a]]-middle-{{tc}}-end, que se renderiza como- start-a-middle-in-end.
La sustitución elimina las partes de noinclude y las etiquetas de includeonly.
Parámetros:
- Una sustitución con p=r reemplaza {{{p}}} y {{{p|q}}} por r; esto incluye los casos en que r tiene la forma {{{s}}} o {{{s|t}}}.
- Una sustitución con p indefinido conserva {{{p}}} y reemplaza {{{p|q}}} por la predeterminada q (en la Wikipedia en inglés).
Con "subst:", el reemplazo de una etiqueta de plantilla por wikitexto no funciona de forma recursiva. Para una sustitución recursiva completa, use Special:ExpandTemplates. Consulte también substall y sustitución multilevel a continuación.
La sustitución paso a paso de plantillas que incluyen otras plantillas que incluyen más plantillas, etc., puede ser útil para analizar y documentar el comportamiento de plantillas complejas, para un ejemplo, consulte m:Template talk:Lop.
Sin embargo, después de una sustitución, una página puede renderizarse de manera diferente, por ejemplo, si las plantillas producen llaves, barras verticales y/o signos de igual que después de la sustitución determinan la expansión de otras plantillas, pero sin sustitución se tratan como texto simple.
En ausencia de parámetros, la sustitución de plantillas se puede comparar con copiar el wikitexto o el renderizado de una inclusión de {{ msgnw:pagename }} previsualizada o guardada. Sin embargo, la sustitución de plantillas excluye las partes de <noinclude>, elimina las etiquetas de <includeonly> y reemplaza los parámetros no definidos por sus valores predeterminados.
Plantillas predefinidas
En el caso de sustituir una plantilla predefinida, sin parámetros que dependan de otras plantillas, la etiqueta se reemplaza por el resultado.
Nota: subst: debe agregarse directamente antes del nombre de la plantilla predefinida sin espacios intermedios.
Aplicar subst a una variable funciona como aplicarlo a una plantilla. Por ejemplo, una marca de tiempo:
- {{subst:CURRENTYEAR}}-{{subst:CURRENTMONTH}}-{{subst:CURRENTDAY}} T {{subst:CURRENTTIME}} [[w:UTC|]]
puede dar el wikitexto
- 2010-04-10 T 06:30 [[w:UTC|UTC]], que se renderiza como
- 2010-04-10 T 06:30 UTC.
In the case of substituting a predefined template with a parameter depending on another template, that has to be substituted too, with a separate subst: modifier, otherwise the result is undefined.
{{subst:UC:{{subst:tc}}}}gives IN, the same wikitext as {{UC:{{tc}}}} is expanded to; UC: is applied to the output "in" of Tc.{{subst:ns:{{subst:#expr:2*3}}}}gives File.{{ns:{{subst:#expr:2*3}}}}gives wikitext {{ns:6}} rendered as Archivo.- {{subst:t1|{{subst:NAMESPACE}}}} gives the wikitext startHelpend (see {{t1}})
- {{subst:t1|{{subst:#expr:3*4}}}} gives the wikitext start12end
- {{subst:t1|{{subst:uc:AbCdEf}}}} gives the wikitext startABCDEFend
- {{subst:#expr:{{subst:3X|11*}}1}} gives the wikitext Error en la expresión: no se reconoce el carácter de puntuación «[».
- {{subst:UC:{{subst:3X|abc}}}} gives the wikitext PLANTILLA:3X
- {{subst:LC:{{subst:#expr:1/100000}}}} gives the wikitext 1e-05 (see LC:)
- {{subst:#expr:2*{{subst:CURRENTDAY}}}} gives (at the time of writing) the wikitext 30
- {{subst:UC:{{subst:CURRENTDAYNAME}}}} gives (at the time of writing) the wikitext THURSDAY
However:
{{subst:UC:{{tc}}}}gives the wikitext{{TC}}rendered as in.{{subst:ns:{{#expr:2*3}}}}stays {{subst:ns:{{#expr:2*3}}}}, rendered as {{subst:ns:6}} (see ns:).
As mentioned before, on substitution, all calls without substitution of templates, variables, and parser functions are treated as plain text. As a result substitution of the outer x: in a nested
{{ x:...{{ y:...}} }} often is only suitable if all inner y: are also substituted.
In the case of substitution of a predefined template, if the expression for one of its parameters contains {{{p|3}}} with undefined p, this code reduces to 3. However, on the page itself, {{{p|3}}} is treated as such, not as 3.
Examples:
- {{#expr:2*{{{p}}}}} gives Error en la expresión: no se reconoce el carácter de puntuación «{».
- {{#expr:2*{{{p|3}}}}} gives 6
- {{subst:#expr:2*{{{p|3}}}}} gives Expression error: Unrecognized punctuation character "{".
- substituting a template containing {{<includeonly>subst:</includeonly>#expr:2*{{{p|3}}}}} gives 6 if p is not assigned a value, and twice the number p if it is assigned a value.
- the same result can be obtained from a template containing {{{{{subst}}}#expr:2*{{{p|3}}}}}, if the substitution call has a parameter of "
subst=subst:".
Compare:
- {{uc:2*{{{p}}}}} gives 2*{{{P}}}
- {{uc:2*{{{p|q}}}}} gives 2*Q
- {{subst:uc:2*{{{p|q}}}}} gives the wikitext 2*{{{P|Q}}} rendered as 2*Q
and also (from above):
{{subst:UC:{{subst:tc}}}}gives IN, just like {{UC:{{tc}}}} does; UC is applied to the output "in" of Tc.{{subst:UC:{{tc}}}}gives the wikitext{{TC}}rendered as in.
In the substitution of UC, the inclusion tag {{tc}} is treated as string just like {{{p|q}}}.
Partial substitution
Inside an ordinary template one can apply substitution to an ordinary template call containing a parameter, to replace it by the direct wikitext containing the parameter. It amounts to automatically merging the two templates (creating a "composite template" like a composite function). It is not possible if the inner and/or outer template is predefined. (However, manually merging e.g. a call of #expr inside another one is useful for increasing the accuracy of the result by avoiding intermediate rounding to 12 digits.)
This way one can dispense with the optional substitution technique described below, and apply substitution of the resulting outer template by simply using "subst:" (unless there are more nesting levels).
Example:
- {{subst:t}} gives the wikitext start-{{{1|pqr}}}-end, just that of m:Template:t, without noinclude parts and includeonly tags
- {{subst:t|a{{{p|q}}}b}} gives the wikitext start-a{{{p|q}}}b-end
Examples with double substitution:
- {{subst:3X|{{subst:t}}}} gives the wikitext start-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|pqr}}}-endstart-{{{1|q}}}-end
- {{subst:3X|{{subst:t|{{{1|q}}}}}}} gives the wikitext start-{{{1|q}}}-endstart-{{{1|q}}}-endstart-{{{1|q}}}-end
Multilevel substitution
When substituting a template it may be desirable to carry out a substitution inside the template too. This can be done with "safesubst:" in the template. To prevent premature substitution (i.e., when the template is saved), this code is provided as default value of an unused parameter. Since the empty string is a possible—but for other purposes uncommon—parameter name, it is usually a suitable choice for the name of this unused parameter, so we can use the code {{{|safesubst:}}}.
The difference with {{{|subst:}}} is that {{{|safesubst:}}}, evaluating to safesubst: if the parameter with the empty string as name is undefined, not only allows multilevel substitution but also multilevel transclusion, because on transclusion it is ignored. To make the template such that it allows the choice between these two options as well as one-level substitution (and more choices if more templates, variables, and/or parser functions are involved) one or more parameters are needed, see below.
Sometimes a template call defines a value of the parameter with the empty string as name, just for inserting this value as comment inside the template tag, or for lay-out of the template tag, see template tag lay-out. This would affect the working of the code {{{|safesubst:}}}. To allow this other dummy use of the parameter, another parameter name can be used in {{{parameter name|safesubst:}}}, or to avoid any possible clash of dummy parameter names, includeonly tags can be used, see below.
Multilevel substitution with independent control of each substitution separately
A parameter subst (or more, each with its own name) can be used with "safesubst:" and the empty string as possible values. Thus we can for example control whether an inner template is substituted too when the outer template is substituted. Either possibility can be made the default.
Inner templates with parameters may control further inner substitutions in the same way; these parameters may depend on the substitution parameter controlling the substitution of the inner template, since if that is not substituted, inner substitutions within that template are not possible.
Similarly, if there are multiple templates, variables, and/or parser functions in the inner template(s) we can control substitution of all, either independently by using different parameters, or with some or all using the same parameter.
For example, if template T uses parameter subst1:
- with the empty string as default, T calls inner templates and parser functions prefixing their names with {{{subst1|}}}; for calling T we can use:
- {{t|..}} (no substitution)
- {{subst:t|..}} (one-level substitution)
- {{subst:t|subst1=subst:|..}} (two-level substitution)
- {{subst:t|subst1=safesubst:|..}} (ditto)
- with default "safesubst:", T calls inner templates and parser functions prefixing their names with {{{subst1|safesubst:}}}; for calling T we can use
- {{t|..}} (no substitution)
- {{subst:t|subst1=|..}} (one-level substitution)
- {{subst:t|..}} (two-level substitution)
To transfer the choice of substituting or not to templates and parser functions called inside the inner templates of T, we can add to the call of these inner templates something of the form subst2={{{subst1|}}} or subst2={{{subst1|safesubst:}}}, respectively (variables and parser functions don't get the additional parameter).
See also m:Help:Calculation#Substitution and m:Template:Example table with computations, with optional substitution.
Partial substitution
Using a template prepared for optional subst=subst: only with ordinary substitution, without specifying parameter values, allows to insert its code into another template, like copy and paste, but all
<noinclude> parts and <includeonly> keywords automatically stripped. Executing inserted code instead of calling it may be more efficient for the server.
A typical example for this technique is expanding, within another template, a template used as test expression in a #switch: like m:Template:len:
- Development code:
{{#switch: {{len|parameter tag}}|0=case 0 etc.}} - Standard solution:
{{{{{subst|}}}#switch: {{{{{subst|}}}len|parameter tag|subst={{{subst|}}}}}|0=case 0 etc.}} - Better solution: create template code by applying substitution using this wikitext:
{{{{{subst|}}}#switch: {{subst:len|parameter tag}}|0=case 0 etc.}}
m:Template:len is prepared for optional substitution, therefore both solutions work, but the latter solution substituting its code is simpler and more efficient.
See m:Template:csn and m:Template:lz12 for cases where Template:len was substituted in this way.
If a template uses a parameter whose name is an expression containing a template or parser function, and the template is called with a corresponding parameter definition (in terms of the final name of the parameter) it expands properly only if at the time of expansion of the template the expression for the name of the parameter is or has been evaluated. Thus if the template is substituted without substituting the expression for the parameter name, the parameter definition is "lost", so the parameter becomes undefined. Therefore in such a case no substitution can give the same rendered result as full substitution, while partial substitution gives a different result. See e.g. m:Template:ts1.
Composite operations
By {{A|{{B|p}}}} a template A is called with, as parameter, a call of template B with a parameter p. We could integrate such template calls to a single call {{C|p}} of a "composite template" C with parameter p.
- The wikitext for template C would be {{A|{{B|{{{1}}}}}}}, or with optional substitution the following construct:
- {{ {{{subst
|}}} A|{{ {{{subst|}}} B|{{{1}}} |subst={{{subst|}}} }} |subst={{{subst|}}} }} - The subst={{{subst|}}} is only necessary for recursive substitution as explained above.
Note that it is not useful to specify "{{subst|subst:}}" since in the substitution phase this tag does not reduce to the default "subst:".
If A and/or B is predefined the construct is similar, but without subst={{{subst|}}} for that template.
Includeonly
An alternative method to prevent premature substitution, known as "includeonly subst magic", is with a pair of includeonly tags. Substitution is prevented by having the template call inside these tags. Substitution is also prevented by having one or both tags anywhere in the template call except inside a parameter definition. Thus the tag(s) can be before, inside, or after "safesubst:" or "subst:", or inside or after the template name. The positions of the two tags only influence the rendering of the template page itself.
The form {{<includeonly>safesubst:</includeonly>something}} suggests that substitution is prevented by discarding "safesubst:" on the page itself, but actually substitution is prevented because the safesubst-syntax is disturbed by the tags.
It doesn't substitute "something" at the time of the creation of the relevant template, but has the desired effect when the template is substituted.
For examples see "preload" in Extension:InputBox and "substitution" in Help:Magic words.
Creating a page which applies substitution on the next save
See m:Help:Recursive conversion of wikitext.
Forced substitution
Some templates deliberately refuse to work without substitution, for an example see w:en:Template:en. This technique is essential for templates like w:en:Template:en producing some kind of timestamp, e.g. adding pages to dated categories.
- The following code in any template T outputs a warning unless recursive substitution with
subst=subst:is in effect: {{{{{subst|}}}ifdef|{{{{{subst|subst:}}}ns:0}}|'''Warning'''}}.- Output for {{T}} or {{subst:T}}: Warning,
- output for {{T|subst=subst:}}: Plantilla:Ifdef,
- output for {{subst:T|subst=subst:}}: nothing (no remaining wikitext).
- This is a rare case where replacing ifdef by #if: doesn't work directly.
Substitution of part of the parameters
Let template Feelings use parameters 1 and 2. Consider creating a template Emotions with one parameter 1, corresponding to Feelings, with a given value love of parameter 2. Compare {{Feelings|2=love}} and {{Feelings|1={{{1}}}|2=love}}. They look the same on the template page, see e.g. m:Template:t ps, but the first does not work because {{{1}}} is treated as text, not as parameter.
However, with substitution (using "subst:" or Special:Expandtemplates) the resulting wikitext is the same, without distinction between a text {{{1}}} and a parameter, it is a parameter anyway, so "1={{{1}}}" is not needed.
If Feelings contains e.g. #expr with an expression containing both parameters the same applies, except that we can only substitute the highest level (Feelings), not the parser function, so we cannot use Special:Expandtemplates.
In general, substituting a parameter and applying a template or parser function sometimes gives the same result as substituting the template or parser function with the triple-braced parameter code and then substituting the parameter.
Without defaults (all rendered the same in one-step substitution as without substitution):
Examples with equality:
Feelingstemplate containingWith {{{1}}} one can {{{2}}}substituted with1=love,2=helpgivesWith love one can help; substituted with2=helpit givesWith {{{1}}} one can help, which itself, substituted with1=compassiongivesWith compassion one can help.- Two-level substitution of a template containing
{{#if:{{{4}}}|{{{3}}}p}}with 3=u, 4=v gives up; substituted with 4=v it gives {{{3}}}p, which itself, substituted with 3=u gives up.
Examples without equality:
- Two-level substitution of a template containing
{{#if:{{{3}}}|{{{4}}}p}}with 3=, 4=v gives the empty string; substituted with 4=v it gives vp, which itself, substituted with 3=u remains vp. - Two-level substitution of a template containing
{{#if:{{{2}}}|{{{1}}}p}}with 1=u, 2=v gives up; substituted with 2=v it gives {{{1}}}pp (the bug), which itself, substituted with 3=u, gives upp. - Two-level substitution of a template containing
{{#expr:{{{1}}}*{{{2}}}}}with 1=7, 2=8 gives 56; substituted with 2=8 it gives <strong class="error">Expression error: Unrecognised punctuation character "{"</strong>, which itself, substituted with 1=7, remains the same.
Thus without equality we may or may not get an error message.
One example shows that substitution of one parameter can be affected by the bug mentioned above. However, we can then replace e.g. {{{1}}} by {{{1{{{{{substvoid|}}}void}}}}} and do full substitution, except that substvoid is undefined, preventing the bug. The result works already correctly with transclusion. Subsequently it can be substituted with substvoid=subst: so that we get the plain {{{1}}}.
With defaults:
Rendered the same as without substitution:
- Two-level substitution of a template containing
With {{{1|love}}} one can {{{2}}}with2=helpgivesWith {{{1|love}}} one can help. - Two-level substitution of a template containing
{{#if:{{{4}}}|{{{3|d}}}p}} with 4=v gives {{{3|d}}}p.
Not rendered the same as without substitution:
- Two-level substitution of a template containing
{{#if:{{{3|}}}|{{{4}}}p}} with 4=v gives vp. - Two-level substitution of a template containing
{{#if:{{{2}}}|{{{1|d}}}p}} with 2=v gives {{{1|d}}}pp (the bug). - Two-level substitution of a template containing
{{#expr:{{{1|6}}}*{{{2}}}}}with 2=8 gives <strong class="error">Expression error: Unrecognised punctuation character "{"</strong>.
After substitution with the parameter definition:
{{subst:#if:{{{3|}}}|vp}}gives vp.{{subst:#if:v|{{{1|d}}}p}}gives dpp (the bug).{{subst:#expr:{{{1|6}}}*8}}gives <strong class="error">Expression error: Unrecognised punctuation character "{"</strong>.
Rewritten:
{{subst:#if:{{subst:#ifeq:{{{3|+}}}|{{{3|-}}}|vp}}}}gives the empty string.{{subst:#if:v|{{subst:#ifeq:{{{1|+}}}|{{{1|-}}}|{{{1}}}|d}}p}}gives dp.{{subst:#expr:{{subst:#ifeq:{{{1|+}}}|{{{1|-}}}|{{{1}}}|6}}*8}}gives 48.
Limitations
Substitution is not available inside parser tags like <ref>...</ref> and <gallery>...</gallery>.
If you write {{subst:foo}}, it is not substituted nor transcluded, but remains as-is.
Documenting substitution
Usage of a template through subst: does not automatically show up in page histories.
Therefore providing the line of wikitext containing "subst:" in the edit summary is especially useful.
Also pages with a substituted template do not show up in backlinks, and the template does not appear in the list of transcluded templates on the edit page. The template could add pages to a category to track substitutions, but listing this category on a page may clutter the list of content-based categories the page is in. Also, comments outside noinclude tags are included in the wikitext. Thus a comment can be used to mention the template. It can even contain the values of the parameters, because substitution of parameters works even in comments.
See also
- Help:Substitution/tl;dr – tl;dr
- w:Help:Substitution#The safesubst: modifier
- w:Wikipedia:Template substitution – partly technical, partly policy
- Phabricator:T4003 – feature request to allow marking a template as being substituted without "subst:"
- Templates containing a call to itself with "subst:" and producing a similar call with updated info, either replacing or adding to the previous info:
