Este módulo crea una tabla wiki que enumera cada sección de una página junto con el tamaño de esa sección en bytes. Cada sección tiene un enlace wiki a su destino en la página; las subsecciones tienen sangría. Las celdas para los tamaños de las secciones están sombreadas según el tamaño; el fondo de la sección más pequeña es blanco y el fondo de la sección más grande es rojo.
Este módulo tiene dos puntos de entrada: size
, y section_size_get
.
Utilice el punto de entrada size
para emitir la sección wikitable:
{{#invoke:Section sizes|size|<page name>|style=<style string>}}
El punto de entrada size()
toma dos argumentos de frame
, uno posicional y otro con nombre:
<page name>
(obligatorio) – el primer parámetro posicional es el nombre de la página; puede incluir espacio de nombres|style=
(opcional) – cadena CSS adecuada para usar en el style=
atributo de la wikitabla; por ejemplo, para representar la tabla en el lado derecho de la página:{{#invoke:Section sizes|size|<page name>|style=float:right; margin-left:.5em}}
{{#invoke:Section sizes|size|Klingon language}}
section_size_get
devuelve una estadística del tamaño de un artículo o sección:
{{#invoke:Section sizes|section_size_get|<page name>|[<section name|token>]|_all|_pct=yes |_nosep=yes}}
section_size_get
toma de uno a tres parámetros posicionales y dos parámetros nombrados de frame
:
<page name>
(obligatorio) – el primer parámetro posicional es el nombre de la página; puede incluir espacio de nombres<section name|token>
(opcional) – el segundo parámetro posicional es el nombre de la sección o uno de los tres tokens (si el parámetro 2 está ausente, el valor predeterminado es la sección principal del artículo)<section name>
– devuelve el tamaño de la sección nombrada_lead
– devuelve el tamaño de la sección principal; valor predeterminado cuando el segundo parámetro posicional está vacío o se omite_max
– devuelve el tamaño de la sección individual más larga_total
– devuelve el tamaño del artículo (debe ser igual a PAGESIZE )_all
(opcional) – el tercer parámetro posicional es el alcance de la medida de tamaño; requiere ; no compatible con palabras clave; devuelve el tamaño de la sección nombrada más los tamaños de sus subsecciones<section name>
|_nosep=
(opcional) – sin separador; acepta un valor: yes
; tamaño de sección emitido sin separadores de miles; ignorado cuando |_pct=
está configurado (predeterminado: con separador)|_pct=
(opcional) – porcentaje; acepta un valor: yes
; emite un tamaño de , , , o como un porcentaje de redondeado a 2 decimales con un símbolo '%'<section name>
_lead
_max
_total
_total
Estos ejemplos se refieren al mismo artículo que se muestra en el size
ejemplo.
Tamaños de una sección nombrada con y sin sus subsecciones ( _all
):
{{#invoke:Section sizes|section_size_get| Klingon language | Phonology }}
→ 4.931{{#invoke:Section sizes|section_size_get| Klingon language | Phonology | _all }}
→ 12,216Palabras clave:
{{#invoke:Section sizes|section_size_get| Klingon language | _lead }}
→ 5,513{{#invoke:Section sizes|section_size_get| Klingon language | _max }}
→ 8,574{{#invoke:Section sizes|section_size_get| Klingon language | _total }}
→ 64.539Tamaños de sección sin separador de miles:
{{#invoke:Section sizes|section_size_get| Klingon language | Phonology | _nosep=yes }}
→ 4931{{#invoke:Section sizes|section_size_get| Klingon language | _total | _nosep=yes }}
→ 64539Tamaños de sección como porcentaje de _total
:
{{#invoke:Section sizes|section_size_get| Klingon language | Phonology | _pct=yes }}
→ 7,64%{{#invoke:Section sizes|section_size_get| Klingon language | _lead | _pct=yes }}
→ 8,54%{{#invoke:Section sizes|section_size_get| Klingon language | _max | _pct=yes }}
→ 13,28%{{#invoke:Section sizes|section_size_get| Klingon language | _total | _pct=yes }}
→ 100,00%require ( 'strict' ); local lang_obj = mw . language . getContentLanguage (); -- objeto de idioma para formatear números de manera apropiada para el idioma local --[[--------------------------< I 1 8 N _ T >------------------------------------------------------------------ Una tabla asociativa de texto estático usada en este módulo para usar al traducir este módulo a otros idiomas. Los valores $1 y $2 son reemplazados con valores como se indica en el comentario del mensaje asociado ]] local i18n_t = { -- mensajería de error no fatal [ 'markup removed' ] = 'markup removed; no se puede vincular' , -- mensaje de error -- mensaje de error fatal [ 'fatal_no_article' ] = 'error: no hay artículo: $1' , -- $1 es el nombre de la página [ 'fatal_no_sections' ] = 'error: no se encontraron secciones en: $1' , -- $1 es el nombre de la página [ 'fatal_redirect' ] = 'error: $1 es una redirección' , -- $1 es el nombre de la página [ 'help link' ] = '([[$1|help]])' , -- texto de ayuda wikilink para todos los mensajes de error; $1 está llamando al nombre de la plantilla [ 'error category' ] = '[[category:Páginas con errores $1]]' , -- $1 está llamando al nombre de la plantilla; comente esta línea para suprimir el error category [ 'table caption' ] = 'Tamaño de sección para [[$1]] ($2 secciones)' , -- caption; $1 es el nombre de la página; $2 es el número de secciones [ 'section_name' ] = 'Nombre de la sección' , -- encabezados de columna; de izquierda a derecha [ 'byte_count' ] = 'Byte<br />count' , [ 'section_total' ] = 'Section<br />total' , [ 'top' ] = nil , -- para la sección principal sin nombre; use esto solo cuando este módulo no obtenga la cadena correcta de MediaWiki:Vector-toc-beginning [ 'total' ] = 'Total' ,-- pie de página } sección local_top = i18n_t . top o -- i18n_t.top rara vez se necesita mw . message . new ( 'vector-toc-beginning' ) -- la sección principal no tiene un encabezado, obtiene el mensaje de interfaz para 'top' : inLanguage ( lang_obj : getCode ()) -- en el contenido del wiki actual language : plain (); -- y nos aseguramos de que tenemos una cadena --[[--------------------------< ERROR _ MSG _ MAKE >-------------------------------------------------- función común para emitir mensajes de error fatales y no fatales template_name usado en el mensaje de error enlace de texto de ayuda y enlace de categoría de error obtenidos de MediaWiki categoría de error emitida solo para inclusiones en el espacio de nombres Discusión; solo cuando i18n_t['error category'] tiene un valor; solo cuando aún no hemos emitido el enlace de categoría. ]] local err_cat_added ; -- indicador booleano de ámbito de página; verdadero cuando se ha emitido el enlace de categoría de error; nil else función local error_msg_make ( template_name , msg , args_t , fatal ) local err_cat = '' ; -- cadena vacía para concatenación si no err_cat_added y i18n_t [ ' categoría de error' ] y 1 == mw.title.getCurrentTitle (). namespace entonces err_cat = mw.message.newRawMessage ( i18n_t [ ' categoría de error' ] , { template_name }): plain ( ); -- crear categoría de error wikilink err_cat_added = true ; -- haremos esto solo una vez end local err_msg = table.concat ({ fatal and '' o ' ' , -- sin espacio antes de los mensajes de error fatales fatal and '<span style="font-size:100%;" class="error">' o '<span style="color:#d33">' , -- seleccione estilo fatal/no fatal mw . message . newRawMessage ( msg , args_t ): plain (), -- componer el mensaje ' ' , -- insertar un espacio entre el mensaje y el enlace de ayuda mw . message . newRawMessage ( i18n_t [ 'enlace de ayuda' ], { template_name }): plain (), -- añadir el enlace de ayuda '</span>' , -- y terminado con el estilo err_cat -- si aún no se emitió, añadir enlace de error cat }); return err_msg ; end --[[--------------------------< REDLINK _ TEMPLATE _ REMOVE >-------------------------------- Después de un preprocesamiento del encabezado de sección, cualquier plantilla no conocida por el wiki local se habrá convertido en un enlace rojo del espacio de plantilla al nombre de plantilla desconocido en el espacio de nombres de plantilla nombrado localmente. Estos enlaces rojos deben eliminarse y el nombre de la sección debe marcarse como modificado para que el enlace del encabezado de sección pueda suprimirse. devuelve el nombre de la sección y el booleano true si se reemplazaron los enlaces rojos; boolean false else ]] local function redlink_template_remove ( section_name ) local redlink_pattern = '%[%[:' .. mw . site . namespaces [ 10 ][ "name" ] .. ':.-%]%]' ; -- obtener nombres de plantilla nombre del espacio en el idioma local de la wiki local count ; section_name , count = section_name : gsub ( redlink_pattern , '[...]' ); -- reemplazar enlaces rojos de plantilla desconocida con puntos suspensivos entre corchetes return section_name , 0 < count ; end --[[--------------------------< ANCHORS _ REMOVE >-------------------------------------------------- eliminar el marcado html que parece un ancla. Parece haber dos formas generales: <span class="anchor" id="Foo"></span> <span id="Foo"></span> se permiten varios tramos de ancla Debido a que el marcado de ancla está permitido en los encabezados de sección,no establece el indicador modificado al regresar ]] función local anchors_remove ( section_name ) patrones locales = { '<span +[^>]*class *= *"anchor"[^>]*></span>' , -- no nos importa el id= o cualquier otro atributo aquí si tenemos la clase de ancla '<span +%f[%a]id *= *".-" *></span>' , -- aquí el span debe tener solo el atributo id= } for _ , pattern in ipairs ( patterns ) do section_name = section_name : gsub ( pattern , '' ); -- elimina todos los spans de ancla end return section_name ; end --[[--------------------------< REFS _ REMOVE >-------------------------------------------------------- elimina el marcado de referencia de wikitexto. se hace de esta manera porque luego preprocesamos el nombre de la sección para renderizar cualquier plantilla que esté presente en el nombre de la sección (no debería haberla, pero eso no impide que los editores las incluyan). preprocesar un nombre de sección con marcado de referencia hace que MediaWiki cree una lista de referencias; un efecto secundario que no queremos. devuelve el nombre de la sección modificado y el booleano true cuando se han eliminado las referencias; nombre de la sección sin modificar y false en caso contrario. ]] función local refs_remove ( section_name ) nombre local ; -- nombre de sección modificado (o no modificado) markup_removed local ; -- booleano verdadero cuando se ha eliminado el marcado de referencia count local ; name , count = section_name : gsub ( '<ref.-/>' , '' ); -- eliminar etiquetas <ref con atributos /> autocerradas markup_removed = 0 < count ; -- count distinto de cero, establecer <markup_removed> como verdadero name , count = name : gsub ( '<ref.->.-</ref>' , '' ); -- eliminar las etiquetas de referencia restantes y el contenido (si lo hay) return name , markup_removed or ( 0 < count ) end --[[--------------------------< STRIPMARKERS _ REMOVE >---------------------------------------- elimina los marcadores de franja de los nombres de sección preprocesados. puede ser mejor conservar las etiquetas <nowiki/> antes del nombre de sección se preprocesa para evitar que '<nowiki/>'' se interprete como marcado en negrita '''. No es posible hacer eso aquí porque todos los marcadores de tiras de nowiki solo se identifican por los números. devuelve el nombre de la sección modificado y el booleano true cuando se han eliminado los marcadores de tiras; el nombre de la sección sin modificar y false en caso contrario. ]] función local stripmarkers_remove ( section_name ) local count ; section_name , count = section_name : gsub ( ' \127 [^ \127 ]*UNIQ%-%-%a+%-[%x]+%-QINU[^ \127 ]* \127 ' , '' ); return section_name , ( 0 < count ); fin --[=[--------------------------< REMOVE _ WIKI _ LINK >---------------------------------------------- Obtiene el texto para mostrar de un wikilink como [[A|B]] o [[B]] da B str:gsub() devuelve A|B de un [[A|B]] o B de [[B]] o B de B (sin marcado wikilink). En l(), l:gsub() elimina el enlace y la tubería (si existen); el segundo :gsub() recorta el espacio en blanco de la etiqueta si str estaba envuelto en marcado wikilink. Presumiblemente, esto se debe a que sin wikimarkup en str, no hay coincidencia en el gsub inicial, la función de reemplazo l() no se llama. ]=] función local remove_wiki_link ( str ) return ( str : gsub ( "%[%[([^%[%]]*)%]%]" , función ( l ) return l : gsub ( "^[^|]*|(.*)$" , "%1" ): gsub ( "^%s*(.-)%s*$" , "%1" ); fin )); fin --[[--------------------------< REMOVE _ CONTAINER >---------------------------------------------- Inspirado en lo anterior, elimina todo entre < & > Se usa para eliminar contenedores html de los encabezados para corregir enlaces de sección rotos, pero el texto legítimo dentro de < & > también se elimina devuelve texto y booleano verdadero si se modifica; texto y booleano falso en caso contrario ]] función local remove_container ( str ) recuento local ; str ,contar = str : gsub ( "<([^>]*)>" , function ( l ) return l : gsub ( "^%s*(.-)%s*$" , "" ); end ); return str , 0 < count end --[=[--------------------------< MAKE _ WIKILINK >---------------------------------------------------- Crea un wikilink; cuando se proporciona tanto el enlace como el texto para mostrar, devuelve un wikilink en el formato [[L|D]]; si solo se proporciona el enlace, devuelve un wikilink en el formato [[L]]; si no se proporciona ninguno o se omite el enlace, devuelve una cadena vacía. ]=] función local make_wikilink ( link , display ) si enlace y ( '' ~= enlace ) entonces si display y ( '' ~= display ) entonces devuelve tabla.concat ({ '[[' , enlace , '|' , display , ']]' }); else return table.concat ({ '[[' , link , ']]' }); end end return display or '' ; -- link no establecido por lo que retorna el texto para mostrar end --[[---------------------------< SECTION _ DATA _ GET >---------------------------------------------- Lee el contenido del artículo y llena las matrices asociativas en secuencia <sections_t>. Las matrices asociativas contienen el nombre de la sección, su ubicación inicial dentro del contenido, el tamaño de la sección y el nivel de la sección (2 (==), 3 (===), etc.). Modifica y devuelve <total> (tamaño del artículo) y <max> (sección más larga). ]] local function section_data_get ( content , total , max , sections_t , max_i ) local s , e , name ; ----------< MAX _ UPDATE >---------- local function max_update ( max , max_i , sec_size ,sec_i ) - función local para actualizar max y su índice si max < sec_size then -- la nueva sección es más larga return sec_size , sec_i ; -- actualizar y listo end return max , max_i ; -- no actualizar end ------------------------------------------- while ( 1 ) do -- se hace de esta manera porque algunos artículos reutilizan los nombres de las secciones s , e , name = string.find ( content , ' \n ==+ *(.-) *==+' , e ); -- obtener el inicio, el final y el nombre de la sección comenzando al final del último hallazgo; la nueva línea debe preceder al marcado de encabezado '==' if s then table.insert ( sections_t , {[ 'name' ] = name , [ 'start' ] = s }); -- guardar el nombre de la sección y la ubicación de inicio de este hallazgo else break ; end end local max_i = 1 ; -- asumir que lead es la sección más larga para i , section_t in ipairs ( sections_t ) do if 1 ~= i then -- i==1 es la sección principal; ya se tuvo en cuenta local escaped_section_name = section_t . name : gsub ( '[%(%)%.%%%+%-%*%?%[%^%$%]]' , '%%%0' ); -- escapar patrones lua en el nombre de la sección local pattern = '(==+ *' .. escaped_section_name .. ' *==+.-)==+' ; -- crear un patrón para obtener el contenido de una sección local section_content = string.match ( content , pattern , section_t . start ); -- obtener el contenido que comienza en la ubicación de inicio string.find() if section_content then section_t . size = # section_content ; -- obtener un recuento de los bytes en la sección total = total + section_t . size ; max , max_i = max_update ( max , max_i , section_t . size , i ); -- mantiene un registro del conteo más grande de lo contrario -- probablemente la última sección (no sigue ningún encabezado apropiado a este nombre de sección) pattern = '(==+ *' .. escaped_section_name .. ' *==+.+)' ; -- crea un nuevo patrón section_content = string.match ( content , pattern , section_t . start ); -- intenta obtener el contenido if section_content then section_t . size = # section_content ; -- obtiene un recuento de los bytes en la sección total = total + section_t . size ; max , max_i = max_update ( max , max_i , section_t . size , i ); -- mantiene un registro del conteo más grande de lo contrario section_t . size = '—' ; -- no hay contenido, por lo que se muestra que end end local _ ; _ , section_t . level = section_content : find ( '^=+' ); -- siempre deben ser los primeros n caracteres del contenido de la sección end end return total , max ; end --[[--------------------------< ARTICLE _ CONTENT _ GET >---------------------------------------- Función común para obtener el contenido de <article>. También obtiene el recuento de bytes para la sección principal porque esa sección es diferente de todas las demás En caso de éxito, devuelve el contenido del artículo sin analizar, el recuento de bytes de la sección principal y un mensaje nulo. En caso de error, devuelve contenido nulo , recuento de bytes nulo de la sección principal y un mensaje de error fatal ]] función local article_content_get ( article , template_name ) local title_obj = mw . title . new ( artículo ) contenido local = title_obj : getContent (); -- obtener el wikitexto no analizado del artículo si no es contenido entonces devolver nil , nil , error_msg_make ( template_name , i18n_t [ 'fatal_no_article' ], { article }, true ); -- emitir un mensaje de error fatal y abandonar fin si title_obj . isRedirect entonces -- las redirecciones no tienen secciones devolver nil , nil , error_msg_make ( template_name , i18n_t [ 'fatal_redirect' ], { article }, true ); -- emitir un mensaje de error fatal y abandonar fin sección_contenido local = contenido : match ( '(.-)===*' ); -- obtener la sección principal si no es section_content entonces devuelve nil , nil , error_msg_make ( template_name , i18n_t [ 'fatal_no_sections' ], { frame . args [ 1 ]}, true ); -- emitir un mensaje de error fatal y abandonar el final devuelve content , # section_content ; -- devuelve el contenido y la longitud de la sección principal y nil para el final del mensaje de error --[[---------------------------< SIZE >---------------------------------------------------------------------- punto de entrada al módulo crear una lista relacionada con el wikienlace de secciones de <nombre del artículo> y su tamaño en octetos en una tabla wikitable que se pueda probar. {{#invoke:Section sizes|size|<article name>}} ]] función local size ( frame ) nombre_plantilla local = frame : getParent (): getTitle (); -- obtener el nombre de la plantilla para usar en mensajes de error y el nombre de la categoría sección local_info_t = { }; -- Tabla para almacenar los nombres y tamaños de las secciones locales. section_content ; -- contenido de la sección usado para contar local totcount = {}; local lastlevel ; local maxlevels ; local levelcounts = {}; local upperlevel ; local highlight ; local highlighttot ; local total ; -- suma de todos los conteos de bytes local max ; -- sección más grande encontrada hasta ahora local totmax ; -- sección más grande encontrada hasta ahora (total de sección) local _ ; -- ficticio para usar gsub para contar bytes local wl_name ; -- porción de anclaje y visualización para wikilinks en la lista renderizada local content , sec_0_count , msg = article_content_get ( frame . args [ 1 ], template_name ); -- obtener el contenido del artículo con el conteo de bytes de la sección principal porque lead es diferente de todos los demás if msg then -- hay algo mal return msg ; -- emitir mensaje y abandonar end total = sec_0_count ; max = sec_0_count ; -- secuencia de matrices asociativas con nombre de sección, ubicación inicial, tamaño y nivel local sections_t = {{[ 'level' ] = 2 , [ 'name' ] = section_top , [ 'size' ] = sec_0_count , [ 'start' ] = 1 }}; -- inicializar con información de la sección principal total , max = section_data_get ( content , total , max , sections_t ); -- rellenar matrices <sections_t> para todas las secciones excepto la sección principal totmax = 0 ; lastlevel = 0 ; maxlevels = 7 ; para j = 1 , maxlevels hace levelcounts [ j ] = 0 ; fin nivel local , tamaño ; para i = # secciones_t , 1 , - 1 hacer nivel = secciones_t [ i ]. nivel ; tamaño = secciones_t [ i ]. tamaño ; si nivel < último nivel entonces -- restablecer todo totcount [ i ] = nivelesconteos [ nivel ] + tamaño ; para j = nivel , nivelesmáx hacer nivelesconteos [ j ] = 0 ; fin fin si nivel >= último nivel entonces totcount [ i ] = tamaño ; fin si nivel > 0 entonces nivelsuperior = nivel - 1 ; nivelesconteos [ nivelsuperior ] = nivelesconteos [ nivelsuperior ] + totcount [ i ]; fin último nivel = nivel ; si totcount [ i ] > totmax entonces totmax = totcount [ i ]; fin fin para i , sección_t en ipairs ( secciones_t ) hacer nivel = sección_t . nivel ; tamaño = sección_t . tamaño ; si tamaño == max entonces resaltar = 'background:red;"|' ; de lo contrario proporción local = tamaño / max -- obtener el valor de "cuánto del máximo" es local el recuento gb = 250 - math.floor ( 250 * proporción ) -- enfoque #f8f9fa [r=248,g=249,b=250] (color de celda de wikitable predeterminado) para recuentos de bytes pequeños highlight = string.format ( 'background:#F8%02X%02X;"|' , gb , gb ) -- sombree el fondo como r: 248, g: gb y b: gb end highlighttot = '' ; -- comience la declaración de estilo if totcount [ i ] == totmax then highlighttot = highlighttot .. 'background:red;' ; else local percentage = totcount [ i ] / totmax -- obtiene el valor de "cuánto del máximo" es local el conteo gb = 250 - math.floor ( 250 * percentage ) -- se aproxima a #f8f9fa [r=248,g=249,b=250] (color de celda predeterminado de la wikitabla) para conteos de bytes pequeños highlighttot = highlighttot .. string.format ( 'background:#F8%02X%02X;' , gb , gb ) -- sombrea el fondo como r: 248, g: gb y b: gb end if level == 2 then highlighttot = highlighttot .. 'font-weight:bold;' ; -- si es sección principal, ponlo en negrita elseif totcount [ i ] == size then highlighttot = 'color:transparent;' ; -- ocultar totales para subsecciones sin subsubsecciones, valores requeridos para ordenamiento apropiado end highlighttot = highlighttot .. '"|' ; -- cerrar la declaración de estilo level = ( 2 < level ) y (( level - 2 ) * 1.6 ) o nil ; -- eliminar desplazamiento y mult por 1.6em (la misma sangría que el marcado ':' que no funciona en una tabla) local markup_removed ; -- indicador temporal para notar que el encabezado de sección ha sido modificado (referencias y marcado tipo html eliminados, etc.) local modified = false ; -- bandera para seleccionar el estilo del encabezado de sección; falso: wikilink; verdadero: texto sin formato con mensaje de error wl_name , modified = refs_remove ( section_t . name ); -- eliminar todas las referencias wl_name = remove_wiki_link ( wl_name ); -- eliminar todos los wikilinks wl_name = wl_name : gsub ( '<nowiki/>' , '__sss_nowiki/__' ); -- reemplazar la etiqueta <nowiki/> con un símbolo secreto especial wl_name = frame : preprocess ( wl_name ); -- renderizar a html wl_name , markup_removed = redlink_template_remove ( wl_name ); -- eliminar los wikilinks de plantilla de redlink creados por el preprocesamiento de plantillas desconocidas modified = modified o markup_removed ; -- actualizar <modified> wl_name = anchors_remove ( wl_name ); -- eliminar el marcado de anclaje conocido; estos están permitidos en el encabezado de sección, así que no los golpees <modified> wl_name = wl_name : gsub ( '__sss_nowiki/__' , '<nowiki/>' ); -- reemplaza el símbolo secreto especial con la etiqueta <nowiki/> wl_name , markup_removed = stripmarkers_remove ( wl_name ); -- elimina cualquier marcador de tira resultante del preprocesamiento modified = modified o markup_removed ; -- actualiza <modified> wl_name = wl_name : gsub ( '</?i>' , ' \'\' ' ); -- el marcado en cursiva se ha convertido a html; anula la conversión para que remove_container() no elimine de forma inapropiada wl_name = wl_name : gsub ( '</?b>' , ' \'\'\' ' ); -- el marcado en negrita se ha convertido a html; anula la conversión para que remove_container() no elimine de forma inapropiada wl_name ,markup_removed = remove_container ( wl_name ); -- eliminar contenedores html de los encabezados de sección para que podamos vincularnos a la sección modified = modified o markup_removed ; -- update <modified> wl_name = wl_name : gsub ( '[%[%]]' , {[ '[' ] = '[' , [ ']' ] = ']' }); -- replace '[' and ']' with entity html for that wikilinked section names work wl_name = mw . text . trim ( wl_name ); -- trim the beginning/final white space if there is because the white space fastens the ancla links url local header_text ; if modified then header_text = table. concat ({ -- los encabezados modificados se representan en texto plano con un mensaje de error wl_name , -- nombre de sección en texto plano error_msg_make ( template_name , i18n_t [ 'markup removed' ], {}), -- mensaje de error con enlace de ayuda }); -- cerrar enlace de ayuda else header_text = make_wikilink ( frame.args [ 1 ] .. '#' ..wl_name: gsub( " ' ' + " , ' ' ), wl_name ); -- sin modificar, se representa como está end table.insert ( section_info_t , table.concat ({ -- construir la mayor parte de una fila de tabla aquí porque aquí tenemos información de encabezado que no tendremos más adelante level y '<span style="margin-left:' .. level .. 'em">' o '' ; -- sangría por nivel de encabezado (número de '=' en el marcado de encabezado) header_text , -- enlace de sección eliminar cualquier marcado en negrita/cursiva de la parte del enlace del wikilink; dejar el marcado en la visualización level y '</span>' o '' , -- cerrar el lapso si está abierto '||style="text-align:right;' , -- separador de columnas de tabla y alineación a la derecha recuento de bytes resaltado de columna , lang_obj :formatNum ( tamaño ), -- recuento de bytes con comas para la sección '||style="text-align:right;' , -- separador de columnas de tabla y alineación a la derecha de la sección de totales de columnas highlighttot , lang_obj : formatNum ( totcount [ i ]), -- recuento total de secciones!! })); end local out = {}; -- crea una wikitable ordenable para la salida table.insert ( out , string.format ( '{| class="wikitable sortable" style="%s" \n |+%s' , -- título de salida y encabezados de columna frame . args . style o '' , -- valor para style= atributo mw . message . newRawMessage ( i18n_t [ 'título de tabla' ], { frame . args [ 1 ], # section_info_t }): plain () )); table.insert ( out , table.concat ({ -- encabezados de columna ' \n !' , i18n_t . section_name , '!!' , i18n_t . byte_count , '!!' , i18n_t . section_total , ' \n |- \n |' -- primera fila de canalización })); table.insert ( out , table.concat ( section_info_t , ' \n |- \n |' )); -- filas de sección con canalizaciones iniciales (excepto la primera fila ya realizada) table.insert ( out , table.concat ({ -- número total de bytes; marcado de encabezado para que la clasificación no mueva esta fila de abajo hacia arriba ' \n |- \n !' , i18n_t . total , -- etiqueta de pie de página '!!style="text-align:right"|' , lang_obj : formatNum ( total ), -- recuento de bytes suma; TODO: a columnas, deben ser dos sumas separadas; ¿prueba de igualdad? '!!style="text-align:"correcto"|' , lang_obj : formatNum ( total ) -- suma del tamaño de la sección; TODO: a columnas, deben ser dos sumas separadas; ¿prueba de igualdad? })); table.insert ( out , ' \n |}' ); -- cierra la wikitable local result = table.concat ( out , '' ); devuelve resultado ; -- porque gsub devuelve cadena y número de reemplazos fin --[[--------------------------< SECTION _ SIZE _ GET >---------------------------------------------- devuelve la longitud de la sección especificada del artículo especificado. parámetros: {{{1}}} – título del artículo (obligatorio) {{{2}}} – nombre de la sección o una de tres palabras clave. Las palabras clave utilizan guiones bajos iniciales para minimizar la confusión con los nombres de sección 'Lead' (el metal) y 'Max' (un nombre propio), etc. <section name> – devuelve la longitud de la sección nombrada; las comparaciones de nombres de sección no distinguen entre mayúsculas y minúsculas. palabras clave: _lead – devuelve la longitud de la introducción (sección sin nombre) _max – devuelve la longitud de la sección más larga _total – devuelve la longitud del artículo {{{3}}} – admite una palabra clave _all – requiere una sección con nombre en {{{2}}}; no compatible con palabras clave; devuelve el tamaño de la sección con nombre más las longitudes de sus subsecciones |_nosep= – acepta un valor 'sí'; representa el tamaño de la sección sin separador de miles; se ignora cuando se establece |_pct=; el valor predeterminado es con coma |_pct= – acepta un valor 'sí'; la función devuelve el tamaño especificado por nombre o palabra clave como un porcentaje de _total redondeado a dos decimales; agrega el símbolo '%'; _total como un porcentaje de _total permitido, pero ¿por qué? devuelve nil cuando no hay coincidencia de palabras clave ni coincidencia de <section name> {{#invoke:section sizes|section_length|<article title>|<_lead|_max|_total|section name>|_all}} ]] función local section_size_get ( frame ) local args_t = require ( "Module:Arguments" ). getArgs ( frame ); local template_name = frame : getParent (): getTitle (); -- obtener el nombre de la plantilla para usar en mensajes de error y el nombre de la categoría local nosep = 'yes' == args_t ._nariz ; -- booleano verdadero cuando |_nosep=yes; falso de lo contrario local pct = 'yes' == args_t . _pct ; -- booleano verdadero cuando |_pct=yes; falso de lo contrario local content , sec_0_count , msg = article_content_get ( args_t [ 1 ], template_name ); -- obtener el contenido del artículo con el conteo de bytes de la sección principal en <count_t> porque la sección principal es diferente de todas las demás si msg entonces -- hay algo mal devolver msg ; -- emitir mensaje y abandonar fin local total = sec_0_count ; -- inicializar con la longitud de la sección principal local max = sec_0_count ; local max_i = 1 ; -- actualizado por section_data_get() ----------< RETVAL >---------- función local retval ( size ) -- función local para seleccionar el formato del valor de retorno según |pct= return pct y string.format ( "%2.2f%%" , 100 * ( size / total )) o -- devuelve el porcentaje lang_obj : formatNum ( size , { noCommafy = nosep }); -- devuelve el tamaño final ----------------------------------- -- secuencia de matrices asociativas con nombre de sección, ubicación inicial, tamaño y nivel local sections_t = {{[ 'level' ] = 2 , [ 'name' ] = section_top , [ 'size' ] = sec_0_count , [ 'start' ] = 1 }}; -- inicial con información principal total , max , max_i = section_data_get ( content , total , max , sections_t , max_i ); -- max_i solo se usa aquí si '_lead' == args_t [ 2 ] entonces -- {{{2}}} tiene la palabra clave '_lead'; la sección principal se maneja de manera diferente a todas las demás secciones return retval ( sec_0_count ); -- devuelve el formulario de salida seleccionado y listo elseif '_max' == args_t [ 2 ] entonces -- cuando {{{2}}} tiene la palabra clave '_max' return retval ( max ); -- devuelve el formulario de salida seleccionado y listo elseif '_total' == args_t [ 2 ] entonces -- cuando {{{2}}} tiene la palabra clave '_total' return retval ( total ); -- devuelve la longitud total del artículo y listo; pct posible, pero ¿por qué? elseif args_t [ 2 ] entonces -- si se establece, debe ser un nombre de sección local target_section_name = args_t [ 2 ]: lower (); -- obténgalo y fuerce a minúsculas para la comparación local section_level ; local section_size = 0 ; for i , section_t in ipairs ( sections_t ) do -- recorrer <section_t.name> buscando una coincidencia; TODO: ¿hay una mejor manera de hacer esto? if not section_level then -- aún no se encontró una coincidencia if section_t . name : lower () == target_section_name then -- forzar minúsculas para la comparación if '_all' == args_t [ 3 ] then -- cuando {{{3}}} tiene la palabra clave '_all' section_level = section_t . level ; -- lo encontramos, así que inicializamos estos; este es un indicador para saber que encontramos la sección de destino section_size = section_t . size ; -- inicializar else return retval ( section_t . size ); -- devolver el formulario de salida seleccionado y listo end end elseif section_level < section_t . level then -- aquí cuando encontramos la sección, la palabra clave '_all' está presente section_size = section_size + section_t . size ; -- el nivel de esta sección es mayor que el del objetivo, por lo que se agrega el tamaño de la subsección else -- aquí cuando encontramos la sección, la palabra clave '_all' está presente return retval ( section_size ); -- devuelve el formulario de salida seleccionado y listo end end else -- aquí cuando {{{3}}} no tiene nada return nil ; -- así que no devuelve nada end end --[[---------------------------< EXPORTEDFUNCTIONS >------------------------------------------ ]] return { size = size , section_size_get = section_size_get , }