Module:Category handler: Difference between revisions
mNo edit summary |
No edit summary |
||
| Line 49: | Line 49: | ||
-- 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(title, ns_override) | ||
local ns_text | |||
if type(title) == "table" and title.nsText then | |||
ns_text = mw.ustring.lower(title.nsText or '') | |||
elseif type(title) == "string" then | |||
ns_text = mw.ustring.lower(title) | |||
else | |||
ns_text = mw.ustring.lower(mw.title.getCurrentTitle().nsText or '') | |||
end | |||
local namespaces = {} | local namespaces = {} | ||
for k, v in pairs(DEFAULT_SUPPRESSED_NAMESPACES) do | for k, v in pairs(DEFAULT_SUPPRESSED_NAMESPACES) do | ||
| Line 59: | Line 65: | ||
end | end | ||
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 | ||
| Line 66: | Line 71: | ||
end | end | ||
return namespaces[ns_text] or false | |||
return namespaces[ | |||
end | end | ||
-- Helper function | -- Helper function | ||
| Line 74: | Line 79: | ||
-- 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(title, suffixes_override) | |||
local function has_suppressed_suffix(suffixes_override) | local title_obj | ||
local title = mw.title. | |||
if type(title) == "table" and title.text then | |||
title_obj = title | |||
elseif type(title) == "string" then | |||
title_obj = mw.title.new(title) | |||
else | |||
title_obj = mw.title.getCurrentTitle() | |||
end | |||
local pagename = mw.ustring.lower(title_obj.text or '') | |||
local suffixes = {} | local suffixes = {} | ||
-- Include default suppressed suffixes | |||
for _, suffix in ipairs(DEFAULT_SUPPRESSED_SUFFIXES) do | for _, suffix in ipairs(DEFAULT_SUPPRESSED_SUFFIXES) do | ||
table.insert(suffixes, suffix) | table.insert(suffixes, suffix) | ||
end | end | ||
-- | -- Add custom overrides | ||
if type(suffixes_override) == "table" then | if type(suffixes_override) == "table" then | ||
for _, suffix in ipairs(suffixes_override) do | for _, suffix in ipairs(suffixes_override) do | ||
| Line 92: | Line 105: | ||
end | end | ||
-- | -- Check if the page name ends with any of the suffixes (as subpages) | ||
for _, suffix in ipairs(suffixes) do | for _, suffix in ipairs(suffixes) do | ||
suffix = mw. | suffix = mw.text.trim(mw.ustring.lower(suffix or '')) | ||
if suffix ~= '' then | if suffix ~= '' then | ||
local pattern = '/' .. mw.ustring.gsub(suffix, '([%^%$%(%)%%%.%[%]%*%+%-%?])', '%%%1') .. '$' | local pattern = '/' .. mw.ustring.gsub(suffix, '([%^%$%(%)%%%.%[%]%*%+%-%?])', '%%%1') .. '$' | ||
| Line 105: | Line 118: | ||
return false | return false | ||
end | end | ||
-- "Main" function; can be called by other modules | -- "Main" function; can be called by other modules | ||
| Line 111: | Line 123: | ||
-- 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, is_debug) | function p._category_handler(cats, ns_override, suffixes_override, is_debug) | ||
cats = cats or {} | |||
is_debug = yesno(is_debug, false) | |||
local frame = mw.getCurrentFrame() | |||
local parent_frame = frame:getParent() | |||
local parent_title = parent_frame and mw.title.new(parent_frame:getTitle()) or mw.title.getCurrentTitle() | |||
local suppressed_ns = is_suppressed_namespace(parent_title, ns_override) | |||
local suppressed_suffix = has_suppressed_suffix(parent_title, suffixes_override) | |||
local is_content = parent_title.isContentPage | |||
if is_debug or suppressed_ns or suppressed_suffix or not is_content then | |||
-- Add a hidden HTML comment for debugging | |||
local reason = is_debug and "debug mode" | |||
or (suppressed_ns and "suppressed namespace") | |||
or (suppressed_suffix and "suppressed suffix") | |||
or (not is_content and "non-content page") | |||
or "unknown" | |||
return string.format("<!-- categorization suppressed: %s -->", reason) | |||
end | |||
local result = '' | |||
for _, cat in ipairs(cats) do | |||
cat = mw.text.trim(cat or '') | |||
if cat ~= '' then | |||
result = result .. string.format('[[Category:%s]]', cat) | |||
end | |||
end | |||
return result | |||
end | end | ||
| Line 145: | Line 160: | ||
function p.category_handler(frame) | function p.category_handler(frame) | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
local cats_unparsed = args["categories" ] or "" | local cats_unparsed = args["categories"] or "" | ||
local excluded_ns_unparsed = args["excluded_ns"] or "" | local excluded_ns_unparsed = args["excluded_ns"] or "" | ||
local suffixes_unparsed = args["suffixes"] or "" | |||
local is_debug = yesno(args["debug"], false) | local is_debug = yesno(args["debug"], false) | ||
-- Parse categories | -- Parse categories | ||
| Line 159: | Line 174: | ||
end | end | ||
-- Parse excluded namespaces | -- Parse excluded namespaces (added/overrides default) | ||
local ns_override = {} | local ns_override = {} | ||
for ns in mw.text.gsplit(excluded_ns_unparsed, "[;\n]") do | for ns in mw.text.gsplit(excluded_ns_unparsed, "[;\n]") do | ||
| Line 172: | Line 184: | ||
-- 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 180: | Line 191: | ||
end | end | ||
end | end | ||
return p._category_handler(cats, ns_override, is_debug) | return p._category_handler(cats, ns_override, suffixes, is_debug) | ||
end | end | ||
return p | return p | ||