Module:Category handler: Difference between revisions

Ganaram inukshuk (talk | contribs)
overhaul logic for suffixes?
ArrowHead294 (talk | contribs)
m Wikitext debugger option
 
(31 intermediate revisions by one other user not shown)
Line 1: Line 1:
-- This module follows [[User:Ganaram inukshuk/Provisional style guide for Lua]]
-- This module follows [[User:Ganaram inukshuk/Provisional style guide for Lua]]
local getArgs = require("Module:Arguments").getArgs
local yesno = require("Module:Yesno")
local yesno = require("Module:Yesno")


Line 11: Line 12:
-- - Infoboxes; these usually shouldn't categorize if they're outside the main
-- - Infoboxes; these usually shouldn't categorize if they're outside the main
--  namespace.
--  namespace.
-- - Certain mboxes; some mboxes categorize certain pages, but they shouldn't
-- - Certain mboxes; some mboxes categorize pages, but if that mbox categorizes
--  categorize their own documentation.
--  templates/modules and are placed on that page's /doc subpage, it should
--  categorize the page on which the documentation is transcluded, not the /doc
--  page itself.
-- - Categorizing templates used on their own /doc pages as examples; a special
--  case of the previous case; passing in debug=1 disables all categorization.


-- Default list of namespaces in which to suppress categorization. Most
-- Default list of namespaces in which to suppress categorization. Most
Line 21: Line 26:
-- Adjust as needed!
-- Adjust as needed!
local DEFAULT_SUPPRESSED_NAMESPACES = {
local DEFAULT_SUPPRESSED_NAMESPACES = {
["main"] = false,
     ["talk"] = true,
     ["talk"] = true,
     ["user"] = true,
     ["user"] = true,
Line 44: Line 50:
"sandbox",
"sandbox",
}
}
-- List of namespace aliases
-- For "main", this is so editors can type in "main" since the main namespace's
-- actual name is "". For "xw"-related namespaces, these are shorthands.
local NAMESPACE_ALIASES = {
[""] = "main", -- "" is treated as "main"
["xw"] = "xenharmonic wiki", -- Shorthand
["xw talk"] = "xenharmonic wiki talk" -- Shorthand
}
-- Helper function
-- Converts namespace aliases to their actual names
-- Must be placed before is_suppressed_namespace()
local function normalize_ns(ns)
ns = mw.ustring.lower(mw.text.trim(ns or "")) -- Convert to lowercase and and trim extra spaces
if ns == "" then ns = "main" end -- Empty-string is assumed to be "main"
if NAMESPACE_ALIASES[ns] then
return NAMESPACE_ALIASES[ns]
end
return ns
end


-- Helper function: check if current namespace is excluded
-- Helper function: check if current namespace is excluded
-- Accepts an optional table, containing or overriding other namespaces' rules
-- Accepts an optional table, containing or overriding other namespaces' rules
local function is_suppressed_namespace(ns_override)
local function is_suppressed_namespace(ns_override)
-- Get current namespace, as lowercase
-- Get current namespace, or aliased namespace, as lowercase
local curr_ns = mw.ustring.lower(mw.title.getCurrentTitle().nsText or '')
local curr_ns = normalize_ns(mw.title.getCurrentTitle().nsText)
-- Build table of suppressed namespaces; start with default list
-- Build table of suppressed namespaces; start with default list
local namespaces = {}
local namespaces = {}
for k, v in pairs(DEFAULT_SUPPRESSED_NAMESPACES) do
for k, v in pairs(DEFAULT_SUPPRESSED_NAMESPACES) do
namespaces[k] = v
namespaces[normalize_ns(k)] = v
end
end


Line 60: Line 87:
if type(ns_override) == "table" then
if type(ns_override) == "table" then
for k, v in pairs(ns_override) do
for k, v in pairs(ns_override) do
namespaces[k] = v
namespaces[normalize_ns(k)] = v
end
end
end
end
Line 72: Line 99:
-- Accepts an opiontal table, containing additional suffixes to suppress
-- Accepts an opiontal table, containing additional suffixes to suppress
-- Suffix and custom suffixes are lowercased to guarantee matching
-- Suffix and custom suffixes are lowercased to guarantee matching
--[[
local function has_suppressed_suffix(suffixes_override)
local function has_suppressed_suffix(suffixes_override)
local title = mw.title.getCurrentTitle()
local title = mw.title.getCurrentTitle()
Line 103: Line 129:
return false
return false
end
end
]]--


