Wikipedia:Límites de plantillas


MediaWiki tiene varios parámetros que limitan la cantidad y diversidad de información que puede incluirse en la página. Estos límites tienen que ver con la información que es transcluida o sustituida en una página pero no directamente con la información de la fuente de la página misma. A continuación se explicará cómo y por qué se aplican estos límites, y cómo los usuarios pueden trabajar con ellos.

La inclusión de límites se llevó a cabo en la Wikipedia en inglés por Tim Starling el 14 de agosto de 2006. Se habilitó un nuevo preprocesador en enero de 2008, eliminando el "límite incluido de preexpansión" y sustituyéndolo por un límite de "nodos contados por el preprocesador".

Antecedentes editar

¿De qué va esto? editar

El software MediaWiki, que genera el HTML de una página desde su fuente wiki, usa un analizador sintáctico para tratar con la información incluida en ella. Para esto se usa un "preprocesador" que convierte la fuente wiki en una estructura de datos conocida como árbol, usando este árbol para producir el wikitexto "expandido", donde las llamadas a las plantillas encerradas en dobles llaves son reemplazadas por los contenidos de las plantillas.

Durante el proceso de conversión, el software usa diversos contadores para caracterizar la complejidad de la página que está siendo generada. Cuando el análisis sintáctico de una página comienza, estos contadores marcan cero, pero van incrementándose en los momentos adecuados durante el proceso de análisis sintáctico en la forma descrita. Existen límites superiores en estos contadores, y el analizador sintáctico no permite que se rebasen.

¿Por qué hay límites? editar

Las páginas muy extensas o muy complicadas son lentas de analizar sintácticamente. Esto no es sólo un inconveniente para los usuarios, sino que también puede ser usado para montar un ataque de denegación de servicio a los servidores, mediante el cual una solicitud de una página fuerza al software Mediawiki a analizar sintácticamente una cantidad desproporcionada de información. Los límites ayudan a prevenir esta clase de ataques, y aseguran que las páginas sean procesadas en un tiempo razonable.

Trabajar dentro de los límites editar

Cuando una página alcanza el límite de plantillas, la solución más común es reducir el tamaño de las mismas, usando los métodos que se describen más abajo. Si esto no es posible, puede hacerse necesario incluir más información de forma directa en la página fuente, en vez de a través de la transclusión por plantillas.

¿Cuándo surgen los problemas? editar

Donde más frecuentemente se alcanzan los límites de inclusión es en páginas que usan la misma plantilla muchas veces, por ejemplo mediante el uso de una transclusión por línea en una tabla extensa. Incluso en el caso de que la cantidad de información que la plantilla añade pueda ser pequeña, la cuenta aumenta cada vez que la plantilla se usa, por lo que es posible que se alcancen los límites antes de lo esperado. Es raro que las páginas que incluyan tan sólo unas pocas docenas de plantillas alcancen los límites de inclusión, a menos que estas plantillas en sí mismas contengan una gran cantidad de información.

¿Y cómo lo averiguas? editar

Una vez que se ha procesado el cuerpo de la página, se añade por parte del software un comentario en HTML al final del código de la página con los valores finales de los distintos contadores. Por ejemplo, la página en:AIDS (de la Wikipedia en inglés, de fecha 9 de abril de 2008) contiene los siguientes comentarios en su fuente generada en HTML:

<!-- 
NewPP limit report
Preprocessor node count: 33368/1000000
Post-expand include size: 326336/2048000 bytes
Template argument size: 153666/2048000 bytes
Expensive parser function count: 0/500
-->

Dada la manera en la que los contadores son incrementados, estos tamaños serán siempre inferiores a los límites. Si cualquiera de estos tamaños está cerca del límite, entonces es muy posible que algunas de las plantillas no se hayan expandido. Cada vez que una plantilla no se expande, esto se refleja en el cuerpo de la página mediante un comentario HTML que contiene un mensaje de error.

Límites de inclusión editar

Hay dos límites en el volumen de información de una página: el de tamaño de inclusión post-expansión y el de tamaño de argumentos de plantilla.

Cada vez que el analizador sintáctico es requerido por el código fuente de una página para expandir una plantilla (esto es, para reemplazarla por transclusión o por sustitución), el analizador sintáctico añade la longitud del HTML generado por la plantilla y actualiza el contador post-expansión de la página. Si esta suma es superior al límite post-expansión, la plantilla inicial no resulta reemplazada y se añade un mensaje de error como comentario en la salida HTML. En otro caso, el contador post-expansión es incrementado hasta su nuevo valor, y el analizador sintáctico continúa con su labor. El contador post-expansión se incrementa cada vez que se expande una plantilla. Así, una plantilla que aparece más de una vez en una página fuente puede contribuir más de una vez al tamaño post-expansión de la misma.

