https://wiki.raregamingdump.ca/index.php?title=Module:Category_handler&feed=atom&action=history
Module:Category handler - Revision history
2024-03-29T15:59:10Z
Revision history for this page on the wiki
MediaWiki 1.34.0
https://wiki.raregamingdump.ca/index.php?title=Module:Category_handler&diff=2684&oldid=prev
Abequinn: Created page with "-------------------------------------------------------------------------------- -- -- --..."
2020-02-12T20:03:19Z
<p>Created page with "-------------------------------------------------------------------------------- -- -- --..."</p>
<p><b>New page</b></p><div>--------------------------------------------------------------------------------<br />
-- --<br />
-- CATEGORY HANDLER --<br />
-- --<br />
-- This module implements the {{category handler}} template in Lua, --<br />
-- with a few improvements: all namespaces and all namespace aliases --<br />
-- are supported, and namespace names are detected automatically for --<br />
-- the local wiki. This module requires [[Module:Namespace detect]] --<br />
-- and [[Module:Yesno]] to be available on the local wiki. It can be --<br />
-- configured for different wikis by altering the values in --<br />
-- [[Module:Category handler/config]], and pages can be blacklisted --<br />
-- from categorisation by using [[Module:Category handler/blacklist]]. --<br />
-- --<br />
--------------------------------------------------------------------------------<br />
<br />
-- Load required modules<br />
local yesno = require('Module:Yesno')<br />
<br />
-- Lazily load things we don't always need<br />
local mShared, mappings<br />
<br />
local p = {}<br />
<br />
--------------------------------------------------------------------------------<br />
-- Helper functions<br />
--------------------------------------------------------------------------------<br />
<br />
local function trimWhitespace(s, removeBlanks)<br />
if type(s) ~= 'string' then<br />
return s<br />
end<br />
s = s:match('^%s*(.-)%s*$')<br />
if removeBlanks then<br />
if s ~= '' then<br />
return s<br />
else<br />
return nil<br />
end<br />
else<br />
return s<br />
end<br />
end<br />
<br />
--------------------------------------------------------------------------------<br />
-- CategoryHandler class<br />
--------------------------------------------------------------------------------<br />
<br />
local CategoryHandler = {}<br />
CategoryHandler.__index = CategoryHandler<br />
<br />
function CategoryHandler.new(data, args)<br />
local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)<br />
<br />
-- Set the title object<br />
do<br />
local pagename = obj:parameter('demopage')<br />
local success, titleObj<br />
if pagename then<br />
success, titleObj = pcall(mw.title.new, pagename)<br />
end<br />
if success and titleObj then<br />
obj.title = titleObj<br />
if titleObj == mw.title.getCurrentTitle() then<br />
obj._usesCurrentTitle = true<br />
end<br />
else<br />
obj.title = mw.title.getCurrentTitle()<br />
obj._usesCurrentTitle = true<br />
end<br />
end<br />
<br />
-- Set suppression parameter values<br />
for _, key in ipairs{'nocat', 'categories'} do<br />
local value = obj:parameter(key)<br />
value = trimWhitespace(value, true)<br />
obj['_' .. key] = yesno(value)<br />
end<br />
do<br />
local subpage = obj:parameter('subpage')<br />
local category2 = obj:parameter('category2')<br />
if type(subpage) == 'string' then<br />
subpage = mw.ustring.lower(subpage)<br />
end<br />
if type(category2) == 'string' then<br />
subpage = mw.ustring.lower(category2)<br />
end<br />
obj._subpage = trimWhitespace(subpage, true)<br />
obj._category2 = trimWhitespace(category2) -- don't remove blank values<br />
end<br />
return obj<br />
end<br />
<br />
function CategoryHandler:parameter(key)<br />
local parameterNames = self._data.parameters[key]<br />
local pntype = type(parameterNames)<br />
if pntype == 'string' or pntype == 'number' then<br />
return self._args[parameterNames]<br />
elseif pntype == 'table' then<br />
for _, name in ipairs(parameterNames) do<br />
local value = self._args[name]<br />
if value ~= nil then<br />
return value<br />
end<br />
end<br />
return nil<br />
else<br />
error(string.format(<br />
'invalid config key "%s"',<br />
tostring(key)<br />
), 2)<br />
end<br />
end<br />
<br />
function CategoryHandler:isSuppressedByArguments()<br />
return<br />
-- See if a category suppression argument has been set.<br />
self._nocat == true<br />
or self._categories == false<br />
or (<br />
self._category2<br />
and self._category2 ~= self._data.category2Yes<br />
and self._category2 ~= self._data.category2Negative<br />
)<br />
<br />
-- Check whether we are on a subpage, and see if categories are<br />
-- suppressed based on our subpage status.<br />
or self._subpage == self._data.subpageNo and self.title.isSubpage<br />
or self._subpage == self._data.subpageOnly and not self.title.isSubpage<br />
end<br />
<br />
function CategoryHandler:shouldSkipBlacklistCheck()<br />
-- Check whether the category suppression arguments indicate we<br />
-- should skip the blacklist check.<br />
return self._nocat == false<br />
or self._categories == true<br />
or self._category2 == self._data.category2Yes<br />
end<br />
<br />
function CategoryHandler:matchesBlacklist()<br />
if self._usesCurrentTitle then<br />
return self._data.currentTitleMatchesBlacklist<br />
else<br />
mShared = mShared or require('Module:Category handler/shared')<br />
return mShared.matchesBlacklist(<br />
self.title.prefixedText,<br />
mw.loadData('Module:Category handler/blacklist')<br />
)<br />
end<br />
end<br />
<br />
function CategoryHandler:isSuppressed()<br />
-- Find if categories are suppressed by either the arguments or by<br />
-- matching the blacklist.<br />
return self:isSuppressedByArguments()<br />
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()<br />
end<br />
<br />
function CategoryHandler:getNamespaceParameters()<br />
if self._usesCurrentTitle then<br />
return self._data.currentTitleNamespaceParameters<br />
else<br />
if not mappings then<br />
mShared = mShared or require('Module:Category handler/shared')<br />
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData<br />
end<br />
return mShared.getNamespaceParameters(<br />
self.title,<br />
mappings<br />
)<br />
end<br />
end<br />
<br />
function CategoryHandler:namespaceParametersExist()<br />
-- Find whether any namespace parameters have been specified.<br />
-- We use the order "all" --> namespace params --> "other" as this is what<br />
-- the old template did.<br />
if self:parameter('all') then<br />
return true<br />
end<br />
if not mappings then<br />
mShared = mShared or require('Module:Category handler/shared')<br />
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData<br />
end<br />
for ns, params in pairs(mappings) do<br />
for i, param in ipairs(params) do<br />
if self._args[param] then<br />
return true<br />
end<br />
end<br />
end<br />
if self:parameter('other') then<br />
return true<br />
end<br />
return false<br />
end<br />
<br />
function CategoryHandler:getCategories()<br />
local params = self:getNamespaceParameters()<br />
local nsCategory<br />
for i, param in ipairs(params) do<br />
local value = self._args[param]<br />
if value ~= nil then<br />
nsCategory = value<br />
break<br />
end<br />
end<br />
if nsCategory ~= nil or self:namespaceParametersExist() then<br />
-- Namespace parameters exist - advanced usage.<br />
if nsCategory == nil then<br />
nsCategory = self:parameter('other')<br />
end<br />
local ret = {self:parameter('all')}<br />
local numParam = tonumber(nsCategory)<br />
if numParam and numParam >= 1 and math.floor(numParam) == numParam then<br />
-- nsCategory is an integer<br />
ret[#ret + 1] = self._args[numParam]<br />
else<br />
ret[#ret + 1] = nsCategory<br />
end<br />
if #ret < 1 then<br />
return nil<br />
else<br />
return table.concat(ret)<br />
end<br />
elseif self._data.defaultNamespaces[self.title.namespace] then<br />
-- Namespace parameters don't exist, simple usage.<br />
return self._args[1]<br />
end<br />
return nil<br />
end<br />
<br />
--------------------------------------------------------------------------------<br />
-- Exports<br />
--------------------------------------------------------------------------------<br />
<br />
local p = {}<br />
<br />
function p._exportClasses()<br />
-- Used for testing purposes.<br />
return {<br />
CategoryHandler = CategoryHandler<br />
}<br />
end<br />
<br />
function p._main(args, data)<br />
data = data or mw.loadData('Module:Category handler/data')<br />
local handler = CategoryHandler.new(data, args)<br />
if handler:isSuppressed() then<br />
return nil<br />
end<br />
return handler:getCategories()<br />
end<br />
<br />
function p.main(frame, data)<br />
data = data or mw.loadData('Module:Category handler/data')<br />
local args = require('Module:Arguments').getArgs(frame, {<br />
wrappers = data.wrappers,<br />
valueFunc = function (k, v)<br />
v = trimWhitespace(v)<br />
if type(k) == 'number' then<br />
if v ~= '' then<br />
return v<br />
else<br />
return nil<br />
end<br />
else<br />
return v<br />
end<br />
end<br />
})<br />
return p._main(args, data)<br />
end<br />
<br />
return p</div>
Abequinn