Este es un metamódulo que implementa las plantillas de cuadro de mensaje {{ mbox }} , {{ ambox }} , {{ cmbox }} , {{ fmbox }} , {{ imbox }} , {{ ombox }} y {{ tmbox }} . Está pensado para usarse desde módulos Lua y no debe usarse directamente desde páginas wiki. Si desea utilizar la funcionalidad de este módulo desde una página wiki, utilice las plantillas de cuadro de mensaje individuales en su lugar.
Para utilizar este módulo desde otro módulo Lua, primero debes cargarlo.
messageBox local = require ( 'Módulo:Cuadro de mensaje' )
Para crear un cuadro de mensaje, utilice la main
función. Se necesitan dos parámetros: el primero es el tipo de cuadro (como una cadena) y el segundo es una tabla que contiene los parámetros del cuadro de mensaje.
local box = messageBox . main ( boxType , { param1 = param1 , param2 = param2 , -- Más parámetros... })
Hay siete tipos de cajas disponibles:
Consulte la página de plantilla de cada tipo de cuadro para conocer los parámetros disponibles.
Además de la main
función, este módulo tiene funciones independientes para cada tipo de caja. Se accede a ellas mediante el código {{#invoke:Message box|mbox|...}}
, {{#invoke:Message box|ambox|...}}
, etc. Estas funcionarán cuando se las llame desde otros módulos, pero acceden al código utilizado para procesar argumentos pasados desde #invoke, por lo que llamarlas será menos eficiente que llamar a main
.
El módulo utiliza el mismo código básico para cada una de las plantillas enumeradas anteriormente; las diferencias entre cada una de ellas se configuran utilizando los datos en Módulo:Cuadro de mensaje/configuración . A continuación, se muestran las distintas opciones de configuración y lo que significan:
types
– una tabla que contiene los datos utilizados por el parámetro de tipo del cuadro de mensaje. Las claves de la tabla son los valores que se pueden pasar al parámetro de tipo y los valores de la tabla son las tablas que contienen la clase y la imagen utilizadas por ese tipo.default
– el tipo a utilizar si no se pasó ningún valor al parámetro de tipo o si se especificó un valor no válido.showInvalidTypeError
– si se debe mostrar un error si el valor pasado al parámetro de tipo no es válido.allowBlankParams
– por lo general, los valores en blanco se eliminan de los parámetros que se pasan al módulo. Sin embargo, se conservan los espacios en blanco para los parámetros incluidos en la tabla allowBlankParams.allowSmall
– si se puede generar una versión pequeña del cuadro de mensaje con "small=yes".smallParam
– un nombre personalizado para el parámetro pequeño. Por ejemplo, si se establece en "izquierda", se puede generar un cuadro de mensaje pequeño utilizando "pequeño=izquierda".smallClass
– la clase a utilizar para cuadros de mensajes pequeños.substCheck
– si se debe realizar una comprobación de sustitución o no.classes
– una matriz de clases para usar con el cuadro de mensaje.imageEmptyCell
– si se debe utilizar una <td>...</td>
celda vacía si no hay ninguna imagen definida. Esto se utiliza para preservar el espaciado de los cuadros de mensaje con un ancho inferior al 100 % de la pantalla.imageEmptyCellStyle
– si se deben aplicar estilos a las celdas de imagen vacías.imageCheckBlank
– si "image=blank" da como resultado que no se muestre ninguna imagen.imageSmallSize
– Normalmente, las imágenes que se usan en cuadros de mensajes pequeños se configuran en 30 x 30 píxeles. Esto establece un tamaño personalizado.imageCellDiv
– si se debe encerrar la imagen en un div imponiendo un tamaño máximo de imagen.useCollapsibleTextFields
– si se deben utilizar campos de texto que se puedan contraer, es decir, "problema", "arreglo", "discusión", etc. Actualmente solo se utiliza en ambox.imageRightNone
– si imageright=none da como resultado que no se muestre ninguna imagen en el lado derecho del cuadro de mensaje.sectionDefault
– el nombre predeterminado para el parámetro "sección". Depende de useCollapsibleTextFields
.allowMainspaceCategories
– permitir la categorización en el espacio de nombres principal.templateCategory
– el nombre de una categoría que se colocará en la página de plantilla.templateCategoryRequireName
– si el name
parámetro es necesario para mostrar la categoría de la plantilla.templateErrorCategory
– el nombre de la categoría de error que se utilizará en la página de plantilla.templateErrorParamsToCheck
– una matriz de nombres de parámetros para comprobar. Si falta alguno, templateErrorCategory
se aplica a la página de plantilla.require ( 'strict' ) local getArgs local yesno = require ( 'Módulo:Yesno' ) local lang = mw . language . getContentLanguage () local CONFIG_MODULE = 'Módulo:Cuadro de mensaje/configuración' local DEMOSPACES = { talk = 'tmbox' , image = 'imbox' , file = 'imbox' , category = 'cmbox' , article = 'ambox' , main = 'ambox' } -------------------------------------------------------------------------------- -- Funciones auxiliares -------------------------------------------------------------------------------- función local getTitleObject (...) -- Obtiene el objeto de título, pasando la función a través de pcall -- en caso de que superemos el límite de conteo de funciones costosas. local success , title = pcall ( mw . title . new , ...) if success then return title end end función local union ( t1 , t2 ) -- Devuelve la unión de dos matrices. local vals = {} para i , v en ipairs ( t1 ) hacer vals [ v ] = verdadero fin para i , v en ipairs ( t2 ) hacer vals [ v ] = verdadero fin local ret = {} para k en pairs ( vals ) hacer tabla.insert ( ret , k ) fin tabla.sort ( ret ) devolver ret fin función local getArgNums ( args , prefijo ) números locales = {} para k , v en pares ( args ) hacer número local = mw . ustring . match ( tostring ( k ), '^' .. prefijo .. '([1-9]%d*)$' ) si num entonces tabla. insert ( nums , tonumber ( num )) fin fin tabla. sort ( nums ) devolver nums fin -------------------------------------------------------------------------------- -- Definición de la clase Box -------------------------------------------------------------------------------- local MessageBox = {} MessageBox . __index = MessageBox función MessageBox . new ( boxType , args , cfg ) args = args o {} local obj = {} -- Establezca el objeto de título y el espacio de nombres. obj . title = getTitleObject ( args . page ) o mw . title . getCurrentTitle () -- Establezca la configuración para nuestro tipo de cuadro. obj . cfg = cfg [ boxType ] si no obj . cfg entonces local ns = obj . title . namespace -- boxType es "mbox" o una entrada no válida si args . demospace y args . demospace ~= '' entonces -- implementar el parámetro demospace de mbox local demospace = string.lower ( args . demospace ) si DEMOSPACES [ demospace ] entonces -- usar la plantilla de DEMOSPACES obj . cfg = cfg [ DEMOSPACES [ demospace ]] elseif string.find ( demospace , 'talk' ) then -- demo como una página de discusión obj . cfg = cfg . tmbox else -- predeterminado a ombox obj . cfg = cfg . ombox end elseif ns == 0 then obj . cfg = cfg . ambox -- espacio de nombres principal elseif ns == 6 then obj . cfg = cfg . imbox -- espacio de nombres de archivo elseif ns == 14 then obj . cfg = cfg . cmbox -- espacio de nombres de categoría else local nsTable = mw . site . namespaces [ ns ] if nsTable y nsTable . isTalk then obj . cfg = cfg . tmbox -- cualquier espacio de nombres de discusión else obj . cfg = cfg . ombox -- otros espacios de nombres o entrada no válida end end end -- Establece los argumentos y elimina todos los argumentos en blanco excepto los -- enumerados en cfg.allowBlankParams. do local newArgs = {} for k , v in pairs ( args ) do if v ~= '' then newArgs [ k ] = v end end for i , param in ipairs ( obj . cfg . allowBlankParams or {}) do newArgs [ param ] = args [ param ] end obj . args = newArgs end -- Definir la estructura de datos interna. obj . categorías = {} obj . clases = {} -- Para carga diferida de [[Module:Category handler]]. obj . hasCategories = false return setmetatable ( obj , MessageBox ) fin de la función MessageBox : addCat ( ns , cat , sort ) si no cat entonces devuelve nil fin de la función sort entonces cat = string. formato ( '[[Categoría:%s|%s]]' , cat , sort ) de lo contrario cat = string. formato ( '[[Categoría:%s]]' , cat ) fin self . hasCategories = true self . categorías [ ns ] = self . categorías [ ns ] o {} tabla.insert ( self . categorías [ ns ] , cat ) fin de la función MessageBox : addClass ( clase ) si no es clase entonces devuelve nil fin de la tabla.insert ( self . clases , clase ) fin de la función MessageBox : setParameters () local args = self . args local cfg = self . cfg -- Obtener el tipo data.self . type = args . type local typeData = cfg . types [ self . type ] self . invalidTypeError = cfg . showInvalidTypeError y self . type y no typeData typeData = typeData o cfg . types [ cfg . default ] self . typeClass = typeData . class self . typeImage = typeData . image self . typeImageNeedsLink = typeData . imageNeedsLink - Encuentra si el cuadro ha sido sustituido incorrectamente. self . isSubstituted = cfg . substCheck y args . subst == 'SUBST' - Encuentra si estamos usando un cuadro de mensaje pequeño. self . isSmall = cfg . allowSmall y ( cfg . smallParam y args . small == cfg . smallParam o no cfg . smallParam y yesno ( args . small ) ) - Agrega atributos, clases y estilos. self . id = args . id self . name = args . name si self . nombre entonces self : addClass ( 'box-' .. string.gsub ( self . name , ' ' , '_' )) fin si yesno ( args . plainlinks ) ~= false entonces self : addClass ( 'plainlinks' ) fin para _ , clase en ipairs ( cfg . classes o {}) hacer self : addClass ( clase ) fin si self . isSmall entonces self : addClass ( cfg . smallClass o 'mbox-small' ) fin self : addClass ( self . typeClass ) self : addClass ( args . class ) self . style = args . style self . attrs = args . attrs - Establecer el estilo del texto. self . textstyle = args . textstyle - Establecer las clases de imagen. self . imageRightClass = args . imagerightclass o args . imageclass self . imageLeftClass = args . imageleftclass o args . imageclass - Encontrar si estamos en la página de la plantilla o no. Esta funcionalidad solo se usa si se establece useCollapsibleTextFields o si se establecen cfg.templateCategory y cfg.templateCategoryRequireName. self . useCollapsibleTextFields = cfg . useCollapsibleTextFields si self . useCollapsibleTextFields o cfg . templateCategory y cfg . templateCategoryRequireName entonces si self . name entonces local templateName = mw . ustring . match ( self . name , '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) o self . name templateName = 'Template:' .. templateName self . templateTitle = getTitleObject ( templateName ) fin self . isTemplatePage = self . templateTitle y mw . title . equals ( self . title , self . templateTitle ) fin -- Procesar datos para campos de texto plegables. Por el momento, estos solo se usan en {{ambox}}. if self . useCollapsibleTextFields then -- Obtener el valor de self.issue. si self.isSmall y args.smalltext entonces self.issue = args.smalltext de lo contrario local sect si args.sect == '' entonces sect = 'Este' .. ( cfg.sectionDefault o ' page' ) de lo contrario si type ( args.sect ) == ' string ' entonces sect = ' Este' .. args.sect fin local issue = args.issue issue = type ( issue ) == ' string' y issue ~ = ' ' y issue o nulo local text = args.text text = type ( text ) == ' string ' y text o nulo local issues = { } tabla.insert ( issues , sect ) tabla.insert ( issues , issue ) tabla.insert ( issues , text ) self.issue = tabla.concat ( issues , ' ' ) fin -- Obtener el valor de self.talk . local talk = args . talk - Muestra los enlaces de discusión en la página de plantilla o en las subpáginas de plantilla si el parámetro talk está en blanco. if talk == '' and self . templateTitle and ( mw . title . equals ( self . templateTitle , self . title ) or self . title : isSubpageOf ( self . templateTitle ) ) entonces talk = '#' elseif talk == '' entonces talk = nil fin si talk entonces -- Si el valor de la conversación es una página de discusión, crea un enlace a esa página. De lo contrario -- asume que es un encabezado de sección y crea un enlace a la página de discusión de la página actual con ese encabezado de sección. local talkTitle = getTitleObject ( talk ) local talkArgIsTalkPage = true si no talkTitle o no talkTitle . isTalkPage entonces talkArgIsTalkPage = false talkTitle = getTitleObject ( self . title . text , mw . site . namespaces [ self . title . namespace ]. talk . id ) fin si talkTitle y talkTitle . existe entonces local talkText si self . isSmall entonces talkLink local = talkArgIsTalkPage y talk o ( talkTitle . prefixedText .. '#' .. talk ) talkText = string.format ( '([[%s|talk]])' , talkLink ) de lo contrario talkText = 'La discusión relevante se puede encontrar en' si talkArgIsTalkPage entonces talkText = string.format ( '%s [[%s|%s]].' , talkText , talk , talkTitle . prefixedText ) de lo contrario talkText = string.format ( '%s la [[%s#%s|página de discusión]].' , talkText , talkTitle . prefixedText , talk ) fin fin self . talk = talkText fin fin -- Obtener otros valores. self . fix = args . fix ~= '' y args . fix o nil fecha local si args . date y args . date ~= '' entonces fecha = args . date sino si args . date == '' y self . isTemplatePage entonces fecha = lang : formatDate ( 'F Y' ) fin si date entonces self . date = string. format ( " <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>" , fecha ) fin self . info = args . info si yesno ( args . removalnotice ) entonces self . removalNotice = cfg . removalNotice fin fin -- Establezca el campo de texto no colapsable. En este momento, esto lo usan todos los tipos de box excepto ambox, y también ambox cuando small=yes. si self . isSmall entonces self . text = args . smalltext o args . text else self . text = args . text end - Establezca la fila siguiente. self . below = cfg . below y args . below - Configuración general de la imagen. self . imageCellDiv = no self . isSmall y cfg . imageCellDiv self . imageEmptyCell = cfg . imageEmptyCell - Configuración de la imagen izquierda. local imageLeft = self . isSmall y args . smallimage o args . image si cfg . imageCheckBlank y imageLeft ~= 'blank' y imageLeft ~= 'none' o no cfg . imageCheckBlank y imageLeft ~= 'none' entonces self . imageLeft = imageLeft si no imageLeft entonces local imageSize = self . isSmall y ( cfg . imageSmallSize o '30x30px' ) o '40x40px' self . imageLeft = string. format ( '[[Archivo:%s|%s%s|alt=]]' , self . typeImage o 'Information icon4.svg' , imageSize , self . typeImageNeedsLink y "" o "|link=" ) fin fin -- Configuración de la imagen derecha. local imageRight = self . isSmall y args . smallimageright o args . imageright si no ( cfg . imageRightNone y imageRight == 'none' ) entonces self . imageRight = imageRight fin -- establecer templatestyles self . base_templatestyles = cfg . templatestyles self . templatestyles = args . templatestyles fin función MessageBox : setMainspaceCategories () local args = self . args local cfg = self . cfg si no cfg . allowMainspaceCategories entonces devuelve nil fin local nums = {} para _ , prefijo en ipairs { 'cat' , 'categoría' , 'all' } hacer args [ prefijo .. '1' ] = args [ prefijo ] nums = union ( nums , getArgNums ( args , prefijo )) fin -- Lo siguiente es aproximadamente equivalente al antiguo {{Ambox/category}}. fecha local = args . fecha fecha = tipo ( fecha ) == 'string' y fecha preposición local = 'desde' para _ , num en ipairs ( nums ) hacer mainCat local = args [ 'cat' .. tostring ( num )] o args [ 'categoría' .. tostring ( num )] allCat local = args [ 'all' .. tostring ( num )] mainCat = tipo ( mainCat ) == 'string' y mainCat allCat = tipo ( allCat ) == 'string' y allCat si mainCat y fecha y fecha ~= '' entonces catTitle local = string.format ( '%s %s %s' , mainCat , preposición , fecha ) self : addCat ( 0 , catTitle ) catTitle = getTitleObject ( 'Categoría:' .. catTitle ) si no catTitle o no catTitle . existe entonces self : addCat ( 0 , 'Artículos con parámetro de fecha no válido en la plantilla' ) fin elseif mainCat y ( no fecha o fecha == '' ) entonces self : addCat ( 0 , mainCat ) fin si allCat entonces self : addCat ( 0 , allCat ) fin fin fin función MessageBox : setTemplateCategories () local args = self . args local cfg = self . cfg -- Agregar categorías de plantilla. si cfg . templateCategory entonces si cfg . templateCategoryRequireName entonces si self . isTemplatePage entonces self : addCat ( 10 , cfg . templateCategory ) fin si no self . title . isSubpage entonces self : addCat ( 10 , cfg . templateCategory ) fin fin -- Agregar categorías de error de plantilla. si cfg . templateErrorCategory entonces local templateErrorCategory = cfg . templateErrorCategory local templateCat , templateSort si no self . name y no self . title . isSubpage entonces templateCat = templateErrorCategory elseif self . isTemplatePage entonces local paramsToCheck = cfg . templateErrorParamsToCheck o {} local count = 0 para i , parámetro en ipairs ( paramsToCheck ) hacer si no args [ parámetro ] entonces count = count + 1 fin fin si count > 0 entonces templateCat = templateErrorCategory templateSort = tostring ( count ) end if self . categoryNums and # self . categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self : addCat ( 10 , templateCat , templateSort ) end end function MessageBox : setAllNamespaceCategories () -- Establecer categorías para todos los espacios de nombres. if self . invalidTypeError then local allSort = ( self . title . namespace == 0 and 'Main:' or '' ) .. self . title . prefixedText self : addCat ( 'all' , 'El parámetro del cuadro de mensaje de Wikipedia necesita corrección' , allSort ) end if self . isSubstituted then self : addCat ( 'all' , 'Páginas con plantillas sustituidas incorrectamente' ) end end function MessageBox : setCategories () if self . title . namespace == 0 then self : setMainspaceCategories () elseif self . title . namespace == 10 then self : setTemplateCategories () end self : setAllNamespaceCategories () end function MessageBox : renderCategories () if not self . hasCategories then -- No se agregaron categorías, no es necesario pasarlas al controlador de categorías, por lo que, -- si se invocara, devolvería la cadena vacía. -- Entonces, abreviamos y devolvemos la cadena vacía. return "" end -- Convertir las tablas de categorías en cadenas y pasarlas a través de -- [[Módulo:Manejador de categorías]]. return require ( 'Módulo:Manejador de categorías' ). _main { main = table.concat ( self . category [ 0 ] o {}), template = table.concat ( self . category [ 10 ] o {}), all = table.concat ( self . category . all o {}), nocat = self . args . nocat , page = self . args . page } fin de la función MessageBox : export () raíz local = mw . html . create () -- Agrega el error de verificación de subst. if self . isSubstituted y self . name then root : tag ( 'b' ) : addClass ( 'error' ) : wikitext ( string.format ( 'La plantilla <code>%s[[Template:%s|%s]]%s</code> ha sido sustituida incorrectamente.' , mw .text .nowiki ( ' { { ' ) , self .name , self .name , mw .text .nowiki ( ' }}' ) ) ) end local frame = mw .getCurrentFrame ( ) root : wikitext ( frame : extensionTag { name = ' templatestyles' , args = { src = self .base_templatestyles }, }) -- Agregar soporte para una sola hoja de estilos de plantilla personalizada . No documentado como -- la necesidad debería ser limitada y se sustituyen muchas plantillas que usan mbox; no queremos distribuir hojas de estilos de plantilla en lugares arbitrarios si self.templatestyles entonces root : wikitext ( frame : extensionTag { name = 'templatestyles' , args = { src = self.templatestyles } , } ) fin - Crea la tabla de cajas. local boxTable = root : tag ( 'table' ) boxTable : attr ( 'id' , self.id o nil ) para i , clase en ipairs ( self.classes o {}) hacer boxTable : addClass ( class o nil ) fin boxTable : cssText ( self.style o nil ) : attr ( ' role ' , ' presentation ' ) si self.attrs entonces boxTable : attr ( self.attrs ) fin - Agrega la imagen de la izquierda. local row = boxTable : tag ( ' tr ' ) si self . imageLeft then local imageLeftCell = row : tag ( 'td' ): addClass ( 'mbox-image' ) if self . imageCellDiv then -- Si estamos usando un div, redefinimos imageLeftCell para que la imagen -- esté dentro de él. Los divs usan style="width: 52px;", que limita el ancho de la imagen a 52px. Si alguna imagen en un div es más ancha que eso, -- puede superponerse con el texto o causar otros problemas de visualización. imageLeftCell = imageLeftCell : tag ( 'div' ): addClass ( 'mbox-image-div' ) end imageLeftCell : addClass ( self . imageLeftClass ) : wikitext ( self . imageLeft o nil ) elseif self . imageEmptyCell then -- Algunos cuadros de mensaje definen una celda vacía si no se especifica ninguna imagen, y -- otros no. El antiguo código de plantilla en las plantillas donde se especifican celdas vacías da la siguiente pista: "Sin imagen. Celda con algún ancho -- o relleno necesario para que la celda de texto tenga un ancho del 100 %". row : tag ( 'td' ) : addClass ( 'mbox-empty-cell' ) end -- Agrega el texto. local textCell = row : tag ( 'td' ): addClass ( 'mbox-text' ) if self . useCollapsibleTextFields then -- El cuadro de mensaje usa parámetros de texto avanzados que permiten que las cosas sean -- colapsables. Por el momento, solo ambox usa esto. textCell : cssText ( self.textstyle o nil ) textCellDiv local = textCell : tag ( ' div ' ) textCellDiv : addClass ( ' mbox - text - span ' ) : wikitext ( self.issue o nil ) if ( self.talk o self.fix ) then textCellDiv : tag ( ' span ' ) : addClass ( ' hide - when - compact ' ) : wikitext ( self.talk y ( ' ' .. self.talk ) o nil ) : wikitext ( self.fix y ( ' ' .. self.fix ) o nil ) end textCellDiv : wikitext ( self.date y ( ' ' .. self.date ) o nulo ) si self.info y no self.isSmall entonces textCellDiv : etiqueta ( 'span' ) : addClass ( ' hide-when-compact' ) : wikitext ( self.info y ( ' ' .. self.info ) o nulo ) fin si self.remotionNotice entonces textCellDiv : etiqueta ( 'span' ) : addClass ( ' hide -when - compact' ) : etiqueta ( 'i' ) : wikitext ( string.format ( " ( %s)" , self.remotionNotice ) ) fin de lo contrario : formato de texto predeterminado , todo vale. textCell : cssText ( self.textstyle o nulo ) : wikitext ( self.text o nulo ) fin : agrega la imagen de la derecha . imageRight then local imageRightCell = row : tag ( 'td' ): addClass ( 'mbox-imageright' ) if self . imageCellDiv then -- Si estamos usando un div, redefinimos imageRightCell para que la imagen -- esté dentro de él. imageRightCell = imageRightCell : tag ( 'div' ): addClass ( 'mbox-image-div' ) end imageRightCell : addClass ( self . imageRightClass ) : wikitext ( self . imageRight o nil ) end -- Agrega la fila de abajo. if self . below then boxTable : tag ( 'tr' ) : tag ( 'td' ) : attr ( 'colspan' , self . imageRight y '3' o '2' ) : addClass ( 'mbox-text' ) : cssText ( self . textstyle o nil ) : wikitext ( self . below o nil ) fin -- Añadir un mensaje de error para parámetros de tipo no válidos. if self . invalidTypeError then root : tag ( 'div' ) : addClass ( 'mbox-invalid-type' ) : wikitext ( string.format ( 'Este cuadro de mensaje está usando un parámetro "type=%s" no válido y necesita reparación.' , self . type o '' )) fin -- Añadir categorías. root : wikitext ( self : renderCategories () o nil ) devolver tostring ( root ) fin -------------------------------------------------------------------------------- -- Exportaciones -------------------------------------------------------------------------------- local p , mt = {}, {} function p . _exportClasses () - Para realizar pruebas. return { MessageBox = MessageBox } fin de la función p.main ( boxType , args , cfgTables ) local box = MessageBox.new ( boxType , args , cfgTables o mw.loadData ( CONFIG_MODULE ) ) box : setParameters ( ) box : setCategories () return box : export ( ) fin de la función mt .__ index ( t , k ) función de retorno ( marco ) si no getArgs entonces getArgs = require ( 'Módulo:Argumentos' ) . getArgs fin de retorno t.main ( k , getArgs ( marco , { trim = false , removeBlanks = false } )) fin fin de retorno setmetatable ( p , mt )