stringtranslate.com

Módulo: Portal

--[==[ Este módulo es una implementación de Lua de la antigua plantilla {{Portal}}. A febrero de 2019, se utiliza en casi 7.900.000 artículos. -- ¡Ten cuidado al actualizarlo! Produce dos funciones: p.portal, que genera una lista de portales, y p.image, que -- produce el nombre de la imagen para un portal individual. -- Los datos de la imagen del portal se guardan en submódulos de [[Module:Portal/images]], que se enumeran a continuación: -- [[Module:Portal/images/a]] - para nombres de portal que comienzan con "A". -- [[Module:Portal/images/b]] - para nombres de portal que comienzan con "B". -- [[Module:Portal/images/c]] - para nombres de portal que comienzan con "C". -- [[Module:Portal/images/d]] - para nombres de portal que comienzan con "D". -- [[Module:Portal/images/e]] - para nombres de portales que comiencen con "E". -- [[Module:Portal/images/f]] - para nombres de portales que comiencen con "F". -- [[Module:Portal/images/g]] - para nombres de portales que comiencen con "G". -- [[Module:Portal/images/h]] - para nombres de portales que comiencen con "H". -- [[Module:Portal/images/i]] - para nombres de portales que comiencen con "I". -- [[Module :Portal/images/j]] - para nombres de portales que comiencen con "J". -- [[Module: Portal/images/k]] - para nombres de portales que comiencen con "K". -- [[Module :Portal/images/l]] - para nombres de portales que comiencen con "L". -- [[Module :Portal/images/m]] - para nombres de portales que comiencen con "M". -- [[Module:Portal/images/n]] - para nombres de portales que comiencen con "N". -- [[Module:Portal/images/o]] - para nombres de portales que comiencen con "O". -- [[Module:Portal/images/p]] - para nombres de portales que comiencen con "P". -- [[Module:Portal/images/q]] - para nombres de portales que comiencen con "Q". -- [[Module:Portal/images/r]] - para nombres de portales que comiencen con "R". -- [[ Module:Portal/images/s]] - para nombres de portales que comiencen con "S". -- [[Module :Portal/images/t]] - para nombres de portales que comiencen con "T". -- [[Module: Portal/images/u]] - para nombres de portales que comiencen con "U". -- [[Module :Portal/images/v]] - para nombres de portales que comiencen con "V". -- [[Module:Portal/images/w]] - para nombres de portales que comiencen con "W". -- [[Module:Portal/images/x]] - para nombres de portales que comiencen con "X". -- [[Module:Portal/images/y]] - para nombres de portales que comiencen con "Y". -- [[Module:Portal/images/z]] - para nombres de portales que comiencen con "Z". -- [[Module:Portal/images/other]] - para nombres de portales que comiencen con cualquier otra letra. Esto incluye números, -- letras con diacríticos,y letras en alfabetos no latinos. -- [[Module:Portal/images/aliases]] - para agregar alias a los nombres de portales existentes. Use esta página para variaciones-- en ortografía y diacríticos, etc., sin importar con qué letra comienza el portal. -- -- Las páginas de datos de imágenes están separadas por la primera letra para reducir la carga del servidor cuando se agregan, cambian o eliminan imágenes. -- Anteriormente, todas las imágenes estaban en una página de datos en [[Module:Portal/images]], pero esto tenía la desventaja de que todas las 5.000.000 de páginas que usan este módulo debían actualizarse cada vez que se agregaba o eliminaba una imagen. ]==] local p = {} -- determinar si nos están llamando desde un sandbox local isSandbox = mw . getCurrentFrame (): getTitle (): find ( 'sandbox' , 1 , true ) local sandbox = isSandbox and '/sandbox' or '' local function sandboxVersion ( s ) return isSandbox and s .. '-sand' or s end local templatestyles = 'Module:Portal' .. sandbox .. '/styles.css' local getArgs = require ( 'Module:Arguments' ). getArgs local yesno = require ( 'Module:Yesno' ) -- Lista de espacios de nombres que no son de discusión que no deben rastrearse (las páginas de discusión nunca se rastrean) local badNamespaces = { 'user' , 'template' , 'draft' , 'wikipedia' } -- Verifica si se debe hacer seguimiento en este espacio de nombres -- Devuelve verdadero a menos que la página sea uno de los espacios de nombres prohibidos local function checkTracking ( title ) local thisPage = title or mw . título . getCurrentTitle () si thisPage . isTalkPage entonces devuelve falso fin local ns = thisPage . nsText : lower () para _ , v en ipairs ( badNamespaces ) hacer                                                    if  ns  ==  v  then return false end end return true end función local matchImagePage ( s ) -- Busca la subpágina de imagen apropiada dado un nombre de portal en minúsculas más la primera letra de ese nombre de portal. if type ( s ) ~= ' string ' or # s < 1 then return end local firstLetter = mw.ustring.sub ( s , 1 , 1 ) local imagePage if mw.ustring.find ( firstLetter , ' ^[az]' ) then imagePage = ' Module : Portal /images/' .. firstLetter .. sandbox else imagePage = 'Module:Portal/images/other' .. sandbox end return mw.loadData ( imagePage )[ s ] end función local getAlias ( s ) -- Obtiene un alias de la página de datos de alias de imagen . local aliasData = mw . loadData ( 'Module:Portal/images/aliases' .. sandbox ) para portal , alias en pares ( aliasData ) hacer para _ , alias en ipairs ( alias ) hacer si alias == s entonces devuelve portal fin fin fin fin local defaultImage = 'Portal-puzzle.svg|link=|alt=' función local getImageName ( s ) -- Obtiene el nombre de la imagen para una cadena dada. si tipo ( s ) ~= 'cadena' o # s < 1 entonces devuelve defaultImage                                                                    fin s = mw . ustring . lower ( s ) imagen local = matchImagePage ( s ) o matchImagePage ( getAlias ​​( s )) o defaultImage imagen = mw . ustring . gsub ( imagen , '^Archivo:' , '' ) --- quitar el encabezado incorrecto Archivo: o Imagen: imagen = mw . ustring . gsub ( imagen , '^Image:' , '' ) devuelve imagen fin función local existe ( título ) éxito local , existe = pcall ( función () devuelve título . existe fin ) -- Si éxito = falso, entonces nos quedamos sin llamadas de función de analizador costosas y no podemos verificar si existe -- en ese caso, no arroja un error de Lua devuelve no éxito o existe fin -- Función para verificar los portales de argumentos en busca de errores, generar categorías de seguimiento si es necesario -- La función primero verifica si hay muy pocos/muchos portales proporcionados -- Luego verifica la lista de portales para purgar cualquier portal que no exista -- Argumentos: -- portals: lista sin procesar de portales -- args.tracking: ¿se solicita seguimiento? (no rastreará títulos o espacios de nombres incorrectos) -- args.redlinks: ¿deberían mostrarse los enlaces rojos? -- args.minPortals: número mínimo de argumentos del portal -- args.maxPortals: número máximo de argumentos del portal -- Devuelve: -- portals = lista de portales, con enlaces rojos purgados (si args.redlinks=false) -- trackingCat = categoría de seguimiento posible -- errorMsg = función de mensaje de error p . _checkPortals ( portals , args ) local trackingCat = '' local errMsg = nil -- El seguimiento está activado de forma predeterminada. -- Se desactiva si se cumple alguna de las siguientes condiciones -- 1/ el parámetro "tracking" se establece en 'no, 'n' o 'false'                                                  -- 2 / la página actual falla en las pruebas de espacio de nombres o nombre de página local trackingEnabled = args.tracking y checkTracking ( ) args.minPortals = args.minPortals o 1 args.maxPortals = args.maxPortals o - 1 -- comprueba si hay muy pocos portales si # portales < args.minPortals entonces errMsg = ' especifique al menos ' .. args.minPortals .. ' portal' .. ( args.minPortals > 1 y 's' o ' ' ) trackingCat = ( trackingEnabled y ' [[Categoría : Plantillas de portal con muy pocos portales ]]' o ' ' ) return portals , trackingCat , errMsg end -- comprueba si hay demasiados portales si args.maxPortals > = 0 y # portales > args . maxPortals entonces errMsg = 'demasiados portales (máximo = ' .. args . maxPortals .. ')' trackingCat = ( trackingEnabled y '[[Categoría:Plantillas de portal con demasiados portales]]' o '' ) return portals , trackingCat , errMsg end if not args . redlinks o trackingEnabled then -- crea una nueva lista de portales que existen local existingPortals = {} for _ , portal in ipairs ( portals ) do local portalTitle = mw . title . new ( portal , "Portal" ) -- si el portal existe, colóquelo en la lista if portalTitle and exist (                                                                        portalTitle )  entonces table.insert ( existingPortals , portal ) -- de lo contrario, establezca la categoría de seguimiento elseif trackingEnabled entonces trackingCat = "[[Categoría:Plantillas de portal con portales con enlaces rojos]]" end end -- Si los enlaces rojos están desactivados, use la lista de portales purgada de enlaces rojos portals = args . redlinks y portales o existingPortals -- si no queda nada después de la purga, establezca la categoría de seguimiento if # portals == 0 and trackingEnabled entonces trackingCat = trackingCat .. "[[Categoría:Páginas con plantilla de portal vacía]]" end end return portals , trackingCat , errMsg end función local portalBox ( args ) return mw . html . crear ( 'ul' ) : attr ( 'rol' , 'navegación' ) : attr ( 'aria-label' , 'Portales' ) : agregarClase ( 'noprint' ) : agregarClase ( args . error y '' o sandboxVersion ( 'portalbox' )) : agregarClase ( args . borde y sandboxVersion ( 'portalborder' ) o '' ) : agregarClase ( sandboxVersion ( args . izquierda y 'portalizquierda' o 'portalderecha' )) : css ( 'margen' , args . margen o nulo ) : nueva línea () fin de la función local fillBox ( raíz , contenidos ) para _ ,elemento en ipairs ( contenido ) hacer entrada local =                                                     raíz : etiqueta ( 'li' ) entrada : addClass ( sandboxVersion ( 'portalbox-entry' )) imagen local = entrada : etiqueta ( 'span' ) imagen : addClass ( sandboxVersion ( 'portalbox-image' )) imagen : wikitext ( elemento [ 1 ]) enlace local = entrada : etiqueta ( 'span' ) enlace : addClass ( sandboxVersion ( 'portalbox-link' )) enlace : wikitext ( elemento [ 2 ]) fin retorno raíz fin función p . _portal ( portales , args ) -- Esta función construye el cuadro de portal utilizado por la plantilla {{portal}}. -- Normaliza todos los argumentos si args . redlinks == 'include' entonces args . redlinks = true fin args . addBreak = args [ 'break' ] para clave , predeterminado en pares ({ left = false , tracking = true , nominimum = false , redlinks = false , addBreak = false , border = true }) hacer si args [ clave ] == nulo entonces args [ clave ] = predeterminado fin args [ clave ] = yesno ( args [ clave ], predeterminado ) fin raíz local = portalBox ( args ) seguimiento local Cat = '' errMsg local =                                             nil args.minPortals = args.nominimum y 0 o 1 args.maxPortals = - 1 portals , trackingCat , errMsg = p._checkPortals ( portales , args ) root : wikitext ( trackingCat ) -- si hay un mensaje de error, colóquelo en el cuadro y devuelva if errMsg then if args.border then -- suprima el mensaje de error cuando border = no args . error = true -- recrear el cuadro sin formato sofisticado root = portalBox ( args ) root : wikitext ( trackingCat ) local errTag = root : tag ( 'strong' ) errTag : addClass ( 'error' ) errTag : css ( 'padding' , '0.2em' ) errTag : wikitext ( 'Error: ' .. errMsg ) end return tostring ( root ) end -- si no hay portales (y no hay error), solo devuelve la categoría de seguimiento si # portales == 0 entonces devuelve trackingCat end local contents = {} -- Muestra los portales especificados en los argumentos posicionales. local defaultUsed = nil para _ , portal en ipairs ( portales ) hacer local portalImage = getImageName ( portal ) si portalImage == defaultImage entonces defaultUsed = portal fin local image = string.format ( '[[Archivo:%s|32x28px|class=noviewer]]' , portalImage ) enlace local =                                                          string.format ( ' [[Portal:%s|%s%sportal]]' , portal , portal , args.addBreak y ' <br />' o ' ' ) table.insert ( contenido , { imagen , enlace }) fin si defaultUsed y args.tracking y checkTracking ( ) entonces local cat = string.format ( '[[Categoría:Plantillas de portal con imagen predeterminada | %s]]' , defaultUsed ) raíz : wikitext ( cat ) fin retorno astring ( fillBox ( raíz , contenidos )) fin función p . _demo ( imageList , args ) para clave , predeterminado en pares ({ left = false , border = true }) hacer si args [ clave ] == nil entonces args [ clave ] = predeterminado fin args [ clave ] = yesno ( args [ clave ], predeterminado ) fin raíz local = portalBox ( args ) contenido local = {} - Muestra los portales especificados en los argumentos posicionales. para _ , fn en ipairs ( imageList ) hacer imagen local = string.format ( '[[Archivo:%s|32x28px|class=noviewer]]' , fn ) enlace local = string.format ( '[[:Archivo:%s|%s]]' , fn , fn ) tabla.insert ( contenido ,{ imagen , enlace }) fin retorno astring (                                                        fillBox ( root , contents )) fin de la función p._image ( portal , keep ) -- Función contenedora para permitir que se acceda a getImageName() mediante #invoke. -- compatibilidad con versiones anteriores: si se pasa tabla, toma el primer elemento si tipo ( portal ) == 'tabla' entonces portal = portal [ 1 ] fin local nombre = getImageName ( portal ) -- Si keep es (o equivalente), entonces permite que se devuelvan todos los metadatos (como los bordes de la imagen) local keepargs = yesno ( keep ) local args = mw.text.split ( name , " |" , true ) local result = { args [ 1 ]} -- el nombre del archivo siempre viene primero local category = '' -- analiza el nombre , buscando argumentos de categoría para i = 2 , # args do local m = mw.ustring . match ( args [ i ], "^%s*category%s*=" ) if keepargs or m then table.insert ( result , args [ i ]) end end -- reensamblar argumentos return table.concat ( result , "|" ) end local function getAllImageTable () -- Devuelve una matriz que contiene todas las subpáginas de imágenes (menos alias) cargadas por mw.loadData. local images = {} for i , subpage in ipairs { 'a' , 'b' , 'c' , 'd' , 'e' , ​​'f' , 'g' , 'h' , 'i' ,'yo' ,                                                          'k' ,  'l' ,  'm' ,  'n' ,  'o' ,  'p' ,  'q' ,  'r' ,  's' ,  't' ,  'u' ,  'v'       , ' w' , 'x' , 'y' , 'z' , 'other' } do local imageTable = mw.loadData ( 'Module:Portal/images/' .. subpage .. sandbox ) for portal , image in pairs ( imageTable ) do local args = mw.text.split ( image , " |" ) images [ portal ] = args [ 1 ] -- solo usa el nombre del archivo de la imagen end end return images end function p._displayAll( portales , args ) -- Esta función muestra todos los portales que tienen imágenes de portal. Esta función es para fines de mantenimiento y no debe utilizarse en artículos por dos razones: 1) hay más de 1500 portales con imágenes de portal y 2) el módulo no registra cómo se escriben en mayúsculas los nombres de los portales, por lo que los enlaces a los portales pueden estar rotos. local lang = mw . language . getContentLanguage () portals = portals o {} para portal en pares ( getAllImageTable ()) do table. insert ( portals , lang : ucfirst ( portal )) end table. sort ( portals ) args . redlinks = args . redlinks o "yes" return p . _portal ( portals , args ) end function p ._imageDupes ()                                       -- Esta función busca en las subpáginas de imágenes para encontrar imágenes duplicadas. Si existen imágenes duplicadas, no es necesariamente algo malo, -- ya que diferentes portales pueden elegir la misma imagen. Sin embargo, esta función es útil para identificar imágenes que -- deben ser movidas a un alias de portal para facilitar el mantenimiento. local causes , dupes = {}, {} for portal , image in pairs ( getAllImageTable ()) do if not causes [ image ] then causes [ image ] = portal else table.insert ( dueps , string.format ( 'La imagen "[[:File:%s|%s]]" se usa para ambos portales "%s" y "%s".' , image , image , causes [ image ], portal )) end end if # dueps < 1 then return 'No se encontraron imágenes duplicadas.' else return 'Se encontraron las siguientes imágenes duplicadas: \n * ' .. table.concat ( dupes , ' \n * ' ) end end local function processPortalArgs ( args ) -- Esta función procesa una tabla de argumentos y devuelve dos tablas: una matriz de nombres de portales para su procesamiento por ipairs, y una tabla de -- los argumentos nombrados que especifican opciones de estilo, etc. Necesitamos usar ipairs porque queremos listar todos los portales en el orden -- en que fueron pasados ​​a la plantilla, pero también queremos poder manejar argumentos posicionales pasados ​​explícitamente, por ejemplo -- {{portal|2=Politics}}. El comportamiento de ipairs no está definido si hay valores nulos, por lo que debemos asegurarnos de que se eliminen todos. args = type ( args ) == 'table' and args or {} local portals = {} local namedArgs = {} for k , v in pairs ( args ) do if type ( k ) ==                                                           ' number' y type ( v ) == ' string' then - Asegúrese de que no tenemos nombres de portales que no sean cadenas. table.insert ( portales , k ) elseif type ( k ) ~= 'number' then namedArgs [ k ] = v end end table.sort ( portales ) for i , v in ipairs ( portales ) do portals [ i ] = args [ v ] end return portals , namedArgs end - Punto de entrada para ordenar portales a partir de otros argumentos con nombre function p._processPortalArgs ( args ) return processPortalArgs ( args ) end function p.image ( frame ) local origArgs = getArgs ( frame ) local portales , args = processPortalArgs ( origArgs ) return p._image ( portales [ 1 ] , args.border ) end function p . demo ( frame ) local args = getArgs ( frame ) local styles = frame : extensionTag { name = 'templatestyles' , args = { src = templatestyles } } return styles .. p._demo ( args , args ) fin de la función local makeWrapper ( funcName ) -- Procesa argumentos externos y los envía a las otras funciones. return function ( frame )                                                 -- Si se llama a través de #invoke, use los argumentos pasados ​​a la plantilla de invocación, o los argumentos pasados ​​a #invoke si existen. De lo contrario , suponga que los argumentos se pasan directamente desde la consola de depuración o desde otro módulo Lua. -- También: recorte los espacios en blanco y elimine los argumentos en blanco local origArgs = getArgs ( frame ) -- cree dos tablas para pasar a func: una matriz de nombres de portales y una tabla de argumentos con nombre. portales locales , args = processPortalArgs ( origArgs ) resultados locales = '' si funcName == '_portal' o funcName == '_displayAll' entonces resultados = frame : extensionTag { nombre = 'templatestyles' , args = { src = templatestyles } } fin devolver resultados .. p [ funcName ]( portales , args ) fin fin para _ , funcName en ipairs { 'portal' , 'imageDupes' , 'displayAll' } hacer p [ funcName ] = makeWrapper ( '_' .. funcName ) fin devolver p