Этот модуль создает баннеры защиты и значки замков, которые размещаются вверху защищенных страниц .
Применение
Большинству пользователей не нужно использовать этот модуль напрямую. Для добавления шаблонов защиты на страницы вы можете использовать шаблон {{ pp }}, или вам может быть удобнее использовать один из более конкретных шаблонов защиты, представленных в таблице ниже.
Из викитекста
{{#invoke: Защитный баннер | главная| 1 = причина | маленький = да / нет | действие = действие | дата = дата защиты | пользователь = имя пользователя | section = название раздела на странице обсуждения | категория = нет}}
Синтаксис #invoke можно использовать для создания более конкретных шаблонов защиты, чем {{ pp }}. Например, с помощью кода можно создать шаблон защиты, который всегда показывает значок замка {{#invoke:Protection banner|main|small=yes}}
. Страницы, вызывающие этот шаблон, по-прежнему смогут использовать другие аргументы, например действие . Однако это работает только на один уровень; страница, вызывающая шаблон, который вызывает другой шаблон, содержащий приведенный выше код, не сможет автоматически использовать такие параметры, как действие .
Примечание: вам больше не следует указывать срок действия, так как он автоматически извлекается во всех случаях.
Из Lua
Сначала загрузите модуль.
local mProtectionBanner = require ( 'Модуль: баннер защиты' )
Затем вы можете создавать баннеры защиты с помощью функции _main.
mProtectionBanner . _main ( аргументы , cfg , titleObj )
args - это таблица аргументов для передачи модулю. Возможные ключи и значения для этой таблицы см. В разделе параметров . В CFG и titleObj переменные предназначены только для тестирования; cfg указывает настраиваемую таблицу конфигурации для использования вместо Module: Protection banner / config , а titleObj указывает объект mw.title для использования вместо текущего заголовка. args , cfg и titleObj необязательны.
Параметры
Все параметры необязательны.
- 1 - причина, по которой страница была защищена. Если установлено, это должно быть одно из значений, перечисленных в таблице причин .
- small - если установлено «да», «y», «1» или «true», вместо баннера полной защиты создается значок замка.
- действие - действие защиты. Должен быть одним из «редактировать» (для нормальной защиты), «перемещать» (для защиты от перемещения) или «автоматически просматривать» (для ожидающих изменений). Значение по умолчанию - «редактировать».
- date - дата защиты. Это должен быть допустимый ввод для второго параметра функции синтаксического анализатора #time . Этот аргумент действует по причинам, использующим параметр PROTECTIONDATE в своей конфигурации. По состоянию на июль 2014 года это были «служебные» и «перезагрузочные» причины.
- user - имя пользователя, для которого создаются ссылки. По состоянию на июль 2014 г. это действует только в том случае, если указана причина «пользовательский разговор».
- section - название раздела страницы обсуждения защищенной страницы, где происходит обсуждение. Это работает для большинства, но не для всех, ценностей разума .
- category - категории подавляются, если установлено значение «no», «n», «0» или «false».
Причины
В следующей таблице перечислены доступные причины, а также действия, для которых они доступны.
Причина | Действие | Описание |
---|---|---|
блп | редактировать | Для страниц, защищенных в целях соблюдения политики в отношении биографий живых людей |
спор | редактировать | Для страниц, защищенных из-за споров о редактировании |
dmca | редактировать | Для страниц, защищенных Фондом Викимедиа в связи с запросами на удаление в соответствии с Законом о защите авторских прав в цифровую эпоху. |
ecp | редактировать | Для статей в тематических областях, утвержденных ArbCom или отвечающих критериям для использования сообществом |
Главная страница | редактировать | Для страниц, защищенных для отображения на главной странице |
офис | редактировать | Для страниц, защищенных Фондом Викимедиа |
сброс настроек | редактировать | Для страниц, защищенных Фондом Викимедиа и "сброшенных" до базовой версии. |
носок | редактировать | Для страниц, защищенных кукольным носком |
шаблон | редактировать | Для шаблонов высокого риска и модулей Lua |
пользовательский разговор | редактировать | Для страниц, защищенных от несанкционированного редактирования конкретным пользователем |
вандализм | редактировать | Для страниц, защищенных от вандализма |
спор | двигаться | Для страниц, защищенных от перемещения страниц из-за споров по поводу заголовка страницы |
вандализм | двигаться | Для страниц, защищенных от вандализма, связанного с перемещением страниц |
Ошибки
Ниже приведен список некоторых распространенных ошибок, которые может вызывать этот модуль, и способы их исправления.
Недействительная дата защиты
Ошибка: недействительная дата защиты ("abc")
Эта ошибка возникает, если вы |date=
указываете значение параметра, которое не распознается функцией синтаксического анализа #time как допустимая дата. В случае сомнений можно просто указать дату в формате «дд Месяц ГГГГ», например «1 июня 2021 года». Чтобы увидеть полный диапазон допустимых входных данных, см. Документацию #time (можно указать только первый параметр, строку формата ).
Недействительное действие
Ошибка: недопустимое действие ("abc")
Эта ошибка возникает, если вы указали недопустимое действие защиты. Есть только три допустимых действия: edit
(по умолчанию, для нормальной защиты), move
(для защиты от перемещения) и autoreview
(для ожидающих изменений ). Это должно быть возможно только в том случае, если вы используете шаблон, который поддерживает указание действия защиты вручную, например {{ pp }}, или если вы используете #invoke напрямую. Если это не так, оставьте сообщение в Обсуждение модуля: баннер защиты .
Причины не могут содержать символ вертикальной черты
Ошибка: причина не может содержать вертикальную черту ("|")
Эта ошибка возникает, если вы указываете причину с помощью |1=
параметра, который включает вертикальную черту ("|"). Убедитесь, что вы не вводите {{ ! }} шаблон в этот параметр по ошибке. Символ вертикальной черты не разрешен, поскольку модуль использует его для внутренних целей. Список уважительных причин можно увидеть в разделе причин .
Прочие ошибки
Если вы видите ошибку, отличную от приведенных выше, скорее всего, это ошибка в модуле или в конфигурации. Пожалуйста, опубликуйте сообщение об этом на Module talk: Protection banner .
Технические подробности
Этот модуль использует данные конфигурации из Module: Protection banner / config . Здесь можно настроить большую часть поведения модуля, что позволяет легко переносить его на разные вики и разные языки.
Общие тестовые примеры для модуля можно найти в Module: Protection banner / testcases , а тестовые примеры, специфичные для конфигурации enwiki, можно найти в Module: Protection banner / config / testcases .
Отчеты об ошибках и запросы функций должны быть сделаны на странице обсуждения модуля .
- Этот модуль реализует {{pp-meta}} и его дочерние шаблоны, такие как- {{pp-диалог}}, {{pp-vandalism}} и {{pp-sock}}.- Инициализировать необходимые модули.require ( 'Модуль: без глобальных переменных' )local makeFileLink = require ( 'Модуль: ссылка на файл' ). _основнойlocal effectiveProtectionLevel = require ( 'Модуль: эффективный уровень защиты' ). _основнойlocal effectiveProtectionExpiry = require ( 'Модуль: срок действия эффективной защиты' ). _основнойlocal yesno = require ( 'Модуль: Да нет' )- Ленивая инициализация модулей и объектов, которые нам не всегда нужны.местные getArgs , makeMessageBox , lang- Установить константы.local CONFIG_MODULE = 'Module: Protection banner / config / sandbox' - ПЕРЕКЛЮЧИТЕ ЭТО НАЗАД НА ГЛАВНУЮ СТРАНИЦУ КОНФИГУРАЦИИ ПЕРЕД НАЧАЛОМ РЕЖИМА!-------------------------------------------------- ------------------------------- Вспомогательные функции-------------------------------------------------- ------------------------------локальная функция makeCategoryLink ( cat , sort )если кот, товернуть string.format ('[[% s:% s |% s]]' ,мв . сайт . пространства имен [ 14 ]. имя ,кошка ,Сортировать)конецконец- Функция проверки истечения срока действия и даты защитылокальная функция validateDate ( dateString , dateType )если не языки , тоlang = mw . язык . getContentLanguage ()конецлокальный успех , результат = pcall ( lang . formatDate , lang , 'U' , dateString )если успех, тоРезультат = ToNumber ( результат )если результат товернуть результатконецконецошибка ( string.format ('недопустимый% s:% s' ,dateType ,tostring ( dateString )), 4 )конецлокальная функция makeFullUrl ( страница , запрос , отображение )вернуть string.format ('[% s% s]' ,tostring ( mw . uri . fullUrl ( страница , запрос )),отображать)конец- Учитывая ориентированный граф, отформатированный как узел -> таблица прямых преемников,- получить таблицу всех узлов, доступных из данного узла (хотя всегда- включая данный узел).локальная функция getReachableNodes ( график , начало )локальный toWalk , retval = {[ начало ] = истина }, {}в то время как истинные дела- Нельзя использовать пары (), так как мы добавляем и удаляем элементы по мере выполнения итерацииlocal k = next ( toWalk ) - всегда получает "первый" ключесли k == nil, товернуть retvalконецtoWalk [ k ] = нольretval [ k ] = истинадля _ , v в ipairs ( граф [ k ]) делаемесли не retval [ v ], тоtoWalk [ v ] = правдаконецконецконецконец-------------------------------------------------- -------------------------------- Класс защиты-------------------------------------------------- ------------------------------местная защита = {}Защита . __index = ЗащитаЗащита . supportActions = {edit = true ,move = true ,autoreview = true ,upload = true}Защита . bannerConfigFields = {'текст' ,'объяснение' ,'всплывающая подсказка' ,'alt' ,'ссылка' ,'изображение'}Функция защиты . новый ( аргументы , cfg , заголовок )local obj = {}OBJ . _cfg = cfgOBJ . title = title или mw . название . getCurrentTitle ()- Установить действиеесли не аргументы . действие тогдаOBJ . действие = 'редактировать'elseif Защита . supportedActions [ аргументы . действие ] тогдаOBJ . действие = аргументы . действиеещеошибка ( string.format ('недопустимое действие:% s' ,tostring ( аргумент . действие )), 3 )конец- Установить уровеньOBJ . level = args . demolevel или effectiveProtectionLevel ( объект . действие , объект . заголовок )если не obj . level или ( obj . action == 'move' и obj . level == 'autoconfirmed' ), затем- Пользователи в любом случае должны получать автоподтверждение для перемещения страниц, так что относитесь- частично защищенные страницы как незащищенные.OBJ . level = '*'конец- Установить срок действиялокальная effectiveExpiry = effectiveProtectionExpiry ( OBJ . Действие , OBJ . название )если EffectiveExpiry == 'бесконечность', тоOBJ . expiry = 'indef'elseif effectiveExpiry ~ = 'unknown' тогдаOBJ . expiry = validateDate ( effectiveExpiry , 'срок годности' )конец- Установить причинуесли args [ 1 ], тоOBJ . причина = мв . ustring . ниже ( args [ 1 ])если OBJ . причина : найти ( '|' ) тогдаerror ( 'Причины не могут содержать вертикальную черту ("|")' , 3 )конецконец- Установить дату защитыесли args . свидание тогдаOBJ . ProtectionDate = validateDate ( аргумент . дата , "дата защиты" )конец- Установить конфиг баннераделатьOBJ . bannerConfig = {}local configTables = {}если cfg . баннеры [ obj . действие ] тогдаconfigTables [ # configTables + 1 ] = cfg . баннеры [ obj . действие ] [ объект . причина ]конецесли cfg . defaultBanners [ obj . действие ] тогдаconfigTables [ # configTables + 1 ] = cfg . defaultBanners [ obj . действие ] [ объект . уровень ]configTables [ # configTables + 1 ] = cfg . defaultBanners [ obj . действие ]. По умолчаниюконецconfigTables [ # configTables + 1 ] = cfg . masterBannerдля i , поле в ipairs ( Protection . bannerConfigFields ) сделайтедля j , t в ipairs ( configTables ) делаемесли t [ поле ], тоOBJ . bannerConfig [ поле ] = t [ поле ]перерывконецконецконецконецвернуть setmetatable ( obj , Protection )конец Защита функции : isUserScript ()- Является ли страница пользовательской страницей JavaScript или CSS.местный заголовок = self . заглавиевернуть заголовок . пространство имен == 2 и (название . contentModel == 'javascript' или заголовок . contentModel == 'css')конец Защита функции : isProtected ()вернуть себя . уровень ~ = '*'конец Защита функции : shouldShowLock ()- Должны ли мы выводить баннер / замоквернуть self : isProtected (), а не self : isUserScript ()конец- Нужна ли этой странице категория защиты.Защита . shouldHaveProtectionCategory = Защита . shouldShowLock Защита функции : isTemporary () тип возврата ( самовывоз . истечение срока ) == 'число'конецФункция защиты : makeProtectionCategory ()если не сам : shouldHaveProtectionCategory (), товернуться ''конецлокальный cfg = self . _cfgместный заголовок = self . заглавие- Получить фрагмент ключа с истечением срока действия.местный срок действияесли сам . expiry == 'indef', тогдаexpiryFragment = self . истечение срокаelseif type ( self . expiry ) == 'number', затемexpiryFragment = 'temp'конец- Получить фрагмент ключа пространства имен.локальное пространство именFragment = cfg . categoryNamespaceKeys [ название . пространство имен ]если не namespaceFragment и title . пространство имен % 2 == 1, тогдаnamespaceFragment = 'говорить'конец- Определите порядок, в котором проверяются ключевые фрагменты. Это делается с помощью- массив таблиц, содержащий проверяемое значение вместе с его- позиция в таблице cfg.protectionCategories.местный заказ = {{ val = expiryFragment , keypos = 1 },{ val = namespaceFragment , keypos = 2 },{ val = self . причина , keypos = 3 },{ val = self . level , keypos = 4 },{ val = self . действие , keypos = 5 }}- [[ - В старых шаблонах защиты использовалась специальная система категорий защиты, - с некоторыми шаблонами, отдавая приоритет пространствам имен в своих категориях, и- другие отдают приоритет причине защиты. Чтобы подражать этому в этом модуле - мы используем конфигурационную таблицу cfg.reasonsWithNamespacePriority для установки - причины, по которым пространства имен имеют приоритет над причиной защиты. - Если мы имеем дело с одной из этих причин, переместите таблицу пространства имен в- конец таблицы заказов, т.е. дать ему высший приоритет. Если нет, то - причина должна иметь наивысший приоритет, поэтому переместите ее в конец таблицы -- вместо. -]]table.insert ( порядок , table.remove ( порядок , самостоятельно . Причина и CFG . reasonsWithNamespacePriority [ самостоятельно . Причина ] и 2 или 3 )) - [[- Определите порядок попыток. Неактивные подтаблицы (подтаблицы с нулевым «значением» - поля) перенесены в конец, где им в дальнейшем будет дан ключ-- "все". Это сделано для того, чтобы сократить количество обращений к таблицам в - cfg.protectionCategories, которая растет экспоненциально с увеличением количества- ненулевые ключи. Мы отслеживаем количество активных подтаблиц с помощью - параметр noActive. -]]локальный noActive , tryOrderделатьлокальный активный , неактивный = {}, {}для i , t в ipairs ( порядок ) делатьесли т . вал тогдаактивный [ # активный + 1 ] = tещенеактивный [ # неактивный + 1 ] = tконецконецnoActive = # активныхtryOrder = активныйдля i , t в ipairs ( неактивно ) делатьtryOrder [ # tryOrder + 1 ] = tконецконец - [[- Проверяйте все более распространенные комбинации клавиш, пока не найдем совпадение. Если - существует определенная категория для комбинации ключевых фрагментов, которые мы- при условии, что этот матч будет найден первым. Если нет, мы продолжаем пробовать разные - комбинации ключевых фрагментов, пока мы не сопоставим с использованием ключа - «все-все-все-все-все». - - Для генерации ключей мы индексируем ключевые подтаблицы, используя двоичную матрицу.- с индексами i и j. j рассчитывается только до количества активных- подтаблицы. Например, если было три активных подтаблицы, матрица - будет выглядеть так, где 0 соответствует ключевому фрагменту "все", а - 1 соответствует остальным ключевым фрагментам. - - к 1 2 3 - я - 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 - - Устанавливаются значения j, превышающие количество активных подтаблиц - к строке «все». - - Ключ для cfg.protectionCategories создается для каждого значения i. - Положение значения в ключе определяется полем keypos в - каждая подтаблица. -]]местные кошки = cfg . защитаКатегориидля i = 1 , 2 ^ noActive doлокальный ключ = {}для j , t в ipairs ( tryOrder ) делаемесли j > noActive, тоключ [ т . keypos ] = "все"ещеместное частное = i / 2 ^ ( j - 1 )частное = math.ceil ( частное )если частное % 2 == 1, тоключ [ т . keypos ] = t . валещеключ [ т . keypos ] = "все"конецконецконецключ = table.concat ( ключ , '|' )местная попытка = коты [ ключ ]если попытаетесь, тоreturn makeCategoryLink ( попытка , заголовок . текст )конецконецвернуться ''конец Защита функции : isIncorrect ()местный срок действия = сам . истечение срока не возвращать себя : shouldHaveProtectionCategory ()или введите ( expiry ) == 'number' и expiry < os.time ()конец Защита функции : isTemplateProtectedNonTemplate ()локальное действие , namespace = self . действие , себя . название . пространство именвернуть себя . level == 'templateeditor'и (( действие ~ = 'редактировать' и действие ~ = 'переместить' )или ( пространство имен ~ = 10 и пространство имен ~ = 828 ))конецФункция защиты : makeCategoryLinks ()местное сообщение = self . _cfg . сообщениеlocal ret = { self : makeProtectionCategory ()}если self : isIncorrect (), тоret [ # ret + 1 ] = makeCategoryLink (msg [ 'неправильная-категория-отслеживания' ],я . название . текст)конецесли self : isTemplateProtectedNonTemplate (), тоret [ # ret + 1 ] = makeCategoryLink (msg [ 'шаблон-категории-отслеживания' ],я . название . текст)конецвернуть table.concat ( ret )конец-------------------------------------------------- ------------------------------- Класс Blurb-------------------------------------------------- ------------------------------local Blurb = {}Blurb . __index = ВставкаBlurb . bannerTextFields = {текст = истина ,объяснение = правда ,tooltip = true ,alt = true ,ссылка = правда}функция Blurb . новый ( protectionObj , args , cfg )return setmetatable ({_cfg = cfg ,_protectionObj = protectionObj ,_args = args}, Blurb )конец- Частные методы -Функция Вставка : _formatDate ( Num )- Форматирует временную метку Unix в формате dd Month, YYYY.lang = lang или mw . язык . getContentLanguage ()локальный успех , дата = pcall (lang . formatDate ,lang ,я . _cfg . msg [ 'expiry-date-format' ] или 'j F Y' ,'@' .. tostring ( число ))если успех, то дата возвращенияконецконецФункция Вставка : _getExpandedMessage ( msgKey )return self : _substituteParameters ( self . _cfg . msg [ msgKey ])конецФункция Вставка : _substituteParameters ( MSG )если не сам . _params тогдалокальный параметрFuncs = {}параметрFuncs . ТЕКУЩАЯ ВЕРСИЯ = себя . _makeCurrentVersionParameterпараметрFuncs . EDITREQUEST = self . _makeEditRequestParameterпараметрFuncs . EXPIRY = self . _makeExpiryParameterпараметрFuncs . ОБЪЯСНЕНИЕBLURB = self . _makeExplanationBlurbParameterпараметрFuncs . IMAGELINK = сам . _makeImageLinkParameterпараметрFuncs . INTROBLURB = себя . _makeIntroBlurbParameterпараметрFuncs . ИНТРОФРАГМЕНТ = я . _makeIntroFragmentParameterпараметрFuncs . PAGETYPE = self . _makePagetypeParameterпараметрFuncs . PROTECTIONBLURB = self . _makeProtectionBlurbParameterпараметрFuncs . PROTECTIONDATE = self . _makeProtectionDateParameterпараметрFuncs . УРОВЕНЬ ЗАЩИТЫ = сам . _makeProtectionLevelParameterпараметрFuncs . PROTECTIONLOG = self . _makeProtectionLogParameterпараметрFuncs . РАЗГОВОРНАЯ СТРАНИЦА = я . _makeTalkPageParameterпараметрFuncs . TOOLTIPBLURB = сам . _makeTooltipBlurbParameterпараметрFuncs . TOOLTIPFRAGMENT = сам . _makeTooltipFragmentParameterпараметрFuncs . ВАНДАЛ = сам . _makeVandalTemplateParameterя . _params = setmetatable ({}, {__index = функция ( t , k )местный параметресли parameterFuncs [ k ], тоparam = parameterFuncs [ k ] ( самостоятельно )конецparam = param или ''t [ k ] = paramвернуть параметрконец})конецmsg = msg : gsub ( '$ {(% u +)}' , self . _params )вернуть сообщениеконецФункция Вставка : _makeCurrentVersionParameter ()- Ссылка на историю страницы или журнал перемещений, в зависимости от типа- охрана.local pagename = self . _protectionObj . название . prefixedTextесли сам . _protectionObj . action == 'move', затем- Нам нужна ссылка на журнал перемещения.вернуть makeFullUrl ('Special: Log' ,{ type = 'move' , page = pagename },сам : _getExpandedMessage ( 'текущая-версия-перемещение-дисплей' ))еще- Нам нужна ссылка на историю.вернуть makeFullUrl (pagename ,{ action = 'history' },сам : _getExpandedMessage ( 'текущая версия-редактирование-дисплей' ))конецконецФункция Вставка : _makeEditRequestParameter ()local mEditRequest = require ( 'Модуль: отправить запрос на редактирование' )местное действие = самость . _protectionObj . действиелокальный уровень = себя . _protectionObj . уровень- Получить тип запроса на редактирование.local requestTypeесли действие == 'редактировать', тогдаесли level == 'autoconfirmed', тоrequestType = 'полу'elseif level == 'extendedconfirmed', затемrequestType = 'расширенный'elseif level == 'templateeditor' тогдаrequestType = 'шаблон'конецконецrequestType = requestType или "полный"- Получите отображаемое значение.локальный дисплей = сам : _getExpandedMessage ( 'редактировать-запрос-дисплей' )вернуть mEditRequest . _link { type = requestType , display = display }конецФункция Вставка : _makeExpiryParameter ()местный срок действия = сам . _protectionObj . истечение срокаесли type ( expiry ) == 'number', товернуть себя : _formatDate ( срок действия )еще срок возвратаконецконецФункция Вставка : _makeExplanationBlurbParameter ()- Сначала рассмотрите особые случаи.если сам . _protectionObj . название . namespace == 8, затем- пространство имен MediaWikiвернуть себя : _getExpandedMessage ( 'объяснение-рекламное-существительноезащита' )конец- Получить объяснение ключей таблицы рекламных объявленийместное действие = самость . _protectionObj . действиелокальный уровень = себя . _protectionObj . уровеньlocal talkKey = self . _protectionObj . название . isTalkPage и "разговор" или "тема"- Найдите сообщение в таблице с пояснениями и замените любое- параметры.местные объяснения = сам . _cfg . объяснениеместное сообщениеесли объяснения [ действие ] [ уровень ] и объяснения [ действие ] [ уровень ] [ talkKey ], тоmsg = объяснения [ действие ] [ уровень ] [ talkKey ]elseif объяснения [ действие ] [ уровень ] и объяснения [ действие ] [ уровень ]. тогда по умолчанию msg = объяснения [ действие ] [ уровень ]. По умолчаниюelseif объяснения [ действие ]. по умолчанию и объяснения [ действие ]. по умолчанию [ talkKey ], тогдаmsg = объяснения [ действие ]. по умолчанию [ talkKey ]elseif объяснения [ действие ]. по умолчанию и объяснения [ действие ]. по умолчанию . тогда по умолчанию msg = объяснения [ действие ]. по умолчанию . По умолчаниюещеошибка ( string.format ('не удалось найти рекламное объявление для действия «% s», уровня «% s» и клавиши разговора «% s»' ,действие ,уровень ,TalkKey), 8 )конецвернуть себя : _substituteParameters ( msg )конецФункция Вставка : _makeImageLinkParameter ()local imageLinks = self . _cfg . imageLinksместное действие = самость . _protectionObj . действиелокальный уровень = себя . _protectionObj . уровеньместное сообщениеесли imageLinks [ действие ] [ уровень ], тоmsg = imageLinks [ действие ] [ уровень ]elseif imageLinks [ действие ]. тогда по умолчанию msg = imageLinks [ действие ]. По умолчаниюещеmsg = imageLinks . редактировать . По умолчаниюконецвернуть себя : _substituteParameters ( msg )конецФункция Вставка : _makeIntroBlurbParameter ()если сам . _protectionObj : isTemporary (), затемвернуть себя : _getExpandedMessage ( 'intro-blurb-expiry' )ещевернуть себя : _getExpandedMessage ( 'intro-blurb-noexpiry' )конецконецФункция Вставка : _makeIntroFragmentParameter ()если сам . _protectionObj : isTemporary (), затемвернуть себя : _getExpandedMessage ( 'intro-fragment-expiry' )ещевернуть себя : _getExpandedMessage ( 'intro-fragment-noexpiry' )конецконецФункция Вставка : _makePagetypeParameter ()local pagetypes = self . _cfg . типы страницвернуть типы страниц [ self . _protectionObj . название . пространство имен ]или типы страниц . По умолчаниюили ошибка ( 'тип страницы по умолчанию не определен' , 8 )конецФункция Вставка : _makeProtectionBlurbParameter ()местная защита Blurbs = self . _cfg . защитаместное действие = самость . _protectionObj . действиелокальный уровень = себя . _protectionObj . уровеньместное сообщениеесли protectionBlurbs [ действие ] [ уровень ], тоmsg = protectionBlurbs [ действие ] [ уровень ]elseif protectionBlurbs [ действие ]. тогда по умолчанию msg = protectionBlurbs [ действие ]. По умолчаниюELSEIF protectionBlurbs . редактировать . тогда по умолчанию msg = protectionBlurbs . редактировать . По умолчаниюещеerror ( 'для protectionBlurbs.edit.default не определено рекламное объявление о защите' , 8 )конецвернуть себя : _substituteParameters ( msg )конецФункция Вставка : _makeProtectionDateParameter ()local protectionDate = self . _protectionObj . ProtectionDateесли type ( protectionDate ) == 'number', товернуть себя : _formatDate ( ProtectionDate )ещевозврат защитыконецконецФункция Вставка : _makeProtectionLevelParameter ()local protectionLevels = self . _cfg . ProtectionLevelsместное действие = самость . _protectionObj . действиелокальный уровень = себя . _protectionObj . уровеньместное сообщениеесли ProtectionLevels [ действие ] [ уровень ], тоmsg = protectionLevels [ действие ] [ уровень ]elseif protectionLevels [ действие ]. тогда по умолчанию msg = protectionLevels [ действие ]. По умолчаниюelseif protectionLevels . редактировать . тогда по умолчанию msg = protectionLevels . редактировать . По умолчаниюещеerror ( 'для ProtectionLevels.edit.default не определен уровень защиты' , 8 )конецвернуть себя : _substituteParameters ( msg )конецФункция Вставка : _makeProtectionLogParameter ()local pagename = self . _protectionObj . название . prefixedTextесли сам . _protectionObj . action == 'autoreview', затем- Нам нужен журнал отложенных изменений.вернуть makeFullUrl ('Special: Log' ,{ type = 'stable' , page = pagename },сам : _getExpandedMessage ( 'pc-log-display' ))еще- Нам нужен журнал защиты.вернуть makeFullUrl ('Special: Log' ,{ type = 'protect' , page = pagename },self : _getExpandedMessage ( 'отображение журнала защиты' ))конецконецФункция Вставка : _makeTalkPageParameter ()вернуть string.format ('[[% s:% s #% s |% s]]' ,мв . сайт . пространства имен [ self . _protectionObj . название . пространство имен ]. говорить . имя ,я . _protectionObj . название . текст ,я . _args . раздел или "верх" ,сам : _getExpandedMessage ( 'отображение ссылки-страницы-обсуждения' ))конецФункция Вставка : _makeTooltipBlurbParameter ()если сам . _protectionObj : isTemporary (), затемвернуть себя : _getExpandedMessage ( 'всплывающая подсказка-истечение срока' )ещевернуть себя : _getExpandedMessage ( 'всплывающая подсказка-noexpiry' )конецконецФункция Вставка : _makeTooltipFragmentParameter ()если сам . _protectionObj : isTemporary (), затемвернуть себя : _getExpandedMessage ( 'всплывающая подсказка-фрагмент-истечение' )ещевернуть себя : _getExpandedMessage ( 'фрагмент подсказки-noexpiry' )конецконецФункция Вставка : _makeVandalTemplateParameter ()return require ( 'Модуль: Вандал-м' ). _main {я . _args . пользователь или сам . _protectionObj . название . baseText}конец- Публичные методы -Функция Blurb : makeBannerText ( ключ )- Подтвердить ввод.если не ключевой или нет Blurb . bannerTextFields [ ключ ], затемошибка ( string.format ('"% s" не является допустимым полем конфигурации баннера' ,tostring ( ключ )), 2 )конец- Сгенерируйте текст.местное сообщение = self . _protectionObj . bannerConfig [ ключ ]если type ( msg ) == 'string', товернуть себя : _substituteParameters ( msg )elseif type ( msg ) == 'function' тогдаmsg = msg ( self . _protectionObj , self . _args )если type ( msg ) ~ = 'string', тоошибка ( string.format ('плохой вывод функции конфигурации баннера с ключом "% s"'.. '(ожидаемая строка, получено% s)' ,tostring ( ключ ),тип ( сообщение )), 4 )конецвернуть себя : _substituteParameters ( msg )конецконец-------------------------------------------------- ------------------------------- Класс BannerTemplate-------------------------------------------------- ------------------------------local BannerTemplate = {}BannerTemplate . __index = BannerTemplateфункция BannerTemplate . новый ( protectionObj , cfg )local obj = {}OBJ . _cfg = cfg- Установите имя файла изображения.local imageFilename = protectionObj . bannerConfig . изображениеесли imageFilename, тоOBJ . _imageFilename = imageFilenameеще- Если имя файла изображения не указано явно в конфигурации баннера,- сгенерировать его из состояния защиты и пространства имен.локальное действие = protectionObj . действиелокальный уровень = protectionObj . уровеньлокальное пространство имен = protectionObj . название . пространство именместная причина = protectionObj . причина- В первую очередь разберитесь с особыми случаями.если (пространство имен == 10или пространство имен == 828или причина и объект . _cfg . indefImageReasons [ причина ])и действие == 'редактировать'и level == 'sysop'а не protectionObj : isTemporary ()тогда- Полностью защищенные модули и шаблоны получают специальный красный "indef"-- замок навесной.OBJ . _imageFilename = объект . _cfg . msg [ 'имя-файла-образа-indef' ]еще- Работайте со штатными видами защиты.локальные изображения = obj . _cfg . изображенийесли изображения [ действие ] тоесли изображения [ действие ] [ уровень ], тоOBJ . _imageFilename = images [ действие ] [ уровень ]elseif изображения [ действие ]. тогда по умолчанию OBJ . _imageFilename = изображения [ действие ]. По умолчаниюконецконецконецконецвернуть setmetatable ( obj , BannerTemplate )конецфункция BannerTemplate : renderImage ()локальное имя файла = сам . _imageFilenameили себя . _cfg . msg [ 'имя-файла-изображения-по умолчанию' ]или "Transparent.gif"return makeFileLink {файл = имя файла ,size = ( self . imageWidth или 20 ) .. 'px' ,alt = self . _imageAlt ,ссылка = сам . _imageLink ,caption = self . imageCaption ,class = 'autoconfirmed-show'}конец-------------------------------------------------- ------------------------------- Класс баннера-------------------------------------------------- ------------------------------local Banner = setmetatable ({}, BannerTemplate )Баннер . __index = Баннерфункция Баннер . новый ( protectionObj , blurbObj , cfg )local obj = BannerTemplate . new ( protectionObj , cfg ) - рекламное объявление не требуется.OBJ . imageWidth = 40OBJ . imageCaption = blurbObj : makeBannerText ( 'alt' ) - большие баннеры используют альтернативный текст для всплывающей подсказки.OBJ . _reasonText = blurbObj : makeBannerText ( 'текст' )OBJ . _explanationText = blurbObj : makeBannerText ( 'объяснение' )OBJ . _page = protectionObj . название . prefixedText - имеет значение только при тестировании.вернуть setmetatable ( obj , Banner )конецфункция Баннер : __tostring ()- Отображает баннер.makeMessageBox = makeMessageBox или require ( 'Модуль: окно сообщения' ). основнойлокальная причинаText = self . _reasonText или error ( 'текст причины не установлен' , 2 )местное объяснениеText = self . _explanationTextlocal mbargs = {page = self . _page ,type = 'защита' ,изображение = себя : renderImage (),текст = строка.формат ("'' '% s' ''% s" ,причинаText ,объяснениеТекст и '
' .. объяснениеТекст или '')}вернуть makeMessageBox ( 'mbox' , mbargs )конец-------------------------------------------------- ------------------------------- Класс замка-------------------------------------------------- ------------------------------локальная Навесной замок = setmetatable ({}, BannerTemplate )Замок . __index = Замокфункция Padlock . новый ( protectionObj , blurbObj , cfg )local obj = BannerTemplate . new ( protectionObj , cfg ) - рекламное объявление не требуется.OBJ . imageWidth = 20OBJ . imageCaption = blurbObj : makeBannerText ( 'подсказка' )OBJ . _imageAlt = blurbObj : makeBannerText ( 'alt' )OBJ . _imageLink = blurbObj : makeBannerText ( 'ссылка' )OBJ . _indicatorName = cfg . padlockIndicatorNames [ protectionObj . действие ]или cfg . padlockIndicatorNames . По умолчаниюили 'pp-default'вернуть setmetatable ( obj , Padlock )конецфункция Padlock : __tostring ()локальный кадр = mw . getCurrentFrame ()- Тег nowiki помогает предотвратить пробелы в верхней части статей.return frame : extensionTag { name = 'nowiki' } .. frame : extensionTag {name = 'индикатор' ,args = { name = self . _indicatorName },content = self : renderImage ()}конец-------------------------------------------------- ------------------------------- Экспорт-------------------------------------------------- ------------------------------местный p = {}функция p . _exportClasses ()- Это используется в целях тестирования.return {Защита = Защита ,Blurb = Blurb ,BannerTemplate = BannerTemplate ,Баннер = Баннер ,Padlock = Замок ,}конецфункция p . _main ( аргументы , cfg , заголовок )args = args или {}cfg = cfg или требуется ( CONFIG_MODULE )local protectionObj = Защита . новый ( аргументы , cfg , заголовок )местное ret = {}- Если защита от редактирования страницы является такой же или более строгой, чем ее- защита от каких-то других действий, после чего ничего не отображать- для другого действия (кроме категорий).если protectionObj . действие == 'редактировать' илиаргументы . демо-уровень илине getReachableNodes (cfg . иерархия ,ProtectionObj . уровень) [ EffectiveProtectionLevel ( 'редактировать' , ProtectionObj . title )]тогда- Инициализировать объект рекламного объявлениялокальная blurbObj = Blurb . новый ( protectionObj , args , cfg )- Визуализировать баннересли protectionObj : shouldShowLock (), тоret [ # ret + 1 ] = tostring (( YESNO ( арг . Маленький ) и Навесной замок или баннер ). новый ( protectionObj , blurbObj , cfg ))конецконец- Рендеринг категорийесли YESNO ( арг . категория ) ~ = ложно , тоret [ # ret + 1 ] = protectionObj : makeCategoryLinks ()конецвернуть table.concat ( ret )конецфункция p . основной ( кадр , cfg )cfg = cfg или требуется ( CONFIG_MODULE )- Найдите аргументы по умолчанию, если таковые имеются.локальный родитель = фрейм . getParent и фрейм : getParent ()local defaultArgs = parent и cfg . оболочки [ parent : getTitle (): gsub ( '/ sandbox $' , '' )]- Найдите аргументы пользователя и используйте родительский фрейм, если нас вызывают из- шаблон обертки.getArgs = getArgs или require ( 'Модуль: аргументы' ). getArgslocal userArgs = getArgs ( frame , {parentOnly = defaultArgs ,frameOnly = not defaultArgs})- Создайте таблицу аргументов. Заданные пользователем аргументы перезаписывают аргументы по умолчанию.местные аргументы = {}для к , V в пар ( defaultArgs или {}) делаютargs [ k ] = vконецдля k , v в парах ( userArgs ) делаемargs [ k ] = vконецвозврат п . _main ( аргументы , cfg )конецвернуть p