Module:Pagetype: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
sahar>Alynnidalar m (1 revision imported) |
m (fix for files and interface messages which do exist but are not stored locally) |
||
| Line 1: | Line 1: | ||
-------------------------------------------------------------------------------- |
-------------------------------------------------------------------------------- |
||
-- -- |
-- -- |
||
| + | -- This meta-module which automatically detects namespaces, and allows -- |
||
| − | -- PAGETYPE -- |
||
| + | -- for a great deal of customisation. It can easily be ported to other -- |
||
| − | -- -- |
||
| − | -- This is a meta-module intended to replace {{pagetype}} and similar -- |
||
| − | -- templates. It automatically detects namespaces, and allows for a -- |
||
| − | -- great deal of customisation. It can easily be ported to other -- |
||
-- wikis by changing the values in the [[Module:Pagetype/config]]. -- |
-- wikis by changing the values in the [[Module:Pagetype/config]]. -- |
||
-- -- |
-- -- |
||
-------------------------------------------------------------------------------- |
-------------------------------------------------------------------------------- |
||
| − | |||
-- Load config. |
-- Load config. |
||
local cfg = mw.loadData('Module:Pagetype/config') |
local cfg = mw.loadData('Module:Pagetype/config') |
||
-- Load required modules. |
-- Load required modules. |
||
| − | local getArgs = require('Module:Arguments').getArgs |
||
local yesno = require('Module:Yesno') |
local yesno = require('Module:Yesno') |
||
| − | local nsDetectModule = require('Module:Namespace detect') |
||
| − | local nsDetect = nsDetectModule._main |
||
| − | local getParamMappings = nsDetectModule.getParamMappings |
||
| − | local getPageObject = nsDetectModule.getPageObject |
||
| − | |||
local p = {} |
local p = {} |
||
| + | -- Look up a namespace argument in the args table. |
||
| − | local function shallowCopy(t) |
||
| + | local function lookUpNamespaceArg(args, key) |
||
| − | -- Makes a shallow copy of a table. |
||
| − | local |
+ | local arg = args[key] |
| + | -- Convert "yes", "1" etc. to true, "no", "0" etc. to false, and leave |
||
| − | for k, v in pairs(t) do |
||
| + | -- other values the same. |
||
| − | ret[k] = v |
||
| + | 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 |
||
| − | return ret |
||
end |
end |
||
| + | -- Get argument keys for a title's namespace |
||
| − | local function checkPagetypeInput(namespace, val) |
||
| + | local function getNamespaceArgKeys(title) |
||
| − | -- Checks to see whether we need the default value for the given namespace, |
||
| + | local nsInfo = mw.site.namespaces[title.namespace] |
||
| − | -- and if so gets it from the pagetypes table. |
||
| + | local customAliases = cfg.customNamespaceAliases[title.namespace] or {} |
||
| − | -- The yesno function returns true/false for "yes", "no", etc., and returns |
||
| + | local keys = {} |
||
| − | -- val for other input. |
||
| + | if nsInfo.name ~= '' then |
||
| − | local ret = yesno(val, val) |
||
| + | table.insert(keys, nsInfo.name) |
||
| − | if ret and type(ret) ~= 'string' then |
||
| − | ret = cfg.pagetypes[namespace] |
||
end |
end |
||
| + | if nsInfo.canonicalName ~= nsInfo.name and nsInfo.canonicalName ~= '' then |
||
| − | return ret |
||
| + | table.insert(keys, nsInfo.canonicalName) |
||
| + | end |
||
| + | 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 getPagetypeFromClass(class, param, aliasTable, default) |
||
| + | local function getNamespaceArg(title, args) |
||
| − | -- Gets the pagetype from a class specified from the first positional |
||
| + | if title.isTalkPage then |
||
| − | -- parameter. |
||
| + | return lookUpNamespaceArg(args, cfg.talk) |
||
| − | param = yesno(param, param) |
||
| + | end |
||
| − | if param ~= false then -- No check if specifically disallowed. |
||
| − | + | for _, key in ipairs(getNamespaceArgKeys(title)) do |
|
| + | local arg = lookUpNamespaceArg(args, mw.ustring.lower(key)) |
||
| − | if class == alias then |
||
| − | + | if arg ~= nil then |
|
| − | + | return arg |
|
| − | else |
||
| − | return default |
||
| − | end |
||
| − | end |
||
end |
end |
||
end |
end |
||
| + | return nil |
||
end |
end |
||
| + | -- Look up a page type specific to the title's namespace |
||
| − | local function getNsDetectValue(args) |
||
| + | local function getExplicitPageType(title) |
||
| − | -- Builds the arguments to pass to [[Module:Namespace detect]] and returns |
||
| + | if title.isTalkPage then |
||
| − | -- the result. |
||
| + | 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) |
||
| − | local ndArgs = {} |
||
| − | local |
+ | local other = lookUpNamespaceArg(args, cfg.other) |
| − | if |
+ | if type(other) == 'string' then |
| + | return other |
||
| − | ndArgs = shallowCopy(cfg.pagetypes) |
||
else |
else |
||
| + | return cfg.otherDefault |
||
| − | local defaultnsArray |
||
| − | if defaultns == cfg.defaultnsExtended then |
||
| − | defaultnsArray = cfg.extendedNamespaces |
||
| − | elseif defaultns == cfg.defaultnsNone then |
||
| − | defaultnsArray = {} |
||
| − | else |
||
| − | defaultnsArray = cfg.defaultNamespaces |
||
| − | end |
||
| − | for _, namespace in ipairs(defaultnsArray) do |
||
| − | ndArgs[namespace] = cfg.pagetypes[namespace] |
||
| − | end |
||
end |
end |
||
| + | end |
||
| + | local function detectRedirects(title, args) |
||
| − | --[[ |
||
| + | local redirect = lookUpNamespaceArg(args, cfg.redirect) |
||
| − | -- Add custom values passed in from the arguments. These overwrite the |
||
| + | if redirect == false then |
||
| − | -- defaults. The possible argument names are fetched from |
||
| + | -- Don't detect redirects if they have been specifically disallowed. |
||
| − | -- Module:Namespace detect automatically in case new namespaces are |
||
| + | return nil |
||
| − | -- added. Although we accept namespace aliases as parameters, we only pass |
||
| + | end |
||
| − | -- the local namespace name as a parameter to Module:Namespace detect. |
||
| + | |||
| − | -- This means that the "image" parameter can overwrite defaults for the |
||
| + | -- Allow custom values for redirects. |
||
| − | -- File: namespace, which wouldn't work if we passed the parameters through |
||
| + | if not title.isRedirect then |
||
| − | -- separately. |
||
| + | return nil |
||
| − | --]] |
||
| + | elseif type(redirect) == 'string' then |
||
| − | local mappings = getParamMappings() |
||
| + | return redirect |
||
| − | for ns, paramAliases in pairs(mappings) do |
||
| + | else |
||
| − | -- Copy the aliases table, as # doesn't work with tables returned from |
||
| + | return cfg.redirectDefault |
||
| − | -- mw.loadData. |
||
| + | end |
||
| − | paramAliases = shallowCopy(paramAliases) |
||
| + | end |
||
| − | local paramName = paramAliases[1] |
||
| + | |||
| − | -- Iterate backwards along the array so that any values for the local |
||
| + | local function capitalize(pageType) |
||
| − | -- namespace names overwrite those for namespace aliases. |
||
| − | + | local first = mw.ustring.sub(pageType, 1, 1) |
|
| + | local rest = mw.ustring.sub(pageType, 2) |
||
| − | local paramAlias = paramAliases[i] |
||
| + | return mw.ustring.upper(first) .. rest |
||
| − | local ndArg = checkPagetypeInput(paramAlias, args[paramAlias]) |
||
| + | end |
||
| − | if ndArg == false then |
||
| + | |||
| − | -- If any arguments are false, convert them to nil to protect |
||
| + | local function pluralize(pageType) |
||
| − | -- against breakage by future changes to |
||
| + | if cfg.irregularPlurals[pageType] then |
||
| − | -- [[Module:Namespace detect]]. |
||
| + | return cfg.irregularPlurals[pageType] |
||
| − | ndArgs[paramName] = nil |
||
| + | else |
||
| − | elseif ndArg then |
||
| + | return pageType .. cfg.plural -- often 's' |
||
| − | ndArgs[paramName] = ndArg |
||
| + | end |
||
| + | end |
||
| + | |||
| + | local function parseContent(title, args, optionsList) |
||
| + | if title.namespace==828 and title.subpageText~='doc' -- don't detect modules |
||
| + | or not title.exists -- can't check unless page exists |
||
| + | then |
||
| + | return nil |
||
| + | end |
||
| + | local content = title:getContent() |
||
| + | if content == nil then |
||
| + | return nil |
||
| + | end |
||
| + | local templates -- lazily evaluated |
||
| + | for _, options in next, optionsList do |
||
| + | local list, parameter, default, articleOnly = unpack(options, 1, 4) |
||
| + | if not articleOnly or title.namespace==0 then -- only check for templates if we should... |
||
| + | local out = lookUpNamespaceArg(args, parameter) |
||
| + | if type(out) == "string" or (out ~= false and default) then -- ...and if we actually have anything to say about them |
||
| + | if not templates then |
||
| + | templates = {} -- do our delayed evaluation now that we are required to |
||
| + | content = require('Module:Wikitext Parsing').PrepareText(content) -- disregard templates which do not have any affect |
||
| + | for template in string.gmatch(content, "{{%s*([^|}]-)%s*[|}]") do |
||
| + | templates[#templates+1] = capitalize(template) |
||
| + | end |
||
| + | end |
||
| + | local wantedTemplates = mw.loadData('Module:Pagetype/' .. list) |
||
| + | local templateFound = false |
||
| + | for _, template in next, templates do |
||
| + | if wantedTemplates[template] then |
||
| + | templateFound = true |
||
| + | break |
||
| + | end |
||
| + | end |
||
| + | if templateFound then |
||
| + | if type(out)=='string' then |
||
| + | return out |
||
| + | elseif out ~= false and default then |
||
| + | return default |
||
| + | end |
||
| + | end |
||
end |
end |
||
end |
end |
||
end |
end |
||
| + | end |
||
| − | -- Check for disambiguation-class and N/A-class pages in mainspace. |
||
| + | |||
| − | if ndArgs.main then |
||
| + | -- Find pages which do not exist |
||
| − | local class = args[1] |
||
| + | local function nonExistent(title, args) |
||
| − | if type(class) == 'string' then |
||
| + | local arg = lookUpNamespaceArg(args, cfg.ne) |
||
| − | -- Put in lower case so e.g. "Dab" and "dab" will both match. |
||
| + | if arg == false then |
||
| − | class = mw.ustring.lower(class) |
||
| + | return nil |
||
| − | end |
||
| + | end |
||
| − | local dab = getPagetypeFromClass( |
||
| + | local exists = false |
||
| − | class, |
||
| + | if title.exists then -- not an article if it does not exist |
||
| − | args[cfg.dab], |
||
| + | exists = true |
||
| − | cfg.dabAliases, |
||
| + | elseif title.namespace==8 and mw.message.new(title.text):exists() then |
||
| − | cfg.dabDefault |
||
| + | exists = true |
||
| − | ) |
||
| + | elseif title.namespace==6 and title.fileExists then |
||
| − | if dab then |
||
| − | + | exists = true |
|
| + | end |
||
| + | if not exists then |
||
| + | if type(arg) == 'string' then |
||
| + | return arg |
||
else |
else |
||
| + | return cfg.naDefault |
||
| − | local na = getPagetypeFromClass( |
||
| − | class, |
||
| − | args[cfg.na], |
||
| − | cfg.naAliases, |
||
| − | cfg.naDefault |
||
| − | ) |
||
| − | if na then |
||
| − | ndArgs.main = na |
||
| − | end |
||
end |
end |
||
end |
end |
||
| + | end |
||
| − | -- If there is no talk value specified, use the corresponding subject |
||
| + | |||
| − | -- namespace for talk pages. |
||
| + | -- Get page types for mainspaces pages with an explicit class specified |
||
| − | if not ndArgs.talk then |
||
| + | local function getMainNamespaceClassPageType(title, args) |
||
| − | ndArgs.subjectns = true |
||
| + | local class = args[1] |
||
| + | if type(class) == 'string' then -- Put in lower case so e.g. "na" and "NA" will both match |
||
| + | class = mw.ustring.lower(class) |
||
end |
end |
||
| + | local arg = lookUpNamespaceArg(args, cfg.na) |
||
| − | -- Add the fallback value. This can also be customised, but it cannot be |
||
| + | if arg == false then -- don't check for this class if it is specifically disallowed |
||
| − | -- disabled. |
||
| + | return nil |
||
| − | local other = args[cfg.other] |
||
| + | end |
||
| − | -- We will ignore true/false/nil results from yesno here, but using it |
||
| + | if cfg.naAliases[class] then |
||
| − | -- anyway for consistency. |
||
| + | if type(arg) == 'string' then |
||
| − | other = yesno(other, other) |
||
| + | return arg |
||
| − | if type(other) == 'string' then |
||
| + | else |
||
| − | ndArgs.other = other |
||
| + | return cfg.naDefault |
||
| + | end |
||
else |
else |
||
| + | return nil |
||
| − | ndArgs.other = cfg.otherDefault |
||
end |
end |
||
| − | -- Allow custom page values. |
||
| − | ndArgs.page = args.page |
||
| − | return nsDetect(ndArgs) |
||
end |
end |
||
| + | -- Get page type specified by an explicit namespace argument. |
||
| − | local function detectRedirects(args) |
||
| + | local function getNamespaceArgPageType(title, args) |
||
| − | local redirect = args[cfg.redirect] |
||
| + | local namespaceArg = getNamespaceArg(title, args) |
||
| − | -- The yesno function returns true/false for "yes", "no", etc., and returns |
||
| + | if namespaceArg == true then |
||
| − | -- redirect for other input. |
||
| + | -- Namespace has been explicitly enabled, so return the default for |
||
| − | redirect = yesno(redirect, redirect) |
||
| + | -- this namespace |
||
| − | if redirect == false then |
||
| + | return getExplicitPageType(title) |
||
| − | -- Detect redirects unless they have been explicitly disallowed with |
||
| + | elseif namespaceArg == false then |
||
| − | -- "redirect=no" or similar. |
||
| + | -- Namespace has been explicitly disabled |
||
| − | return |
||
| + | return getDefaultPageType(args) |
||
| + | elseif namespaceArg then |
||
| + | -- This namespaces uses custom text |
||
| + | return namespaceArg |
||
| + | else |
||
| + | return nil |
||
end |
end |
||
| + | end |
||
| − | local pageObject = getPageObject(args.page) |
||
| + | |||
| − | -- If we are using subject namespaces elsewhere, do so here as well. |
||
| + | |||
| − | if pageObject |
||
| + | -- Get page type not specified or detected by other means |
||
| − | and not yesno(args.talk, true) |
||
| + | local function getOtherPageType(title, args) |
||
| − | and args[cfg.defaultns] ~= cfg.defaultnsAll |
||
| + | -- Whether the title is in the set of default active namespaces which are looked up in cfg.pagetypes. |
||
| − | then |
||
| + | local isInDefaultActiveNamespace = false |
||
| − | pageObject = getPageObject( |
||
| + | local defaultNamespacesKey = args[cfg.defaultns] |
||
| − | pageObject.subjectNsText .. ':' .. pageObject.text |
||
| + | if defaultNamespacesKey == cfg.defaultnsAll then |
||
| − | ) |
||
| + | isInDefaultActiveNamespace = true |
||
| − | end |
||
| + | else |
||
| − | -- Allow custom values for redirects. |
||
| + | local defaultNamespaces |
||
| − | if pageObject and pageObject.isRedirect then |
||
| − | if |
+ | if defaultNamespacesKey == cfg.defaultnsExtended then |
| + | defaultNamespaces = cfg.extendedNamespaces |
||
| − | return redirect |
||
| + | elseif defaultNamespacesKey == cfg.defaultnsNone then |
||
| + | defaultNamespaces = {} |
||
else |
else |
||
| + | defaultNamespaces = cfg.defaultNamespaces |
||
| − | return cfg.redirectDefault |
||
end |
end |
||
| + | isInDefaultActiveNamespace = defaultNamespaces[title.namespace] |
||
| + | end |
||
| + | if isInDefaultActiveNamespace then |
||
| + | return getExplicitPageType(title) |
||
| + | else |
||
| + | return getDefaultPageType(args) |
||
end |
end |
||
end |
end |
||
function p._main(args) |
function p._main(args) |
||
| + | local title |
||
| − | local redirect = detectRedirects(args) |
||
| + | if args.page then |
||
| − | local pagetype = "" |
||
| + | title = mw.title.new(args.page) |
||
| − | if redirect then |
||
| − | pagetype = redirect |
||
else |
else |
||
| + | title = mw.title.getCurrentTitle() |
||
| − | pagetype = getNsDetectValue(args) |
||
end |
end |
||
| + | if title and not yesno(args.talk, true) and args[cfg.defaultns] ~= cfg.defaultnsAll then |
||
| + | title = title.subjectPageTitle |
||
| + | end |
||
| + | local pageType = detectRedirects(title, args) |
||
| + | or nonExistent(title, args) |
||
| + | or parseContent(title, args, { |
||
| + | {'softredirect', cfg.softRedirect, cfg.softRedirectDefault}, |
||
| + | {'setindex', cfg.sia, cfg.siaDefault, true}, |
||
| + | {'disambiguation', cfg.dab, cfg.dabDefault, true}, |
||
| + | {'rfd', cfg.rfd, cfg.rfdDefault}, |
||
| + | }) |
||
| + | or (title.namespace == 0 and getMainNamespaceClassPageType(title, args)) |
||
| + | or getNamespaceArgPageType(title, args) |
||
| + | or getOtherPageType(title, args) |
||
if yesno(args.plural, false) then |
if yesno(args.plural, false) then |
||
| + | pageType = pluralize(pageType) |
||
| − | if cfg.irregularPlurals[pagetype] then |
||
| − | pagetype = cfg.irregularPlurals[pagetype] |
||
| − | else |
||
| − | pagetype = pagetype .. cfg.plural -- often 's' |
||
| − | end |
||
end |
end |
||
if yesno(args.caps, false) then |
if yesno(args.caps, false) then |
||
| + | pageType = capitalize(pageType) |
||
| − | pagetype = mw.ustring.upper(mw.ustring.sub(pagetype, 1, 1)) .. |
||
| − | mw.ustring.sub(pagetype, 2) |
||
end |
end |
||
| − | return |
+ | return pageType |
end |
end |
||
function p.main(frame) |
function p.main(frame) |
||
| − | local args = getArgs(frame) |
+ | local args = require('Module:Arguments').getArgs(frame) |
return p._main(args) |
return p._main(args) |
||
end |
end |
||
Revision as of 11:35, 21 May 2024
Documentation for this module may be created at Module:Pagetype/doc
--------------------------------------------------------------------------------
-- --
-- This meta-module which automatically detects namespaces, and allows --
-- for a great deal of customisation. It can easily be ported to other --
-- wikis by changing the values in the [[Module:Pagetype/config]]. --
-- --
--------------------------------------------------------------------------------
-- Load config.
local cfg = mw.loadData('Module:Pagetype/config')
-- Load required modules.
local yesno = require('Module:Yesno')
local p = {}
-- Look up a namespace argument in the args table.
local function lookUpNamespaceArg(args, key)
local arg = args[key]
-- 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
-- Get argument keys for a title's namespace
local function getNamespaceArgKeys(title)
local nsInfo = mw.site.namespaces[title.namespace]
local customAliases = cfg.customNamespaceAliases[title.namespace] or {}
local keys = {}
if nsInfo.name ~= '' then
table.insert(keys, nsInfo.name)
end
if nsInfo.canonicalName ~= nsInfo.name and nsInfo.canonicalName ~= '' then
table.insert(keys, nsInfo.canonicalName)
end
appendMultiple(keys, nsInfo.aliases)
appendMultiple(keys, customAliases)
return keys
end
-- Get the argument for a title's namespace, if it was specified in the args table.
local function getNamespaceArg(title, args)
if title.isTalkPage then
return lookUpNamespaceArg(args, cfg.talk)
end
for _, key in ipairs(getNamespaceArgKeys(title)) do
local arg = lookUpNamespaceArg(args, mw.ustring.lower(key))
if arg ~= nil then
return arg
end
end
return nil
end
-- Look up a page type specific to the title's namespace
local function getExplicitPageType(title)
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)
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
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
local function pluralize(pageType)
if cfg.irregularPlurals[pageType] then
return cfg.irregularPlurals[pageType]
else
return pageType .. cfg.plural -- often 's'
end
end
local function parseContent(title, args, optionsList)
if title.namespace==828 and title.subpageText~='doc' -- don't detect modules
or not title.exists -- can't check unless page exists
then
return nil
end
local content = title:getContent()
if content == nil then
return nil
end
local templates -- lazily evaluated
for _, options in next, optionsList do
local list, parameter, default, articleOnly = unpack(options, 1, 4)
if not articleOnly or title.namespace==0 then -- only check for templates if we should...
local out = lookUpNamespaceArg(args, parameter)
if type(out) == "string" or (out ~= false and default) then -- ...and if we actually have anything to say about them
if not templates then
templates = {} -- do our delayed evaluation now that we are required to
content = require('Module:Wikitext Parsing').PrepareText(content) -- disregard templates which do not have any affect
for template in string.gmatch(content, "{{%s*([^|}]-)%s*[|}]") do
templates[#templates+1] = capitalize(template)
end
end
local wantedTemplates = mw.loadData('Module:Pagetype/' .. list)
local templateFound = false
for _, template in next, templates do
if wantedTemplates[template] then
templateFound = true
break
end
end
if templateFound then
if type(out)=='string' then
return out
elseif out ~= false and default then
return default
end
end
end
end
end
end
-- Find pages which do not exist
local function nonExistent(title, args)
local arg = lookUpNamespaceArg(args, cfg.ne)
if arg == false then
return nil
end
local exists = false
if title.exists then -- not an article if it does not exist
exists = true
elseif title.namespace==8 and mw.message.new(title.text):exists() then
exists = true
elseif title.namespace==6 and title.fileExists then
exists = true
end
if not exists then
if type(arg) == 'string' then
return arg
else
return cfg.naDefault
end
end
end
-- Get page types for mainspaces pages with an explicit class specified
local function getMainNamespaceClassPageType(title, args)
local class = args[1]
if type(class) == 'string' then -- Put in lower case so e.g. "na" and "NA" will both match
class = mw.ustring.lower(class)
end
local arg = lookUpNamespaceArg(args, cfg.na)
if arg == false then -- don't check for this class if it is specifically disallowed
return nil
end
if cfg.naAliases[class] then
if type(arg) == 'string' then
return arg
else
return cfg.naDefault
end
else
return nil
end
end
-- Get page type specified by an explicit namespace argument.
local function getNamespaceArgPageType(title, args)
local namespaceArg = getNamespaceArg(title, args)
if namespaceArg == true then
-- Namespace has been explicitly enabled, so return the default for
-- this namespace
return getExplicitPageType(title)
elseif namespaceArg == false then
-- Namespace has been explicitly disabled
return getDefaultPageType(args)
elseif namespaceArg then
-- This namespaces uses custom text
return namespaceArg
else
return nil
end
end
-- Get page type not specified or detected by other means
local function getOtherPageType(title, args)
-- Whether the title is in the set of default active namespaces which are looked up in cfg.pagetypes.
local isInDefaultActiveNamespace = false
local defaultNamespacesKey = args[cfg.defaultns]
if defaultNamespacesKey == cfg.defaultnsAll then
isInDefaultActiveNamespace = true
else
local defaultNamespaces
if defaultNamespacesKey == cfg.defaultnsExtended then
defaultNamespaces = cfg.extendedNamespaces
elseif defaultNamespacesKey == cfg.defaultnsNone then
defaultNamespaces = {}
else
defaultNamespaces = cfg.defaultNamespaces
end
isInDefaultActiveNamespace = defaultNamespaces[title.namespace]
end
if isInDefaultActiveNamespace then
return getExplicitPageType(title)
else
return getDefaultPageType(args)
end
end
function p._main(args)
local title
if args.page then
title = mw.title.new(args.page)
else
title = mw.title.getCurrentTitle()
end
if title and not yesno(args.talk, true) and args[cfg.defaultns] ~= cfg.defaultnsAll then
title = title.subjectPageTitle
end
local pageType = detectRedirects(title, args)
or nonExistent(title, args)
or parseContent(title, args, {
{'softredirect', cfg.softRedirect, cfg.softRedirectDefault},
{'setindex', cfg.sia, cfg.siaDefault, true},
{'disambiguation', cfg.dab, cfg.dabDefault, true},
{'rfd', cfg.rfd, cfg.rfdDefault},
})
or (title.namespace == 0 and getMainNamespaceClassPageType(title, args))
or getNamespaceArgPageType(title, args)
or getOtherPageType(title, args)
if yesno(args.plural, false) then
pageType = pluralize(pageType)
end
if yesno(args.caps, false) then
pageType = capitalize(pageType)
end
return pageType
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
return p._main(args)
end
return p