El nuevo preprocesador no expande las plantillas en las ramificaciones no ejecutadas de funciones sintácticas condicionales. Por ejemplo, en el código {{#if:yes|{{bar}}|{{foo}} }}, la plantilla {{bar}} es expandida, pero la plantilla {{foo}} no. En todo caso, un argumento de una plantilla puede contribuir a la cuenta de post-expansión incluso aunque no aparezca en la salida final. Por ejemplo, al analizarse el código {{#if:{{foo}}|yes|no}}, la longitud de la versión expandida de la plantilla {{foo}} es añadida al contador post-expansión, dado que es necesario expandir la plantilla para decidir la rama de la función condicional a elegir.

Las llamadas a plantillas sin argumentos expanden la caché de texto. Así, si {{foo}} incluye la metaplantilla de segundo nivel {{bar}}, entonces, aunque se realicen múltiples llamadas a {{foo}}, sólo se incrementará el tamaño post-expansión que incluya la expansión completa de {{foo}}; la inclusión secundaria {{bar}} será contada sólo una vez. Pero si se incluye la misma plantilla múltiples veces con {{foo|arg}}, entonces las plantillas secundarias serán contadas cada vez, incluso aunque el argumento sea todas las veces el mismo.

Un segundo contador, el contador de "tamaño de argumentos de plantilla", lleva la cuenta de la longitud total de los argumentos de plantilla que han sido substituidos.

El uso de comentarios, noinclude y onlyinclude editar

Sólo la información que sobrevive a la fase de expansión en el preprocesador es tenida en cuenta por el contador postexpansión. La longitud de los comentarios HTML en el wikitexto (que no está reproducida en el HTML fuente producido) no es incluida en el contador post-expansión. Tanto el código que está en el interior de una sección <noinclude> como el que está fuera de una sección <onlyinclude> no resulta expandido, así que dichas secciones no contribuyen al tamaño post-expansión. En todo caso, los enlaces de lenguaje o de categoría, que son eliminados en el proceso de análisis sintáctico, sí que son contados.

Anteriormente (antes de enero de 2008), el texto dentro de las etiquetas <noinclude>, aunque no se expandía para las plantillas, sí que limitaba el tamaño total del buffer de página. Por esta razón, cualquier plantilla usada muchas veces (como más de 200) en una misma página, usaba una subpágina doc separada ("/doc") enlazada con etiquetas <noinclude>, como en el caso de "{{template doc}}", para enlazar la documentación, sólo expandible al ser visualizada de forma autónoma, sin incluir la página principal. En las plantillas creadas antes de 2008, incluso los enlaces de categorías y los enlaces de interwikis (hacia las wikipedias en otros idiomas) producían páginas que excedían los límites de buffer para plantillas utilizadas más de 200 veces por página. Para las plantillas usadas sólo unas pocas veces por página, la documentación interna o los enlaces de categoría o de interwiki no afectaban al límite del buffer de página. En 2008, se tomaron medidas para que las plantillas con secciones de noinclude de 4kb usadas más de 200 veces por página volviesen a exceder los límites de procesamiento de plantillas en sus mayores secciones noinclude (doble chequeo), como había ocurrido en noviembre de 2007 (usando el anterior analizador sintáctico del lenguaje MediaWiki).

Transclusiones anidadas editar

En la actualidad, dada la forma en la que el software MediaWiki computa los tamaños de inclusión postexpansión, las transclusiones anidadas son especialmente costosas (véase bugzilla 13260). Si la página A transcluye a B y B no hace otra cosa sino transcluir a C, el tamaño de C será contado dos veces en el tamaño de inclusión postexpansión de la página A. Esto puede provocar que algunas páginas alcancen los límites de plantillas mucho antes de lo esperado.

Este fenómeno se aplica también a las funciones sintácticas: una transclusión dentro de una función sintáctica contará dos veces en el tamaño de inclusión postexpansión. Esto puede ser mitigado a veces moviendo las transclusiones fuera de la función sintáctica, p.ej. reemplazando

{{#if:test|{{template1}}|{{template2}} }}

con

{{ {{#if:test|template1|template2}} }}.

Contador de nodos del preprocesador editar

Un tercer límite mide la complejidad de la página más que el volumen de información. Cuando el analizador sintáctico expande una página, crea una estructura de información conocida como árbol que se corresponde con la estructura HTML de la página. Cada nodo del árbol que es visitado durante la expansión incrementa el contador de nodos del preprocesador. Si se supera esta cuenta, el analizador sintáctico abortará el análisis mostrando el error "Node-count limit exceeded" en el HTML generado. El contador de nodos no es simplemente una función del número de plantillas; cada enlace, cada encabezamiento de sección, o cualquier otro elemento HTML añadirá nodos a la cuenta. Las expansiones múltiples de la misma plantilla contarán para el contador de nodos múltiples veces, a menos que la plantilla no tenga argumentos.

Llamadas a funciones sintácticas costosas editar

Hay un límite de 500 para el contador de funciones sintácticas costosas, como por ejemplo:

  • #ifexist, usada para cambiar el funcionamiento de una plantilla en función de si existe o no una página en particular. Si el límite en este contador es rebasado, las llamadas adicionales a #ifexist actuarán como si las páginas a las que se remiten no existieran.
  • PAGESINCATEGORY.
  • PAGESIZE.

Las páginas que rebasan este límite son categorizadas automáticamente en Categoría:Wikipedia:Páginas con llamadas a funciones sintácticas demasiado costosas.

Especial:Expandir Plantillas editar

La extensión ExpandTemplates genera una nueva página especial en Especial:ExpandTemplates. Se usa para expandir manualmente el wikitexto contenido en las llamadas a las plantillas. Las llamadas son expandidas recursivamente a su wikitexto plano. Special:ExpandTemplates también expande recursivamente todas las llamadas a funciones sintácticas - algo que no puede conseguirse con la sustitución (véase bug 2777). En algunas situaciones, puede ser necesario expandir completamente una plantilla usando la página ExpandTemplates y copiar manualmente el código fuente resultante en un artículo o plantilla. Esto es muy útil cuando la expansión de la plantilla reduce su longitud, así como cuando una llamada a #switch que contenga una lista de alternativas sea «expandida» a una de esas alternativas.

Referencias (en inglés) editar