Editing Module:Category handler

From MINR.ORG WIKI

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
--------------------------------------------------------------------------------
+
local basepageSubpage = require('Module:Basepage subpage').main
--                                                                            --
 
--                              CATEGORY HANDLER                              --
 
--                                                                            --
 
--      This module implements the {{category handler}} template in Lua,      --
 
--      with a few improvements: all namespaces and all namespace aliases    --
 
--      are supported, and namespace names are detected automatically for    --
 
--      the local wiki. This module requires [[Module:Namespace detect]]      --
 
--      and [[Module:Yesno]] to be available on the local wiki. It can be    --
 
--      configured for different wikis by altering the values in              --
 
--      [[Module:Category handler/config]], and pages can be blacklisted      --
 
--      from categorisation by using [[Module:Category handler/blacklist]].   --
 
--                                                                            --
 
--------------------------------------------------------------------------------
 
  
-- Load required modules
+
-- Configuration data.
local yesno = require('Module:Yesno')
+
local cfg = {}
  
-- Lazily load things we don't always need
+
cfg.nocat = 'nocat'   
local mShared, mappings
+
cfg.categories = 'categories'
 +
cfg.subpage = 'subpage'
 +
cfg.page = 'page'
 +
cfg.category2 = 'category2'
 +
cfg.all = 'all'
 +
cfg.main = 'main'
 +
cfg.other = 'other'
  
 +
-- Module start.
 
local p = {}
 
local p = {}
 +
local args = {}
  
--------------------------------------------------------------------------------
+
-- Get the page object. This will return the page object for the page
-- Helper functions
+
-- specified, or nil if there are errors in the title or if the
--------------------------------------------------------------------------------
+
-- expensive function count has been exceeded.
 
+
local function getPageObject()
local function trimWhitespace(s, removeBlanks)
+
    -- Get the title object for args.page if it is specified. Otherwise
if type(s) ~= 'string' then
+
    -- get the title object for the current page.
return s
+
    if args[cfg.page] then
end
+
        -- Get the page object, passing the function through pcall
s = s:match('^%s*(.-)%s*$')
+
        -- in case we are over the expensive function count limit.
if removeBlanks then
+
        local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if s ~= '' then
+
        if not noError then
return s
+
            return nil
else
+
        else
return nil
+
            return pageObject
end
+
        end
else
+
    else
return s
+
        return mw.title.getCurrentTitle()
end
+
    end   
end
 
 
 
--------------------------------------------------------------------------------
 
-- CategoryHandler class
 
--------------------------------------------------------------------------------
 
 
 
local CategoryHandler = {}
 
CategoryHandler.__index = CategoryHandler
 
 
 
function CategoryHandler.new(data, args)
 
local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)
 
 
-- Set the title object
 
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
 
 
 
-- Set suppression parameter values
 
for _, key in ipairs{'nocat', 'categories'} do
 
local value = obj:parameter(key)
 
value = trimWhitespace(value, true)
 
obj['_' .. key] = yesno(value)
 
end
 
do
 
local subpage = obj:parameter('subpage')
 
