Este módulo crea pancartas de protección e íconos de candados que se colocan en la parte superior de las páginas protegidas .
Uso
La mayoría de los usuarios no necesitarán utilizar este módulo directamente. Para agregar plantillas de protección a las páginas, puede usar la plantilla {{ pp }}, o puede que le resulte más conveniente usar una de las plantillas de protección más específicas en la tabla a continuación.
De wikitexto
{{#invoke: banner de protección | principal| 1 = motivo | pequeño = sí / no | acción = acción | fecha = fecha de protección | usuario = nombre de usuario | section = nombre de la sección de la página de discusión | categoría = no}}
La sintaxis #invoke se puede utilizar para crear plantillas de protección más específicas que {{ pp }}. Por ejemplo, es posible crear una plantilla de protección que siempre muestre un icono de candado usando el código {{#invoke:Protection banner|main|small=yes}}
. Las páginas que llaman a esta plantilla aún podrán usar otros argumentos, como action . Sin embargo, esto solo funciona a un nivel de profundidad; una página que llame a una plantilla que llame a otra plantilla que contenga el código anterior no podrá utilizar automáticamente parámetros como action .
Nota: Ya no debe especificar la caducidad, ya que se recupera automáticamente en todos los casos.
De Lua
Primero, cargue el módulo.
local mProtectionBanner = require ( 'Módulo: Banner de protección' )
Luego, puede crear pancartas de protección usando la función _main.
mProtectionBanner . _main ( args , cfg , titleObj )
args es una tabla de argumentos para pasar al módulo. Para conocer las posibles claves y valores de esta tabla, consulte la sección de parámetros . Las variables cfg y titleObj están pensadas solo para pruebas; cfg especifica una tabla de configuración personalizada para usar en lugar de Module: Protection banner / config , y titleObj especifica un objeto mw.title para usar en lugar del título actual. args , cfg y titleObj son todos opcionales.
Parámetros
Todos los parámetros son opcionales.
- 1 - la razón por la que la página estaba protegida. Si se establece, debe ser uno de los valores enumerados en la tabla de motivos .
- pequeño : si se establece en "sí", "y", "1" o "verdadero", se genera un icono de candado en lugar de un banner de protección completa.
- acción - la acción de protección. Debe ser uno de "editar" (para protección normal), "mover" (para protección de movimiento) o "revisión automática" (para cambios pendientes). El valor predeterminado es "editar".
- fecha : la fecha de protección. Debe ser una entrada válida para el segundo parámetro de la función analizador #time . Este argumento tiene efecto por motivos que utilizan el parámetro PROTECTIONDATE en su configuración. En julio de 2014, esos eran los motivos de "oficina" y "restablecimiento".
- usuario : el nombre de usuario del usuario para el que se generarán enlaces. A partir de julio de 2014, esto solo tiene efecto cuando se especifica el motivo "usertalk".
- sección : el nombre de la sección de la página de discusión de la página protegida donde se está llevando a cabo la discusión. Esto funciona para la mayoría de los valores de la razón , pero no para todos .
- categoría : las categorías se suprimen si se establece en "no", "n", "0" o "falso".
Razones
La siguiente tabla contiene los motivos disponibles, además de las acciones para las que están disponibles.
Razón | Acción | Descripción |
---|---|---|
blp | editar | Para páginas protegidas para promover el cumplimiento de la política de biografías de personas vivas |
disputa | editar | Para páginas protegidas debido a disputas de edición |
dmca | editar | Para páginas protegidas por la Fundación Wikimedia debido a solicitudes de eliminación de la Ley de Derechos de Autor del Milenio Digital |
ecp | editar | Para artículos en áreas temáticas autorizadas por ArbCom o que cumpla con los criterios para uso comunitario |
pagina principal | editar | Para páginas protegidas para mostrarse en la página principal |
oficina | editar | Para páginas protegidas por la Fundación Wikimedia |
Reiniciar | editar | Para páginas protegidas por la Fundación Wikimedia y "restablecer" a una versión básica |
calcetín | editar | Para páginas protegidas por títeres de calcetines |
plantilla | editar | Para plantillas de alto riesgo y módulos Lua |
usertalk | editar | Para páginas protegidas contra ediciones disruptivas por parte de un usuario en particular |
vandalismo | editar | Para páginas protegidas contra vandalismo |
disputa | moverse | Para páginas protegidas contra movimientos de página debido a disputas sobre el título de la página |
vandalismo | moverse | Para páginas protegidas contra vandalismo por movimiento de páginas |
Errores
A continuación se muestra una lista de algunos de los errores comunes que puede producir este módulo y cómo solucionarlos.
Fecha de protección no válida
Error: fecha de protección no válida ("abc")
Este error se produce si proporciona un |date=
valor de parámetro que no es reconocido como una fecha válida por la función analizador #time. En caso de duda, puede utilizar una fecha con el formato "dd Mes AAAA", por ejemplo, "20 de mayo de 2021". Para ver una gama completa de entradas válidas, consulte la documentación #time (solo se puede especificar el primer parámetro, la cadena de formato ).
Acción no válida
Error: acción no válida ("abc")
Este error se produce si especifica una acción de protección no válida. Solo hay tres acciones válidas: edit
(la predeterminada, para protección normal), move
(para protección de movimiento) y autoreview
(para cambios pendientes ). Esto solo debería ser posible si está utilizando una plantilla que admita la especificación manual de la acción de protección, como {{ pp }}, o si está utilizando #invoke directamente. Si este no es el caso, deje un mensaje en la charla del módulo: banner de protección .
Las razones no pueden contener el carácter de tubería
Error: los motivos no pueden contener el carácter de barra vertical ("|")
Este error se produce si especifica un motivo utilizando el |1=
parámetro que incluye un carácter de barra vertical ("|"). Compruebe que no está ingresando el {{ ! }} plantilla en este parámetro por error. El carácter de tubería no está permitido ya que el módulo lo usa internamente. Se puede ver una lista de razones válidas en la sección de razones .
Otros errores
Si ve un error diferente a los anteriores, es probable que sea un error en el módulo o un error en la configuración. Publique un mensaje al respecto en la charla del módulo: banner de protección .
Detalles técnicos
Este módulo utiliza datos de configuración del Módulo: banner de protección / config . La mayor parte del comportamiento del módulo se puede configurar allí, lo que lo hace fácilmente portátil a través de diferentes wikis y diferentes idiomas.
Los casos de prueba generales para el módulo se pueden encontrar en Module: Protection banner / testcases , y los casos de prueba específicos para la configuración de enwiki se pueden encontrar en Module: Protection banner / config / testcases .
Los informes de errores y las solicitudes de funciones deben realizarse en la página de discusión del módulo .
- Este módulo implementa {{pp-meta}} y sus plantillas secundarias, como- {{pp-disputa}}, {{pp-vandalism}} y {{pp-sock}}.- Inicializar los módulos necesarios.require ( 'Módulo: No globales' )local makeFileLink = require ( 'Módulo: Enlace de archivo' ). _principallocales effectiveProtectionLevel = requieren ( 'Módulo: nivel de protección efectiva' ). _principallocales effectiveProtectionExpiry = requieren ( 'Módulo: La protección efectiva de caducidad' ). _principallocal yesno = require ( 'Módulo: Yesno' )- Inicializar lentamente módulos y objetos que no siempre necesitamos. getArgs locales , makeMessageBox , lang- Establecer constantes.local CONFIG_MODULE = 'Módulo: Protección banner / config'-------------------------------------------------- ------------------------------- Funciones de ayuda-------------------------------------------------- ------------------------------ función local makeCategoryLink ( cat , sort )si gato entoncesreturn string.format ('[[% s:% s |% s]]' ,mw . sitio . espacios de nombres [ 14 ]. nombre ,gato ,clasificar)finalfinal- Función de validación de la caducidad y la fecha de protección. función local validateDate ( dateString , dateType )si no lang entonceslang = mw . idioma . getContentLanguage ()final éxito local , resultado = pcall ( lang . formatDate , lang , 'U' , dateString )si el éxito entoncesresultado = tonumber ( resultado )si el resultado entoncesdevolver resultadofinalfinalerror ( string.format ('% s inválido:% s' ,dateType ,tostring ( dateString )), 4 )final función local makeFullUrl ( página , consulta , visualización )return string.format ('[% s% s]' ,tostring ( mw . uri . fullUrl ( página , consulta )),monitor)final- Dado un gráfico dirigido formateado como nodo -> tabla de sucesores directos,- obtener una tabla de todos los nodos accesibles desde un nodo dado (aunque siempre- incluido el nodo dado). función local getReachableNodes ( gráfico , inicio )local toWalk , retval = {[ inicio ] = verdadero }, {}mientras que la verdadera Do- No se pueden usar pares () ya que estamos agregando y quitando cosas mientras iteramoslocal k = next ( toWalk ) - Esto siempre obtiene la clave "primera"si k == nil entoncesretorno retvalfinaltoWalk [ k ] = ceroretval [ k ] = verdaderopara _ , v en pares ( gráfico [ k ]) hacersi no es retval [ v ] entoncestoWalk [ v ] = verdaderofinalfinalfinalfinal-------------------------------------------------- -------------------------------- Clase de protección-------------------------------------------------- ------------------------------ Protección local = {}Proteccion . __index = ProtecciónProteccion . supportedActions = {editar = verdadero ,mover = verdadero ,autoreview = verdadero ,upload = true}Proteccion . bannerConfigFields = {'texto' ,'explicación' ,'información sobre herramientas' ,'alt' ,'enlace' ,'imagen'} Protección de funciones . nuevo ( argumentos , cfg , título ) obj local = {}obj . _cfg = cfgobj . título = título o mw . titulo . getCurrentTitle ()- Establecer acciónsi no argumenta . acción entoncesobj . acción = 'editar'elseif Protección . supportedActions [ args . acción ] entoncesobj . acción = argumentos . accióndemáserror ( string.format ('acción no válida:% s' ,toString ( args . acción )), 3 )final- Establecer nivelobj . nivel = argumentos . demolevel o effectiveProtectionLevel ( obj . acción , obj . título )si no obj . level o ( obj . action == 'move' y obj . level == 'autoconfirmed' ) luego- Los usuarios deben ser autoconfirmados para mover páginas de todos modos, así que trate- páginas protegidas semi-movidas como desprotegidas.obj . nivel = '*'final- Establecer vencimientolocales effectiveExpiry = effectiveProtectionExpiry ( obj . acción , obj . título )si EffectExpiry == 'infinito' entoncesobj . expiración = 'indef'elseif effectiveExpiry ~ = 'desconocido' a continuación,obj . expiry = validateDate ( EffectExpiry , 'fecha de expiración' )final- Establecer motivosi args [ 1 ] entoncesobj . razón = mw . ustring . inferior ( argumentos [ 1 ])si obj . motivo : buscar ( '|' ) luegoerror ( 'las razones no pueden contener el carácter de barra vertical ("|")' , 3 )finalfinal- Establecer fecha de protecciónsi args . fecha entoncesobj . protectionDate = validateDate ( args . fecha , 'fecha de protección' )final- Establecer configuración de bannerhacerobj . bannerConfig = {} configTables locales = {}si cfg . pancartas [ obj . acción ] entoncesconfigTables [ # configTables + 1 ] = cfg . pancartas [ obj . acción ] [ obj . razón ]finalsi cfg . defaultBanners [ obj . acción ] entoncesconfigTables [ # configTables + 1 ] = cfg . defaultBanners [ obj . acción ] [ obj . nivel ]configTables [ # configTables + 1 ] = cfg . defaultBanners [ obj . acción ]. defectofinalconfigTables [ # configTables + 1 ] = cfg . masterBannerpara i , campo en ipairs ( Protection . bannerConfigFields ) hacerpara j , t en ipairs ( configTables ) hacersi t [ campo ] entoncesobj . bannerConfig [ campo ] = t [ campo ]roturafinalfinalfinalfinalreturn setmetatable ( obj , protección )finalfunción Protección : isUserScript ()- Si la página es una página de JavaScript o CSS de usuario. título local = self . títulodevolver el título . espacio de nombres == 2 y (titulo . contentModel == 'javascript' o título . contentModel == 'css')finalfunción Protección : isProtected ()volver a sí mismo . nivel ~ = '*'final Protección de la función : shouldShowLock ()- Si deberíamos imprimir un banner / candadoreturn self : isProtected () y no self : isUserScript ()final- Si esta página necesita una categoría de protección.Proteccion . shouldHaveProtectionCategory = Protección . shouldShowLockfunción Protección : isTemporary ()retorno de tipo ( uno mismo . caducidad ) == 'número'finalfunción Protección : makeProtectionCategory ()si no es self : shouldHaveProtectionCategory () entoncesvolver ''final cfg local = self . _cfg título local = self . título- Obtén el fragmento de la clave de caducidad. expiryFragment localsi yo . expiración == 'indef' entoncesexpiryFragment = self . expiraciónelseif tipo ( auto . caducidad ) == 'número' entoncesexpiryFragment = 'temp'final- Obtenga el fragmento de clave del espacio de nombres.local namespaceFragment = cfg . categoryNamespaceKeys [ título . espacio de nombres ]si no, namespaceFragment y title . espacio de nombres % 2 == 1 luegonamespaceFragment = 'hablar'final- Defina el orden en el que se prueban los fragmentos de clave. Esto se hace con un- matriz de tablas que contienen el valor a probar, junto con su- posición en la tabla cfg.protectionCategories. orden local = {{ val = expiryFragment , keypos = 1 },{ val = namespaceFragment , keypos = 2 },{ val = self . motivo , keypos = 3 },{ val = self . level , keypos = 4 },{ val = self . acción , keypos = 5 }}- [[ - Las plantillas de protección antiguas utilizaban un sistema de categorías de protección ad-hoc, - con algunas plantillas que priorizan los espacios de nombres en sus categorías, y- otros priorizando el motivo de protección. Para emular esto en este módulo - usamos la tabla de configuración cfg.reasonsWithNamespacePriority para establecer el - razones por las cuales los espacios de nombres tienen prioridad sobre la razón de protección. - Si estamos tratando con una de esas razones, mueva la tabla de espacio de nombres a- el final de la tabla de pedidos, es decir, darle la máxima prioridad. Si no, el - la razón debe tener la máxima prioridad, así que muévala al final de la tabla -- en lugar de. -]]table.insert ( orden , table.remove ( orden , auto . razón y cfg . razones conNamespacePriority [ auto . razón ] y 2 o 3 )) - [[- Definir el orden de los intentos. Subtablas inactivas (subtablas con "valor" nulo - campos) se mueven al final, donde luego se les dará la clave-- "todas". Esto es para reducir el número de búsquedas de tablas en - cfg.protectionCategories, que crece exponencialmente con el número de- claves no nulas. Realizamos un seguimiento del número de subtablas activas con el - parámetro noActive. -]]local noActive , intentOrderhacerlocal activo , inactivo = {}, {}para i , t en ipairs ( orden ) hacersi t . val entoncesactivo [ # activo + 1 ] = tdemásinactivo [ # inactivo + 1 ] = tfinalfinalnoActive = # activointentOrder = activopara yo , t en ipairs ( inactivo ) hacerintentOrder [ # intentOrder + 1 ] = tfinalfinal - [[- Comprobar combinaciones de teclas cada vez más genéricas hasta encontrar una coincidencia. Si un - Existe una categoría específica para la combinación de fragmentos clave que estamos- dado, esa coincidencia se encontrará primero. Si no, seguimos intentando diferente - combinaciones de fragmentos clave hasta que hagamos coincidir usando la clave - "todos-todos-todos-todos-todos". - - Para generar las claves, indexamos las subtablas de claves usando una matriz binaria- con índices i y j. j sólo se calcula hasta el número de activos- subtablas. Por ejemplo, si hubiera tres subtablas activas, la matriz - se vería así, con 0 correspondiente al fragmento de clave "todos", y - 1 correspondiente a otros fragmentos de clave. - - j 1 2 3 -- I - 1 1 1 1 - 2 0 1 1 - 3 1 0 1 - 4 0 0 1 - 5 1 1 0 - 6 0 1 0 - 7 1 0 0 - 8 0 0 0 - - Se establecen valores de j superiores al número de subtablas activas - a la cadena "todos". - - Se construye una clave para cfg.protectionCategories para cada valor de i. - La posición del valor en la clave está determinada por el campo keypos en - cada subtabla. -]] gatos locales = cfg . proteccionCategoriaspara i = 1 , 2 ^ no Activo hacer clave local = {}para j , t en ipairs ( intentOrder ) hacersi j > noActive entoncesclave [ t . keypos ] = 'todos'demás cociente local = i / 2 ^ ( j - 1 )cociente = matemáticas.ceil ( cociente )si el cociente % 2 == 1 entoncesclave [ t . posición clave ] = t . valdemásclave [ t . keypos ] = 'todos'finalfinalfinalclave = tabla.concat ( clave , '|' ) intento local = gatos [ clave ]si intento entoncesreturn makeCategoryLink ( intento , título . texto )finalfinalvolver ''final Protección de la función : isIncorrect () vencimiento local = self . expiraciónreturn not self : shouldHaveProtectionCategory ()o escriba ( vencimiento ) == 'número' y vencimiento < os.time ()finalfunción Protección : isTemplateProtectedNonTemplate () acción local , espacio de nombres = self . acción , yo . titulo . espacio de nombresvolver a sí mismo . level == ' editor de plantillas'y (( acción ~ = 'editar' y acción ~ = 'mover' )o ( espacio de nombres ~ = 10 y espacio de nombres ~ = 828 ))final Protección de función : makeCategoryLinks () mensaje local = self . _cfg . msg ret local = { self : makeProtectionCategory ()}if self : isIncorrect () entoncesret [ # ret + 1 ] = makeCategoryLink (msg [ 'seguimiento-categoría-incorrecto' ],yo . titulo . texto)finalif self : isTemplateProtectedNonTemplate () entoncesret [ # ret + 1 ] = makeCategoryLink (msg [ 'tracking-category-template' ],yo . titulo . texto)finalreturn table.concat ( ret )final-------------------------------------------------- ------------------------------- Clase de propaganda-------------------------------------------------- ------------------------------ Blurb local = {}Blurb . __index = BlurbBlurb . bannerTextFields = {texto = verdadero ,explicación = verdadero ,información sobre herramientas = verdadero ,alt = verdadero ,enlace = verdadero}función Blurb . nuevo ( protectionObj , args , cfg )return setmetatable ({_cfg = cfg ,_protectionObj = protectionObj ,_args = args}, Blurb )final- Métodos privados -función Blurb : _formatDate ( num )- Formatea una marca de tiempo de Unix en formato dd Month, YYYY.lang = lang o mw . idioma . getContentLanguage () éxito local , fecha = pcall (lang . formatDate ,lang ,yo . _cfg . msg [ 'formato de fecha de caducidad' ] o 'j F Y' ,'@' .. tostring ( num ))si el éxito entonces fecha de regresofinalfinalfunción Blurb : _getExpandedMessage ( msgKey )return self : _substituteParameters ( self . _cfg . msg [ msgKey ])finalfunción Blurb : _substituteParameters ( msg )si no uno mismo . _params entonceslocal parameterFuncs = {}parameterFuncs . CURRENTVERSION = self . _makeCurrentVersionParameterparameterFuncs . EDITREQUEST = self . _makeEditRequestParameterparameterFuncs . CADUCIDAD = self . _makeExpiryParameterparameterFuncs . EXPLICACIÓN BLURB = self . _makeExplanationBlurbParameterparameterFuncs . IMAGELINK = yo . _makeImageLinkParameterparameterFuncs . INTROBLURB = yo . _makeIntroBlurbParameterparameterFuncs . INTROFRAGMENTO = yo . _makeIntroFragmentParameterparameterFuncs . PAGETYPE = self . _makePagetypeParameterparameterFuncs . PROTECTIONBLURB = self . _makeProtectionBlurbParameterparameterFuncs . PROTECTIONDATE = self . _makeProtectionDateParameterparameterFuncs . NIVEL DE PROTECCIÓN = self . _makeProtectionLevelParameterparameterFuncs . PROTECTIONLOG = self . _makeProtectionLogParameterparameterFuncs . TALKPAGE = self . _makeTalkPageParameterparameterFuncs . TOOLTIPBLURB = self . _makeTooltipBlurbParameterparameterFuncs . TOOLTIPFRAGMENT = self . _makeTooltipFragmentParameterparameterFuncs . VANDAL = yo . _makeVandalTemplateParameteryo . _params = setmetatable ({}, {__index = función ( t , k ) parámetro localsi parameterFuncs [ k ] entoncesparam = parameterFuncs [ k ] ( self )finalparam = param o ''t [ k ] = paramvolver paramfinal})finalmsg = msg : gsub ( '$ {(% u +)}' , self . _params )devolver msgfinalfunción Blurb : _makeCurrentVersionParameter ()- Un enlace al historial de la página o al registro de movimientos, según el tipo de-- proteccion.locales pagename = auto . _protectionObj . titulo . prefixedTextsi yo . _protectionObj . acción == 'mover' entonces- Necesitamos el enlace del registro de movimientos.return makeFullUrl ('Especial: Registro' ,{ Tipo = 'mover' , página = nombre de la página },self : _getExpandedMessage ( 'versión-actual-mover-pantalla' ))demás- Necesitamos el enlace de la historia.return makeFullUrl (nombre de página ,{ acción = 'historial' },self : _getExpandedMessage ( 'visualización-edición-versión-actual' ))finalfinalfunción Blurb : _makeEditRequestParameter ()local mEditRequest = require ( 'Módulo: Enviar una solicitud de edición' ) acción local = uno mismo . _protectionObj . acción nivel local = uno mismo . _protectionObj . nivel- Obtenga el tipo de solicitud de edición. requestType localsi action == 'editar' entoncessi el nivel == 'autoconfirmado' entoncesrequestType = 'semi'elseif level == 'extendedconfirmed' thenrequestType = 'extendido'elseif level == 'templateeditor' entoncesrequestType = 'plantilla'finalfinalrequestType = requestType o 'completo'- Obtenga el valor de visualización. pantalla local = self : _getExpandedMessage ( 'editar-solicitar-mostrar' )return mEditRequest . _link { type = requestType , display = display }finalfunción Blurb : _makeExpiryParameter () vencimiento local = self . _protectionObj . expiraciónsi tipo ( vencimiento ) == 'número' entoncesreturn self : _formatDate ( vencimiento )demás vencimiento de devoluciónfinalfinalfunción Blurb : _makeExplanationBlurbParameter ()- Cubra primero los casos especiales.si yo . _protectionObj . titulo . espacio de nombres == 8 entonces- Espacio de nombres de MediaWikireturn self : _getExpandedMessage ( 'explicación-propaganda-sustantivoproteger' )final- Obtener explicación de las claves de la tabla de propaganda acción local = uno mismo . _protectionObj . acción nivel local = uno mismo . _protectionObj . nivel talkKey local = self . _protectionObj . titulo . isTalkPage y 'hablar' o 'asunto'- Busque el mensaje en la tabla de propaganda explicativa y sustituya cualquier- parámetros. explicaciones locales = yo . _cfg . explicación Blurbs mensaje localsi las explicaciones [ acción ] [ nivel ] y las explicaciones [ acción ] [ nivel ] [ talkKey ] entoncesmsg = explicaciones [ acción ] [ nivel ] [ talkKey ]elseif explicaciones [ acción ] [ nivel ] y explicaciones [ acción ] [ nivel ]. por defecto entoncesmsg = explicaciones [ acción ] [ nivel ]. defectoelseif explicaciones [ acción ]. por defecto y explicaciones [ acción ]. predeterminado [ talkKey ] entoncesmsg = explicaciones [ acción ]. predeterminado [ talkKey ]elseif explicaciones [ acción ]. por defecto y explicaciones [ acción ]. por defecto . por defecto entoncesmsg = explicaciones [ acción ]. por defecto . defectodemáserror ( string.format ('no se pudo encontrar la descripción de la explicación para la acción "% s", el nivel "% s" y la tecla de conversación "% s"' ,acción ,nivel ,talkKey), 8 )finalreturn self : _substituteParameters ( msg )finalfunción Blurb : _makeImageLinkParameter () enlaces de imagen locales = self . _cfg . imageLinks acción local = uno mismo . _protectionObj . acción nivel local = uno mismo . _protectionObj . nivel mensaje localsi imageLinks [ action ] [ level ] entoncesmsg = imageLinks [ acción ] [ nivel ]elseif imageLinks [ acción ]. por defecto entoncesmsg = imageLinks [ acción ]. defectodemásmsg = imageLinks . editar . defectofinalreturn self : _substituteParameters ( msg )finalfunción Blurb : _makeIntroBlurbParameter ()si yo . _protectionObj : isTemporary () luegoreturn self : _getExpandedMessage ( 'intro-blurb-expiry' )demásreturn self : _getExpandedMessage ( 'intro-blurb-noexpiry' )finalfinalfunción Blurb : _makeIntroFragmentParameter ()si yo . _protectionObj : isTemporary () luegoreturn self : _getExpandedMessage ( 'intro-fragment-expiry' )demásreturn self : _getExpandedMessage ( 'intro-fragment-noexpiry' )finalfinalfunción Blurb : _makePagetypeParameter () tipos de página locales = self . _cfg . tipos de páginadevolver tipos de página [ self . _protectionObj . titulo . espacio de nombres ]o tipos de página . defectoo error ( 'ningún tipo de página predeterminado definido' , 8 )finalfunción Blurb : _makeProtectionBlurbParameter () protección local Blurbs = self . _cfg . protección acción local = uno mismo . _protectionObj . acción nivel local = uno mismo . _protectionObj . nivel mensaje localif protectionBlurbs [ action ] [ level ] entoncesmsg = protectionBlurbs [ acción ] [ nivel ]elseif protectionBlurbs [ acción ]. por defecto entoncesmsg = protectionBlurbs [ acción ]. defectoelseif protectionBlurbs . editar . por defecto entoncesmsg = protectionBlurbs . editar . defectodemáserror ( 'ninguna propaganda de protección definida para protectionBlurbs.edit.default' , 8 )finalreturn self : _substituteParameters ( msg )finalfunción Blurb : _makeProtectionDateParameter ()fecha de protección local = self . _protectionObj . ProtectionDatesi type ( protectionDate ) == 'número' entoncesreturn self : _formatDate ( protectionDate )demás protección de devolución Fechafinalfinalfunción Blurb : _makeProtectionLevelParameter ()niveles de protección local = self . _cfg . ProtectionLevels acción local = uno mismo . _protectionObj . acción nivel local = uno mismo . _protectionObj . nivel mensaje localsi protectionLevels [ acción ] [ nivel ] entoncesmsg = protectionLevels [ acción ] [ nivel ]elseif protectionLevels [ acción ]. por defecto entoncesmsg = protectionLevels [ acción ]. defectoelseif protectionLevels . editar . por defecto entoncesmsg = protectionLevels . editar . defectodemáserror ( 'ningún nivel de protección definido para protectionLevels.edit.default' , 8 )finalreturn self : _substituteParameters ( msg )finalfunción Blurb : _makeProtectionLogParameter ()locales pagename = auto . _protectionObj . titulo . prefixedTextsi yo . _protectionObj . action == 'autoreview' luego- Necesitamos el registro de cambios pendientes.return makeFullUrl ('Especial: Registro' ,{ Tipo = 'estable' , página = nombre de la página },self : _getExpandedMessage ( 'pantalla de registro de pc' ))demás- Necesitamos el registro de protección.return makeFullUrl ('Especial: Registro' ,{ type = 'protect' , page = pagename },self : _getExpandedMessage ( 'protección-pantalla-registro' ))finalfinalfunción Blurb : _makeTalkPageParameter ()return string.format ('[[% s:% s #% s |% s]]' ,mw . sitio . espacios de nombres [ self . _protectionObj . titulo . espacio de nombres ]. hablar . nombre ,yo . _protectionObj . titulo . texto ,yo . _args . sección o 'superior' ,self : _getExpandedMessage ( 'talk-page-link-display' ))finalfunción Blurb : _makeTooltipBlurbParameter ()si yo . _protectionObj : isTemporary () luegoreturn self : _getExpandedMessage ( 'tooltip-blurb-expiry' )demásreturn self : _getExpandedMessage ( 'tooltip-blurb-noexpiry' )finalfinalfunción Blurb : _makeTooltipFragmentParameter ()si yo . _protectionObj : isTemporary () luegoreturn self : _getExpandedMessage ( 'tooltip-fragment-expiry' )demásreturn self : _getExpandedMessage ( 'tooltip-fragment-noexpiry' )finalfinalfunción Blurb : _makeVandalTemplateParameter ()volver mw . getCurrentFrame (): expandTemplate {title = "vandal-m" ,args = { self . _args . usuario o auto . _protectionObj . titulo . baseText }}final- Métodos públicos -función Blurb : makeBannerText ( clave )- Validar entrada.si no es clave o no, Blurb . bannerTextFields [ clave ] luegoerror ( string.format ('"% s" no es un campo de configuración de banner válido' ,tostring ( clave )), 2 )final- Genera el texto. mensaje local = self . _protectionObj . bannerConfig [ clave ]si tipo ( msg ) == 'cadena' entoncesreturn self : _substituteParameters ( msg )elseif tipo ( msg ) == 'función' entoncesmsg = msg ( self . _protectionObj , self . _args )si escribe ( msg ) ~ = 'cadena' entonceserror ( string.format ('mal resultado de la función de configuración de banner con la tecla "% s"'.. '(cadena esperada, obtuvo% s)' ,tostring ( clave ),tipo ( msg )), 4 )finalreturn self : _substituteParameters ( msg )finalfinal-------------------------------------------------- ------------------------------- Clase BannerTemplate-------------------------------------------------- ------------------------------ BannerTemplate local = {}BannerTemplate . __index = BannerTemplatefunción BannerTemplate . nuevo ( protectionObj , cfg ) obj local = {}obj . _cfg = cfg- Establecer el nombre del archivo de imagen.nombre de archivo de imagen local = protectionObj . bannerConfig . imagensi imageFilename entoncesobj . _imageFilename = imageFilenamedemás- Si un nombre de archivo de imagen no se especifica explícitamente en la configuración del banner,- generarlo a partir del estado de protección y el espacio de nombres. acción local = protectionObj . acción nivel local = protectionObj . nivel espacio de nombres local = protectionObj . titulo . espacio de nombres motivo local = protectionObj . razón- Trate primero los casos especiales.si (espacio de nombres == 10o espacio de nombres == 828o razón y obj . _cfg . indefImageReasons [ motivo ])y acción == 'editar'y nivel == 'sysop'y no protectionObj : isTemporary ()luego- Los módulos y plantillas totalmente protegidos obtienen el "indef" rojo especial- candado.obj . _imageFilename = obj . _cfg . msg [ 'imagen-nombre-archivo-indef' ]demás- Tratar con tipos de protección habituales. imágenes locales = obj . _cfg . imagenessi las imágenes [ acción ] entoncessi las imágenes [ acción ] [ nivel ] entoncesobj . _imageFilename = imágenes [ acción ] [ nivel ]elseif imágenes [ acción ]. por defecto entoncesobj . _imageFilename = imágenes [ acción ]. defectofinalfinalfinalfinalreturn setmetatable ( obj , BannerTemplate )finalfunción BannerTemplate : renderImage () nombre de archivo local = self . _imageFilenameo yo mismo . _cfg . msg [ 'image-filename-default' ]o 'Transparente.gif'return makeFileLink {file = nombre de archivo ,size = ( self . imageWidth o 20 ) .. 'px' ,alt = self . _imageAlt ,enlace = self . _imageLink ,subtítulo = self . captura de imagen}final-------------------------------------------------- ------------------------------- Clase de banner-------------------------------------------------- ------------------------------ Banner local = setmetatable ({}, BannerTemplate )Banner . __index = Bannerfunción Banner . nuevo ( protectionObj , blurbObj , cfg ) obj local = BannerTemplate . new ( protectionObj , cfg ) : esto no necesita la propaganda.obj . imageWidth = 40obj . imageCaption = blurbObj : makeBannerText ( 'alt' ) - Los banners grandes usan el texto alternativo para la información sobre herramientas.obj . _reasonText = blurbObj : makeBannerText ( 'texto' )obj . _explanationText = blurbObj : makeBannerText ( 'explicación' )obj . _page = protectionObj . titulo . prefixedText : solo hace una diferencia en las pruebas.return setmetatable ( obj , Banner )final Banner de función : __tostring ()- Renderiza el banner.makeMessageBox = makeMessageBox o require ( 'Módulo: Cuadro de mensaje' ). principal razonTexto local = self . _reasonText o error ( 'sin conjunto de texto de motivo' , 2 )locales explanationText = auto . _Texto de explicación mbargs locales = {page = self . _page ,type = 'protección' ,imagen = self : renderImage (),texto = cadena.formato ("'' '% s' ''% s" ,razonText ,ExplicaciónTexto y '
' .. ExplicaciónTexto o '')}return makeMessageBox ( 'mbox' , mbargs )final-------------------------------------------------- ------------------------------- Clase de candado-------------------------------------------------- ------------------------------ candado local = setmetatable ({}, BannerTemplate )Candado . __index = Candadofunción Candado . nuevo ( protectionObj , blurbObj , cfg ) obj local = BannerTemplate . new ( protectionObj , cfg ) : esto no necesita la propaganda.obj . imageWidth = 20obj . imageCaption = blurbObj : makeBannerText ( 'descripción emergente ' )obj . _imageAlt = blurbObj : makeBannerText ( 'alt' )obj . _imageLink = blurbObj : makeBannerText ( 'enlace' )obj . _indicatorName = cfg . padlockIndicatorNames [ protectionObj . acción ]o cfg . padlockIndicatorNames . defectoo 'pp-default'return setmetatable ( obj , candado )finalfunción Candado : __tostring () marco local = mw . getCurrentFrame ()- La etiqueta nowiki ayuda a evitar espacios en blanco en la parte superior de los artículos.return frame : extensionTag { nombre = 'nowiki' } .. frame : extensionTag {nombre = 'indicador' ,args = { nombre = self . _indicatorName },contenido = self : renderImage ()}final-------------------------------------------------- ------------------------------- Exportaciones-------------------------------------------------- ------------------------------local p = {}función p . _exportClasses ()- Esto se utiliza con fines de prueba.return {Protección = Protección ,Blurb = Blurb ,BannerTemplate = BannerTemplate ,Banner = Banner ,Candado = Candado ,}finalfunción p . _main ( args , cfg , título )args = args o {}cfg = cfg o requiera ( CONFIG_MODULE )locales protectionObj = Protección . nuevo ( argumentos , cfg , título )local ret = {}- Si la protección contra edición de una página es igual o más restrictiva que su- protección de alguna otra acción, entonces no te molestes en mostrar nada- para la otra acción (excepto categorías).si protectionObj . acción == 'editar' oargumentos . demolevel ono getReachableNodes (cfg . jerarquía ,protectionObj . nivel) [ EffectiveProtectionLevel ( 'editar' , protectionObj . título )]luego- Inicializar el objeto de propagandalocal blurbObj = Blurb . nuevo ( protectionObj , args , cfg )- Renderizar el bannerif protectionObj : shouldShowLock () entoncesret [ # ret + 1 ] = tostring (( Yesno ( args . Pequeño ) y el candado o Banner ). nuevo ( protectionObj , blurbObj , cfg ))finalfinal- Renderizar las categoríasSi Yesno ( args . categoría ) ~ = falso entoncesret [ # ret + 1 ] = protectionObj : makeCategoryLinks ()finalreturn table.concat ( ret )finalfunción p . principal ( marco , cfg )cfg = cfg o requiera ( CONFIG_MODULE )- Encuentra argumentos predeterminados, si los hay. padre local = marco . getParent y frame : getParent ()local defaultArgs = parent y cfg . envoltorios [ parent : getTitle (): gsub ( '/ sandbox $' , '' )]- Busque argumentos de usuario y use el marco principal si nos llaman desde un- plantilla de envoltura.getArgs = getArgs o require ( 'Módulo: Argumentos' ). getArgs userArgs local = getArgs ( marco , {parentOnly = defaultArgs ,frameOnly = no defaultArgs})- Construye la tabla de argumentos. Los argumentos especificados por el usuario sobrescriben los argumentos predeterminados. argumentos locales = {}para k , v en pares ( defaultArgs o {}) hacerargumentos [ k ] = vfinalpara k , v en pares ( userArgs ) hacerargumentos [ k ] = vfinalvolver p . _main ( args , cfg )finalvolver p