stringtranslate.com

Módulo:Cuadro de mensajes

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 )