local category2 = obj:parameter('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) -- don't remove blank values
 
end
 
return obj
 
end
 
 
 
function CategoryHandler:parameter(key)
 
local parameterNames = self._data.parameters[key]
 
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
 
-- See if a category suppression argument has been set.
 
self._nocat == true
 
or self._categories == false
 
or (
 
self._category2
 
and self._category2 ~= self._data.category2Yes
 
and self._category2 ~= self._data.category2Negative
 
)
 
 
 
-- Check whether we are on a subpage, and see if categories are
 
-- suppressed based on our subpage status.
 
or self._subpage == self._data.subpageNo and self.title.isSubpage
 
or self._subpage == self._data.subpageOnly and not self.title.isSubpage
 
 
end
 
end
  
function CategoryHandler:shouldSkipBlacklistCheck()
+
-- Find whether we need to return a category or not.
-- Check whether the category suppression arguments indicate we
+
local function needsCategory( pageObject )
-- should skip the blacklist check.
+
    if not pageObject then return end
return self._nocat == false
+
    if args[cfg.nocat] == 'true'
or self._categories == true
+
        or ( args[cfg.category2] and args[cfg.category2] ~= 'yes' )
or self._category2 == self._data.category2Yes
+
        or ( args[cfg.subpage] == 'no' and pageObject.isSubpage )
 +
        or ( args[cfg.subpage] == 'only' and not pageObject.isSubpage ) then
 +
        return false
 +
    else
 +
        return true
 +
    end
 
end
 
end
  
function CategoryHandler:matchesBlacklist()
+
-- Find whether we need to check the blacklist or not.
if self._usesCurrentTitle then
+
local function needsBlacklistCheck()
return self._data.currentTitleMatchesBlacklist
+
    if args[cfg.nocat] == 'false'
else
+
        or args[cfg.categories] == 'yes'
mShared = mShared or require('Module:Category handler/shared')
+
        or args[cfg.category2] == 'yes' then
return mShared.matchesBlacklist(
+
        return false
self.title.prefixedText,
+
    else
mw.loadData('Module:Category handler/blacklist')
+
        return true
)
+
    end
end
 
 
end
 
end
  
function CategoryHandler:isSuppressed()
+
local function _main()
-- Find if categories are suppressed by either the arguments or by
+
    local pageObject = getPageObject()
-- matching the blacklist.
+
    if not needsCategory( pageObject ) then return end
return self:isSuppressedByArguments()
+
   
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()
+
    return needsBlacklistCheck()
 
end
 
end
  
function CategoryHandler:getNamespaceParameters()
+
-- Process the arguments.
if self._usesCurrentTitle then
+
function p.main(frame)
return self._data.currentTitleNamespaceParameters
+
    -- If called via #invoke, use the args passed into the invoking
else
+
    -- template, or the args passed to #invoke if any exist. Otherwise
if not mappings then
+
    -- assume args are being passed directly in.
mShared = mShared or require('Module:Category handler/shared')
+
    local origArgs
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
+
    if frame == mw.getCurrentFrame() then
end
+
        origArgs = frame:getParent().args
return mShared.getNamespaceParameters(
+
        for k, v in pairs( frame.args ) do
self.title,
+
            origArgs = frame.args
mappings
+
            break
)
+
        end
end
+
    else
end
+
        origArgs = frame
 
+
    end
function CategoryHandler:namespaceParametersExist()
+
   
-- Find whether any namespace parameters have been specified.
+
    -- The following don't need blank values preserved:
-- We use the order "all" --> namespace params --> "other" as this is what
+
    -- nocat
-- the old template did.
+
    -- categories
if self:parameter('all') then
+
    -- subpage
return true
+
    -- page
end
+
    -- positional parameters (1-10)
if not mappings then
+
   
mShared = mShared or require('Module:Category handler/shared')
+
    -- The following *do* need blank values preserved
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
+
    -- category2
end
+
    -- all
for ns, params in pairs(mappings) do
+
    -- other
for i, param in ipairs(params) do
+
    -- main
if self._args[param] then
+
    -- all the namespace parameters
return true
 
end
 
end
 
end
 
if self:parameter('other') then
 
return 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
 
-- Namespace parameters exist - advanced usage.
 
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 is an integer
 
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
 
-- Namespace parameters don't exist, simple usage.
 
return self._args[1]
 
end
 
return nil
 
end
 
 
 
--------------------------------------------------------------------------------
 
-- Exports
 
--------------------------------------------------------------------------------
 
 
 
local p = {}
 
 
 
function p._exportClasses()
 
-- Used for testing purposes.
 
return {
 
CategoryHandler = CategoryHandler
 
}
 
end
 
 
 
function p._main(args, data)
 
data = data or 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)
+
    -- Trim whitespace and remove blank arguments for the following args:
data = data or mw.loadData('Module:Category handler/data')
+
    -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = require('Module:Arguments').getArgs(frame, {
+
    for k, v in pairs(origArgs) do
wrappers = data.wrappers,
+
        v = mw.text.trim(v) -- Trim whitespace.
valueFunc = function (k, v)
+
        if type(k) == 'number'
v = trimWhitespace(v)
+
            or k == cfg.nocat
if type(k) == 'number' then
+
            or k == cfg.categories
if v ~= '' then
+
            or k == cfg.subpage
return v
+
            or k == cfg.page then
else
+
            if v ~= '' then
return nil
+
                args[k] = v
end
+
            end
else
+
        else
return v
+
            args[k] = v
end
+
        end
end
+
    end
})
+
   
return p._main(args, data)
+
    -- Lower-case "nocat", "categories", "category2", and "subpage".
 +
    local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage }
 +
    for _, v in ipairs( lowercase ) do
 +
        if args[v] then
 +
            args[v] = mw.ustring.lower( args[v] )
 +
        end
 +
    end
 +
   
 +
    return _main()
 
end
 
end
  
 
return p
 
return p

Please note that all contributions to MINR.ORG WIKI may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see MINR.ORG WIKI:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)