-- "Main" function; can be called by other modules
-- "Main" function; can be called by other modules
Line 109: Line 134:
-- Disallows categories if it's in a suppressed namespace or the page has a
-- Disallows categories if it's in a suppressed namespace or the page has a
-- suppressed suffix (subpage)
-- suppressed suffix (subpage)
function p._category_handler(cats, ns_override, suffixes, is_debug)
function p._category_handler(cats, is_debug, ns_override, suffixes)
local cats = cats or {}
local cats = cats or {}
local is_debug = yesno(is_debug, false)
local is_debug = yesno(is_debug, false)
local title = mw.title.getCurrentTitle()
 
-- Test values; should be commented out for normal use
-- Don't bother if if:
--local cats = cats or {"Abstract MOS patterns", "7-tone scales"}
-- - In debug mode
--local ns_override = ns_override or { ["module"] = true }
-- - In a suppressed namespace
-- - On a subpage like /doc or /sandbox (but not if transcluded)
-- If in a suppressed namespace/prefix, or in debug mode (suppresses ALL
-- - Not a "content" page (IE, not a main/module/template page)
-- categorization) don't bother
if is_debug
if is_suppressed_namespace(ns_override)
or is_suppressed_namespace(ns_override)
or has_suppressed_suffix(suffixes)
or not title.isContentPage
or is_debug then
then
return ''
return ''
end
end


-- Categorize
-- Otherwise, categorize
local result = ''
local result = ''
for _, cat in ipairs(cats) do
for _, cat in ipairs(cats) do
Line 140: Line 164:
-- Wrapper for templates calling via #invoke
-- Wrapper for templates calling via #invoke
function p.category_handler(frame)
function p.category_handler(frame)
local args = frame:getParent().args
local args = getArgs(frame)
local cats_unparsed        = args["categories" ] or ""
local excluded_ns_unparsed = args["excluded_ns"] or "" -- Additional namespaces to exclude (EG, a template that should not be used within main namespace, which is allowed by default)
local excluded_ns_unparsed = args["excluded_ns"] or ""
local allowed_ns_unparsed  = args["allowed_ns" ] or "" -- Namespaces to allow; overrides default list (EG, a template that should be used within user namespace, which is disallowed by default)
--local suffixes_unparsed    = args["suffixes"  ] or ""
local suffixes_unparsed    = args["suffixes"  ] or "" -- Additional page suffixes in which to disallow categories
local is_debug = yesno(args["debug"], false) -- Parse debug mode; setting this to TRUE disables all categories
local is_debug = yesno(args["debug"], false) -- Parse debug mode; setting this to TRUE disables all categories
local wtext = yesno(args["wtext"]) -- Used to show the underlying Wikitext


-- Parse categories
-- Parse categories
-- Categories are entered using unnamed params
local cats = {}
local cats = {}
for cat in mw.text.gsplit(cats_unparsed, "[,\n]") do
for _, cat in ipairs(args) do
cat = mw.text.trim(cat)
cat = mw.text.trim(cat)
if cat ~= "" then
if cat ~= "" then
Line 164: Line 190:
if ns ~= "" then
if ns ~= "" then
ns_override[ns] = true
ns_override[ns] = true
end
end
-- Parse allowed namespaces
-- This gets added to the ns_override array, with values set to FALSE
-- EG, Template:TODO is used in several namespaces that are normally
-- suppressed: user, talk, help, and maybe xw talk
for ns in mw.text.gsplit(allowed_ns_unparsed, "[;\n]") do
ns = mw.text.trim(ns)
if ns ~= "" then
ns_override[ns] = false
end
end
end
end


-- Parse excluded suffixes
-- Parse excluded suffixes
--[[
local suffixes = {}
local suffixes = {}
for suffix in mw.text.gsplit(suffixes_unparsed, "[;\n]") do
for suffix in mw.text.gsplit(suffixes_unparsed, "[;\n]") do
Line 176: Line 212:
end
end
end
end
]]--


return p._category_handler(cats, ns_override, suffixes, is_debug)
local result = p._category_handler(cats, is_debug, ns_override, suffixes)
if wtext then
result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>"
end
return frame:preprocess(result)
end
end


return p
return p