Модуль:Обработчик категорий

-------------------------------------------------------------------------------- -- -- -- ОБРАБОТЧИК КАТЕГОРИЙ -- -- -- -- Этот модуль реализует шаблон {{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                                                  
Получено с "https://en.wikipedia.org/w/index.php?title=Module:Category_handler&oldid=948472489"