4,012
edits
en>RexxS (add caps parameter per talk request) |
m (1 revision imported) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 16: | Line 16: | ||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
local yesno = require('Module:Yesno') | local yesno = require('Module:Yesno') | ||
local | local mDisambiguation = require('Module:Disambiguation') | ||
local p = {} | local p = {} | ||
local function | -- Look up a namespace argument in the args table. | ||
-- | local function lookUpNamespaceArg(args, key) | ||
local | local arg = args[key] | ||
for | -- Convert "yes", "1" etc. to true, "no", "0" etc. to false, and leave | ||
-- other values the same. | |||
return yesno(arg, arg) | |||
end | |||
-- Append multiple values to an array | |||
local function appendMultiple(target, source) | |||
for _, value in ipairs(source) do | |||
table.insert(target, value) | |||
end | end | ||
end | end | ||
local function | -- Get argument keys for a title's namespace | ||
local function getNamespaceArgKeys(title, cfg) | |||
local nsInfo = mw.site.namespaces[title.namespace] | |||
local customAliases = cfg.customNamespaceAliases[title.namespace] or {} | |||
local keys = {} | |||
if nsInfo.name ~= '' then | |||
if | table.insert(keys, nsInfo.name) | ||
end | |||
if nsInfo.canonicalName ~= nsInfo.name and nsInfo.canonicalName ~= '' then | |||
table.insert(keys, nsInfo.canonicalName) | |||
end | end | ||
return | appendMultiple(keys, nsInfo.aliases) | ||
appendMultiple(keys, customAliases) | |||
return keys | |||
end | end | ||
-- Get the argument for a title's namespace, if it was specified in the args | |||
-- table. | |||
local function getNamespaceArg(title, args, cfg) | |||
if title.isTalkPage then | |||
if | return lookUpNamespaceArg(args, cfg.talk) | ||
end | |||
for _, key in ipairs(getNamespaceArgKeys(title, cfg)) do | |||
local arg = lookUpNamespaceArg(args, mw.ustring.lower(key)) | |||
if arg ~= nil then | |||
return arg | |||
end | end | ||
end | |||
return nil | |||
end | |||
-- Look up a page type specific to the title's namespace | |||
local function getExplicitPageType(title, cfg) | |||
if title.isTalkPage then | |||
return cfg.talkDefault | |||
else | |||
return cfg.pagetypes[title.namespace] | |||
end | |||
end | |||
-- Get a default page type that is not specific to the title's namespace | |||
local function getDefaultPageType(args, cfg) | |||
local other = lookUpNamespaceArg(args, cfg.other) | |||
if type(other) == 'string' then | |||
return other | |||
else | |||
return cfg.otherDefault | |||
end | |||
end | |||
local function detectRedirects(title, args) | |||
local redirect = lookUpNamespaceArg(args, cfg.redirect) | |||
if redirect == false then | |||
-- Don't detect redirects if they have been specifically disallowed. | |||
return nil | |||
end | |||
-- Allow custom values for redirects. | |||
if not title.isRedirect then | |||
return nil | |||
elseif type(redirect) == 'string' then | |||
return redirect | |||
else | |||
return cfg.redirectDefault | |||
end | end | ||
end | end | ||
local function | local function detectDisambiguationPages(title, args, cfg) | ||
-- | if title.namespace ~= 0 then | ||
-- | -- Only detect disambiguation pages in mainspace | ||
return nil | |||
end | |||
local dab = lookUpNamespaceArg(args, cfg.dab) | |||
if dab == false then | |||
-- Don't detect disambiguation pages if explicitly disallowed | |||
return nil | |||
end | |||
if not mDisambiguation.isDisambiguation(title:getContent()) then | |||
return nil | |||
elseif type(dab) == 'string' then | |||
return dab | |||
else | else | ||
return cfg.dabDefault | |||
end | end | ||
end | |||
-- Gets the pagetype from a class specified from the first positional | |||
-- parameter. | |||
local function getPageTypeFromClass(args, class, key, aliasTable, default) | |||
local arg = lookUpNamespaceArg(args, key) | |||
if arg == false then | |||
-- Don't check for this class if it is specifically disallowed. | |||
return nil | |||
end | end | ||
if aliasTable[class] then | |||
if | if type(arg) == 'string' then | ||
return arg | |||
if type( | |||
else | else | ||
return default | |||
end | end | ||
end | end | ||
return nil | |||
end | |||
if | |||
-- Get page types for mainspaces pages with an explicit class specified | |||
local function getMainNamespaceClassPageType(title, args, cfg) | |||
if title.namespace ~= 0 then | |||
return nil | |||
end | end | ||
-- | local class = args[1] | ||
-- | if type(class) == 'string' then | ||
local | -- Put in lower case so e.g. "na" and "NA" will both match. | ||
-- | class = mw.ustring.lower(class) | ||
end | |||
return getPageTypeFromClass( | |||
args, | |||
class, | |||
cfg.na, | |||
cfg.naAliases, | |||
cfg.naDefault | |||
) | |||
end | |||
-- Get page type specified by an explicit namespace argument. | |||
local function getNamespaceArgPageType(title, args, cfg) | |||
local namespaceArg = getNamespaceArg(title, args, cfg) | |||
if namespaceArg == true then | |||
-- Namespace has been explicitly enabled, so return the default for | |||
-- this namespace | |||
return getExplicitPageType(title, cfg) | |||
elseif namespaceArg == false then | |||
-- Namespace has been explicitly disabled | |||
return getDefaultPageType(args, cfg) | |||
elseif namespaceArg then | |||
-- This namespaces uses custom text | |||
return namespaceArg | |||
else | else | ||
return nil | |||
end | end | ||
end | end | ||
local function | -- Whether the title is in the set of default active namespaces which are | ||
local | -- looked up in cfg.pagetypes. | ||
local function isInDefaultActiveNamespace(title, args, cfg) | |||
local defaultNamespacesKey = args[cfg.defaultns] | |||
if defaultNamespacesKey == cfg.defaultnsAll then | |||
if | return true | ||
end | |||
local defaultNamespaces | |||
if defaultNamespacesKey == cfg.defaultnsExtended then | |||
defaultNamespaces = cfg.extendedNamespaces | |||
elseif defaultNamespacesKey == cfg.defaultnsNone then | |||
defaultNamespaces = {} | |||
else | |||
defaultNamespaces = cfg.defaultNamespaces | |||
end | end | ||
return defaultNamespaces[title.namespace] or false | |||
end | |||
if | |||
-- Get page type not specified or detected by other means | |||
local function getOtherPageType(title, args, cfg) | |||
if isInDefaultActiveNamespace(title, args, cfg) then | |||
return getExplicitPageType(title, cfg) | |||
else | |||
return getDefaultPageType(args, cfg) | |||
end | end | ||
-- | end | ||
if | |||
local function getPageType(title, args, cfg) | |||
return ( | |||
detectRedirects(title, args, cfg) | |||
return | or detectDisambiguationPages(title, args, cfg) | ||
or getMainNamespaceClassPageType(title, args, cfg) | |||
or getNamespaceArgPageType(title, args, cfg) | |||
or getOtherPageType(title, args, cfg) | |||
) | |||
end | |||
local function shouldUseSubjectTitle(args, cfg) | |||
return not yesno(args.talk, true) and args[cfg.defaultns] ~= cfg.defaultnsAll | |||
end | |||
-- Get the Scribunto title object to fetch the page type of | |||
local function getTitle(args, cfg) | |||
local title | |||
if args.page then | |||
title = mw.title.new(args.page) | |||
if not title then | |||
return nil | |||
end | end | ||
else | |||
title = mw.title.getCurrentTitle() | |||
end | |||
if shouldUseSubjectTitle(args, cfg) then | |||
return title.subjectPageTitle | |||
else | |||
return title | |||
end | end | ||
end | end | ||
function | local function pluralize(pageType, cfg) | ||
if cfg.irregularPlurals[pageType] then | |||
return cfg.irregularPlurals[pageType] | |||
if | |||
else | else | ||
return pageType .. cfg.plural -- often 's' | |||
end | end | ||
end | |||
local function capitalize(pageType) | |||
local first = mw.ustring.sub(pageType, 1, 1) | |||
local rest = mw.ustring.sub(pageType, 2) | |||
return mw.ustring.upper(first) .. rest | |||
end | |||
function p._main(args) | |||
local title = getTitle(args, cfg) | |||
local pageType = getPageType(title, args, cfg) | |||
if yesno(args.plural, false) then | if yesno(args.plural, false) then | ||
pageType = pluralize(pageType, cfg) | |||
end | end | ||
if yesno(args.caps, false) then | if yesno(args.caps, false) then | ||
pageType = capitalize(pageType) | |||
end | end | ||
return | return pageType | ||
end | end | ||