Этот модуль Lua используется в системных сообщениях и примерно на 4 690 000 страницах, или примерно на 8 % всех страниц. Изменения в нем могут вызвать немедленные изменения в пользовательском интерфейсе Википедии. Чтобы избежать серьезных сбоев и нагрузки на сервер, любые изменения следует тестировать на подстраницах модуля /sandbox или /testcases или в вашей собственной песочнице модуля . Протестированные изменения можно добавить на эту страницу за одну правку. Пожалуйста, обсудите изменения на странице обсуждения перед их реализацией. |
Этот модуль подлежит защите страницы . Это очень заметный модуль , используемый очень большим количеством страниц или заменяемый очень часто. Поскольку вандализм или ошибки могут повлиять на многие страницы, и даже тривиальное редактирование может вызвать существенную нагрузку на серверы, он защищен от редактирования. |
Этот модуль может редактироваться только администраторами , поскольку он включен в одну или несколько страниц с каскадной защитой . |
Этот модуль зависит от следующих других модулей: |
Этот модуль реализует шаблон {{ category handler }} . Шаблон обработчика категорий помогает другим шаблонам автоматизировать как категоризацию, так и подавление категорий . Для получения информации об использовании шаблона обработчика категорий в других шаблонах см. документацию шаблона . Продолжайте читать, чтобы получить информацию об использовании модуля обработчика категорий в других модулях Lua или информацию об экспорте этого модуля в другие вики.
В случаях, когда модулю нужно только категоризировать в одном из пространств имен main (статьи), file (изображения) или category, то использование этого модуля является излишеством. Вместо этого вы можете просто получить объект title с помощью mw.title.getCurrentTitle и проверить поле nsText
. Например:
local title = mw . title . getCurrentTitle () if title . nsText == 'File' then -- что-нибудь сделать end
Однако если ваш модуль должен быть категоризирован в каком-либо другом пространстве имен, то мы рекомендуем вам использовать этот модуль, поскольку он обеспечивает надлежащее подавление категорий и упрощает выбор способа категоризации в различных пространствах имен.
Этот модуль обнаруживает и группирует все различные пространства имен, используемые в Википедии, в несколько типов. Эти типы используются в качестве имен параметров в этом модуле.
(исключая talk
и other
)
Пространство имен | Псевдонимы |
---|---|
main | |
user | |
wikipedia | project ,wp |
file | image |
mediawiki | |
template | tm |
help | |
category | |
portal | |
draft | |
mos | |
timedtext | |
module |
Этот модуль принимает два или более параметров. Вот пример использования программы hello world:
p = {} local categoryHandler = require ( 'Модуль:Обработчик категорий' ) .mainfunction p . main ( frame ) local result = 'Hello world!' local category = categoryHandler { '[[Category:Somecat]]' , nocat = frame . args . nocat -- Так что "nocat=true/false" работает } category = category или '' -- Проверяем, что у нас нет нулевого значения для переменной category. return result .. category endвернуть р
В приведенном выше примере используются настройки по умолчанию для модуля обработчика категорий. Это означает, что модуль примера будет категоризировать страницы в следующих пространствах имен:
Но он не будет категоризирован ни в каких других пространствах имен, например:
И он не будет попадать в черный список страниц. (См. раздел черный список ниже.)
Причина, по которой модуль обработчика категорий не категоризируется в некоторых пространствах имен, заключается в том, что в этих пространствах имен большинство модулей и шаблонов просто демонстрируются или перечисляются, а не используются. Таким образом, большинство модулей и шаблонов не должны категоризироваться в этих пространствах имен.
Любой модуль или шаблон, предназначенный для одного или нескольких пространств имен, к которым относится этот модуль, может использовать базовый синтаксис, показанный выше.
Этот модуль принимает один или несколько параметров, названных в честь различных типов страниц, как указано в разделе пространства имен выше. Используя эти параметры, вы можете точно указать, в каких пространствах имен должен быть классифицирован ваш шаблон. Вот так:
p = {} local categoryHandler = require ( 'Модуль:Обработчик категорий' ) .mainfunction p . main ( frame ) local result = 'Этот модуль предназначен для статей и страниц обсуждений.' local category = categoryHandler { main = '[[Category:Somecat1]]' , -- Категоризация в основном пространстве (статья) talk = '[[Category:Somecat2]]' , -- Категоризация в пространстве обсуждений nocat = frame . args . nocat -- Итак, "nocat=true/false" работает } category = category или '' -- Проверяем, что у нас нет значения nil для переменной category. return result .. category endвернуть р
Вышеуказанный модуль будет категоризировать только в главном пространстве и пространстве обсуждения. Но он не будет категоризировать на страницах /archive, поскольку они занесены в черный список. (См. раздел черный список ниже.) И если вам нужно продемонстрировать (обсудить) модуль на странице обсуждения, то вы можете передать " nocat='true'
", чтобы предотвратить категоризацию этого шаблона. (См. раздел nocat ниже.) Вот так:
== Мой новый модуль ==Привет, ребята, вы видели мой новый модуль?{{#invoke:mymodule|main|nocat=true}}Здорово, не правда ли?--~~~~
Иногда нам нужно использовать одну и ту же категорию в нескольких пространствах имен, тогда делаем так:
p = {} local categoryHandler = require ( 'Модуль:Обработчик категорий' ) .mainfunction p . main ( frame ) local result = 'Этот модуль используется в нескольких пространствах имен.' local category = categoryHandler { main = '[[Category:Somecat1]]' , [ 1 ] = '[[Category:Somecat2]]' , -- Для справки и пространства пользователя help = 1 , user = 1 , talk = '' , -- Нет категорий на страницах обсуждения other = '[[Category:Somecat3]]' , -- Для всех остальных пространств имен nocat = frame . args . nocat -- Поэтому "nocat=true/false" работает } category = category или '' -- Проверяем, что у нас нет значения nil для переменной category. return result .. category endвернуть р
В приведенном выше примере мы используем пронумерованный параметр для передачи одной из категорий, а затем говорим этому модулю использовать этот пронумерованный параметр как для справки, так и для пользовательского пространства.
Модуль обработчика категорий понимает неограниченное количество пронумерованных параметров.
Другой параметр определяет , что следует использовать в оставшихся пространствах имен, в которые явно не были переданы данные.
Обратите внимание на пустой, но определенный параметр разговора . Это не позволяет этому модулю показывать то, что было передано другому параметру, когда он находится в пространстве разговора.
Модуль обработчика категорий также имеет параметр all . Он работает следующим образом:
p = {} local categoryHandler = require ( 'Модуль:Обработчик категорий' ) .mainfunction p . main ( frame ) local result = 'Это модуль, используемый во всех пространствах имен.' local category = categoryHandler { all = '[[Category:Somecat1]]' , -- Категоризация во всех пространствах имен nocat = frame . args . nocat -- Итак, "nocat=true/false" работает } category = category или '' -- Проверяем, что у нас нет значения nil для переменной category. return result .. category endвернуть р
Приведенный выше пример будет категоризировать во всех пространствах имен, но не на страницах из черного списка. Если вы хотите продемонстрировать этот модуль на странице, то используйте " nocat=true
", чтобы предотвратить категоризацию шаблона.
Мы рекомендуем избегать параметра all , поскольку модули и шаблоны должны предпочтительно категоризироваться только в тех пространствах имен, в которых это необходимо.
Параметр all также можно комбинировать с остальными параметрами. Например:
p = {} local categoryHandler = require ( 'Модуль:Обработчик категорий' ) .mainfunction p . main ( frame ) local result = 'Это модуль, используемый во всех пространствах имен.' local category = categoryHandler { all = '[[Category:Somecat1]]' , -- Категоризируем во всех пространствах имен main = '[[Category:Somecat2]]' , -- И добавляем это в основное пространство other = '[[Category:Somecat3]]' , -- И добавляем это во все остальные пространства имен nocat = frame . args . nocat -- Итак, "nocat=true/false" работает } category = category или '' -- Проверяем, что у нас нет значения nil для переменной category. return result .. category endвернуть р
Если указанный выше модуль поместить в статью, то он добавит категории "Somecat1" и "Somecat2". Но на всех других типах страниц он вместо этого добавит "Somecat1" и "Somecat3". Как показывает пример, параметр all работает независимо от остальных параметров.
Модуль обработчика категорий понимает параметр подстраницы . Вот так:
p = {} local categoryHandler = require ( 'Модуль:Обработчик категорий' ) .mainfunction p . main ( frame ) local result = 'Этот модуль используется во всех пространствах имен.' local category = categoryHandler { subpage = 'no' -- Не категоризовать на подстраницах wikipedia = '[[Category:Somecat]]' , nocat = frame . args . nocat -- Поэтому "nocat=true/false" работает } category = category или '' -- Проверяем, что у нас нет значения nil для переменной category. return result .. category endвернуть р
Если " subpage='no'
", то этот шаблон не будет категоризировать на подстраницах. В редких случаях, когда вам нужно категоризировать толькоsubpage='only'
на подстраницах, используйте " ". Если подстраница пуста или не определена, то этот шаблон категоризирует как на базовых страницах, так и на подстраницах.
Этот модуль имеет черный список страниц и типов страниц, где шаблоны не должны автоматически категоризироваться. Таким образом, модули, которые используют этот меташаблон, например, не будут категоризироваться на страницах /archive и на подстраницах сообщений Wikipedia:Template .
Если вы хотите, чтобы шаблон категоризировался на странице из черного списка, то передайте " nocat = false
" модулю при размещении его на странице, таким образом пропуская проверку черного списка. Обратите внимание, что этот модуль категоризирует только в том случае, если у него есть данные для пространства имен. Например, если используется базовый синтаксис (см. базовое использование выше), то даже если вы установите " nocat = false
", шаблон не будет категоризирован на странице обсуждения, поскольку у него нет данных для страниц обсуждения. Но у него есть данные для пространства справки, поэтому на странице справки из черного списка он будет категоризирован.
Черный список находится в таблице конфигурации cfg.blacklist
в верхней части кода модуля.
Этот модуль понимает параметр nocat :
nocat = true
", то этот шаблон не категоризируется.nil
то этот шаблон классифицируется как обычно.nocat = false
" этот шаблон классифицируется даже на страницах, занесенных в черный список. (См. раздел черный список выше.)true
и , false
как определено в Module:Yesno , например, «yes», «y», «true» и 1 для true
, а также «no», «n», «false» и 0 для false
.Модули и шаблоны, которые используют {{category handler}}, должны пересылать nocat , чтобы они тоже понимали nocat . Код " nocat = frame.args.nocat
", показанный в примерах на этой странице, делает это.
Для обратной совместимости этот модуль также понимает параметр categories . Он работает так же, как nocat . Вот так:
categories = false
", то этот шаблон не категоризируется.categories = true
" этот шаблон классифицируется даже на страницах, занесенных в черный список.true
и , false
как определено в Module:Yesno , например, «yes», «y», «true» и 1 для true
, и «no», «n», «false» и 0 для false
.Для обратной совместимости этот шаблон поддерживает старый параметр "category=". Но имя параметра "category" уже используется в этом модуле для подачи данных категории, когда он находится в пространстве категории. Поэтому вместо этого этот шаблон использует category2 для использования, аналогичного nocat . Вот так:
category2 = "
" (пусто, но определено) или " category2 = 'no'
", или если category2 переданы какие-либо другие данные (за исключением случаев, описанных в следующих двух пунктах), то этот шаблон не выполняет категоризацию.category2 = '¬'
", то этот шаблон классифицирует как обычно.category2 = 'yes'
" этот шаблон классифицируется даже на страницах, занесенных в черный список.Помимо категорий, вы можете передать в этот модуль что угодно, например текст. Например:
p = {} local categoryHandler = require ( 'Модуль:Обработчик категорий' ) .mainfunction p . main ( frame ) local result = 'Этот модуль используется на страницах обсуждения.' local category = categoryHandler { talk = '[[Category:Somecat]]' , other = '<p class="error">Этот модуль следует использовать только на страницах обсуждения.</p>' , nocat = frame . args . nocat -- Так что "nocat=true/false" работает } category = category или '' -- Проверяем, что у нас нет значения nil для переменной category. return result .. category endвернуть р
Если код модуля, приведенный выше, используется где-либо, кроме страницы обсуждения, он будет выглядеть следующим образом:
Этот модуль следует использовать только на страницах обсуждений.
Этот текст не будет отображаться на страницах, занесенных в черный список, поэтому не используйте этот метод для отображения важной информации. Подача " nocat = 'true'
" в шаблон скрывает текст, так же как и подавляет любые категории.
Для целей тестирования и демонстрации этот модуль может принимать параметр с именем page . Например:
p = {} local categoryHandler = require ( 'Модуль:Обработчик категорий' ) .mainfunction p.main ( frame ) local category = categoryHandler { main = 'Category : Some cat' , talk = 'Category:Talk cat' , nocat = frame.args.nocat , -- Так что "nocat=true/false" работает page = ' User talk : Example' } return category end вернуть р
В приведенном выше коде мы намеренно опустили скобки вокруг названий категорий, чтобы мы могли увидеть вывод на странице. Независимо от того, на какой странице используется приведенный выше код, он вернет это:
Параметр page заставляет этот модуль вести себя точно так же, как на этой странице. Даже черный список работает. Имя страницы не обязательно должно быть существующей страницей.
Если параметр страницы пуст или не определен, результат определяется именем текущей страницы.
Вы можете сделать так, чтобы ваш модуль также понимал параметр страницы . Это означает, что вы можете проверить, как ваш шаблон будет категоризироваться на разных страницах, без необходимости фактического редактирования этих страниц. Затем сделайте так:
p = {} local categoryHandler = require ( 'Модуль:Обработчик категорий' ) .mainfunction p.main ( frame ) local category = categoryHandler { main = 'Category : Some cat' , talk = ' Category:Talk cat' , nocat = frame.args.nocat , -- Так что " nocat = true/false " работает page = frame.args.page -- Для тестирования } return category end вернуть р
Список всех параметров:
Обратите внимание, что пустые значения параметров "main" ... "other" имеют особое значение (см. примеры выше). Параметр "all" не понимает пронумерованные параметры, поскольку в этом никогда не должно быть необходимости.
Этот модуль можно экспортировать в другие вики, изменив значения конфигурации в cfg
таблице. Все значения переменных настраиваются, поэтому после установки значений конфигурации не должно возникнуть необходимости изменять основной код модуля. Подробности каждого значения конфигурации включены в комментарии к коду модуля. Кроме того, этот модуль требует, чтобы Module:Namespace detect был доступен в локальной вики.
-------------------------------------------------------------------------------- -- -- -- ОБРАБОТЧИК КАТЕГОРИЙ -- -- -- -- Этот модуль реализует шаблон {{category handler}} в Lua, -- -- с несколькими улучшениями: поддерживаются все пространства имен и все псевдонимы пространств имен, а имена пространств имен определяются автоматически для -- -- локальной вики. Для этого модуля требуется, чтобы [[Module:Namespace detect]] -- -- и [[Module:Yesno]] были доступны в локальной вики. Его можно настроить для разных вики, изменив значения в -- -- [[Module:Category handler/config]], а страницы можно вносить в черный список -- -- категоризации с помощью [[Module:Category handler/blacklist]]. -- -- -- -------------------------------------------------------------------------------- -- Загрузка требуемых модулей local yesno = require ( 'Module:Yesno' ) -- Ленивая загрузка вещей, которые нам не всегда нужны local mShared , сопоставления local p = {} -------------------------------------------------------------------------------- -- Вспомогательные функции -------------------------------------------------------------------------------- local function trimWhitespace ( s , removeBlanks ) if type ( s ) ~= 'string' then return s end s = s : match ( '^%s*(.-)%s*$' ) if removeBlanks then if s ~= '' then return s else return nil end else return s end end -------------------------------------------------------------------------------- -- Класс CategoryHandler -------------------------------------------------------------------------------- local CategoryHandler = {} CategoryHandler . __index = CategoryHandler function CategoryHandler.new ( data , args ) local obj = setmetatable ( { _data = data , _args = args } , CategoryHandler ) -- Устанавливает объект заголовка do local pagename = obj : parameter ( ' demopage ' ) local success , titleObj if pagename then success , titleObj = pcall ( mw .title.new , pagename ) end if success and titleObj then obj .title = titleObj if titleObj == mw .title.getCurrentTitle ( ) then obj ._usesCurrentTitle = true end else obj .title = mw .title.getCurrentTitle ( ) obj . _usesCurrentTitle = true end end -- Устанавливает значения параметров подавления для _ , key in ipairs { 'nocat' , 'categories' } do local value = obj : параметр ( key ) value = trimWhitespace ( value , true ) obj [ '_' .. key ] = yesno ( value ) end do local subpage = obj : параметр ( 'subpage' ) local category2 = obj : параметр ( 'category2' ) if type ( subpage ) == 'string' then subpage = mw.ustring.lower ( subpage ) end if type ( category2 ) == ' string ' then subpage = mw.ustring.lower ( category2 ) end obj._subpage = trimWhitespace ( subpage , true ) obj._category2 = trimWhitespace ( category2 ) -- не удалять пустые значения end return obj end function CategoryHandler : параметр ( ключ ) local ParameterNames = self._data.parameters [ ключ ] local pntype = type ( parameterNames ) if pntype == ' string ' or pntype == ' number ' then return self._args [ parameterNames ] elseif pntype == ' table ' then for _ , name in ipairs ( parameterNames ) do local value = self ._args [ name ] if value ~= nil then return value end end return nil else error ( string.format ( 'invalid config key "%s"' , tostring ( key ) ), 2 ) end end function CategoryHandler : isSuppressedByArguments () return -- Проверяет, был ли задан аргумент подавления категории. self . _nocat == true или self . _categories == false или ( self . _category2 и self . _category2 ~= self . _data . category2Yes и self . _category2 ~= self . _data . category2Negative ) -- Проверяем, находимся ли мы на подстранице, и смотрим, подавлены ли категории -- на основе статуса нашей подстраницы. или self . _subpage == self . _data . subpageNo и self . title . isSubpage или self . _subpage == self . _data . subpageOnly и не self . title . isSubpage end function CategoryHandler : shouldSkipBlacklistCheck () -- Проверяем, указывают ли аргументы подавления категорий на то, что нам -- следует пропустить проверку черного списка. return self . _nocat == false или self . _categories == true или self . _category2 == self . _data . category2Yes end function CategoryHandler : matchesBlacklist () if self . _usesCurrentTitle then return self._data.currentTitleMatchesBlacklist else mShared = mShared или require ( ' Module :Category handler/shared' ) return mShared.matchBlacklist ( self.title.prefixedText , mw.loadData ( 'Module: Category handler/blacklist' ) ) end end function CategoryHandler : isSuppressed ( ) -- Определить , подавлены ли категории аргументами или -- соответствием черному списку . return self : isSuppressedByArguments ( ) или нет self : shouldSkipBlacklistCheck ( ) и self : matchesBlacklist () end function CategoryHandler : getNamespaceParameters () if self . _usesCurrentTitle then return self . _data . currentTitleNamespaceParameters else if not mappings then mShared = mShared or require ( 'Module:Category handler/shared' ) mappings = mShared . getParamMappings ( true ) -- получает сопоставления с mw. loadData end return mShared . getNamespaceParameters ( self . title , mappings ) end end function CategoryHandler : namespaceParametersExist () -- Проверяет, были ли указаны какие-либо параметры пространства имен. -- Мы используем порядок "все" --> параметры пространства имен --> "другие", как это было в старом шаблоне. если self : параметр ( 'all' ) тогда вернуть true end если нет сопоставления тогда mShared = mShared или require ( 'Module:Category handler/shared' ) сопоставления = mShared . getParamMappings ( true ) -- получает сопоставления с mw.loadData end for ns , params in pairs ( сопоставления ) do for i , param in ipairs ( params ) do if self . _args [ param ] тогда вернуть true end end end if self : параметр ( 'other' ) тогда вернуть true end return false end function CategoryHandler : getCategories () local params = self : getNamespaceParameters () local nsCategory for i , param in ipairs ( params ) do local value = self._args [ param ] if value ~= nil then nsCategory = value break end end if nsCategory ~= nil or self : namespaceParametersExist ( ) then -- Параметры пространства имен существуют - расширенное использование. if nsCategory == nil then nsCategory = self : parameter ( 'other' ) end local ret = { self : parameter ( 'all' )} local numParam = tonumber ( nsCategory ) if numParam and numParam > = 1 and math.floor ( numParam ) == numParam then -- nsCategory является целым числом ret [ # ret + 1 ] = self . _args [ numParam ] else ret [ # ret + 1 ] = nsCategory end if # ret < 1 then return nil else return table.concat ( ret ) end elseif self . _data . defaultNamespaces [ self . title . namespace ] then -- Параметры пространства имен не существуют, простое использование. return self . _args [ 1 ] end return nil end -------------------------------------------------------------------------------- -- Экспорт -------------------------------------------------------------------------------- local p = {} function p . _exportClasses () -- Используется для тестирования. return { CategoryHandler = CategoryHandler } end function p . _main ( args , data ) data = data или mw . loadData ( 'Module:Category handler/data' ) local handler = CategoryHandler . new ( data , args ) if handler : isSuppressed () then return nil end return handler : getCategories () end function p . main ( frame , data ) data = data или mw . loadData ( 'Module:Category handler/data' ) local args = require ( 'Module:Arguments' ). getArgs ( frame , { wrappers = data . wrappers , valueFunc = function ( k , v ) v = trimWhitespace ( v ) if type ( k ) == 'number' then if v ~= '' then return v else return nil end else return v end end }) return p . _main ( args , data ) end return p