Module:Namespace detect: Difference between revisions
m (1 revision) |
(++) |
||
Line 48: | Line 48: | ||
---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ||
-- | -- Specify variables available to the whole module | ||
local p = {} | local p = {} | ||
local args = {} | |||
-- Get the page object. This will return the page object for the page | -- Get the page object. This will return the page object for the page | ||
-- specified, or nil if there are errors in the title or if the | -- specified, or nil if there are errors in the title or if the | ||
-- expensive function count has been exceeded. | -- expensive function count has been exceeded. | ||
function | local function getPageObject() | ||
-- Get the title object for args.page if it is specified. Otherwise | -- Get the title object for args.page if it is specified. Otherwise | ||
-- get the title object for the current page. | -- get the title object for the current page. | ||
if page then | if args[cfg.page] then | ||
-- Get the page object, passing the function through pcall | -- Get the page object, passing the function through pcall | ||
-- in case we are over the expensive function count limit. | -- in case we are over the expensive function count limit. | ||
local noError, pageObject = pcall(mw.title.new, page) | local noError, pageObject = pcall(mw.title.new, args[cfg.page]) | ||
if not noError then | if not noError then | ||
return nil | return nil | ||
Line 78: | Line 72: | ||
end | end | ||
-- | -- Detects the namespace for a page object. | ||
local function detectNamespace(pageObject) | |||
if pageObject.isTalkPage then | |||
-- Returns the value of cfg.talk or the local "Talk" namespace name. | |||
return cfg.talk or mw.site.namespaces[1].name | |||
else | |||
return pageObject.nsText | |||
function | |||
-- | |||
end | end | ||
end | end | ||
-- Gets the namespace name to compare to the arguments. The returned value | -- Gets the namespace name to compare to the arguments. The returned value | ||
-- is lower-case. | -- is lower-case. | ||
local function getNamespace( | local function getNamespace() | ||
local ret | local ret | ||
if demospace then | if args[cfg.demospace] then | ||
-- Handle "demospace = main" properly. | -- Handle "demospace = main" properly. | ||
if mw.ustring.lower( demospace ) == cfg.main then | if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then | ||
ret = mw.site.namespaces[0].name | ret = mw.site.namespaces[0].name | ||
else | else | ||
ret = demospace | ret = args[cfg.demospace] | ||
end | end | ||
else | else | ||
local pageObject = | local pageObject = getPageObject() | ||
if pageObject then | if pageObject then | ||
ret = detectNamespace( getPageObject() ) | |||
else | else | ||
return nil -- return nil if the page object doesn't exist. | return nil -- return nil if the page object doesn't exist. | ||
Line 190: | Line 106: | ||
-- Compare the namespace found with the parameters that have been | -- Compare the namespace found with the parameters that have been | ||
-- specified, and return content of the appropriate parameter. | -- specified, and return content of the appropriate parameter. | ||
local function compare( | local function compare() | ||
local namespace = getNamespace() | |||
-- | |||
-- First, compare mainspace parameters. | |||
if namespace == mw.site.namespaces[0].name and args[cfg.main] then | |||
return args[cfg.main] | |||
end | |||
-- | -- Next, compare parameters for non-main namespaces. | ||
for nsid, ns in pairs( mw.site.namespaces ) do | |||
for ns | local nsname = mw.ustring.lower( ns.name ) | ||
if | local canonicalName = mw.ustring.lower( ns.canonicalName ) | ||
-- Check | -- Check the namespace, and ignore main namespace values. | ||
-- | if nsid ~= 0 and nsname == namespace then | ||
-- alias names. | -- Check local namespace name. | ||
if args[nsname] then | |||
return args[nsname] | |||
-- Check canonical namespace name. | |||
elseif args[canonicalName] then | |||
return args[canonicalName] | |||
else | |||
-- Check alias names. | |||
for _, alias in ipairs( ns.aliases ) do | |||
local aliasArg = args[ mw.ustring.lower( alias ) ] | |||
if aliasArg then | |||
return aliasArg | |||
end | |||
end | end | ||
end | end | ||
Line 211: | Line 138: | ||
end | end | ||
-- | -- Finally, return parameters for other namespaces. This happens if | ||
-- | -- there was no text specified for the namespace that was detected | ||
-- | -- or if the demospace parameter is not a valid namespace. Note that | ||
-- | -- the parameter for the detected namespace must be completely | ||
-- absent for this to happen, not merely blank. | -- absent for this to happen, not merely blank. | ||
if args[cfg.other] then | if args[cfg.other] then | ||
Line 221: | Line 148: | ||
end | end | ||
-- | -- Process the arguments. | ||
function p.main(frame) | function p.main(frame) | ||
-- If called via #invoke, use the args passed into the invoking | -- If called via #invoke, use the args passed into the invoking | ||
Line 246: | Line 166: | ||
-- Trim whitespace and remove blank arguments for demospace and | -- Trim whitespace and remove blank arguments for demospace and | ||
-- page parameters. | -- page parameters. | ||
for k, v in pairs(origArgs) do | for k, v in pairs(origArgs) do | ||
v = mw.text.trim(v) -- Trim whitespace. | v = mw.text.trim(v) -- Trim whitespace. | ||
Line 258: | Line 177: | ||
end | end | ||
return compare( | return compare() | ||
end | |||
-- Create a wikitable of all possible namespace parameters. | |||
function p.table() | |||
-- Start the wikitable. | |||
local ret = '{| class="wikitable"' | |||
.. '\n|-' | |||
.. '\n! ' .. cfg.wikitableNamespaceHeader | |||
.. '\n! ' .. cfg.wikitableAliasesHeader | |||
-- Generate the row for the main namespace. | |||
ret = ret .. '\n|-' | |||
.. '\n| ' .. cfg.main | |||
.. '\n|' | |||
-- Generate the other wikitable rows. | |||
for nsid, ns in pairs( mw.site.subjectNamespaces ) do | |||
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. | |||
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' | |||
local aliases = {} | |||
if ns.canonicalName ~= ns.name then | |||
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) | |||
end | |||
for _, v in ipairs( ns.aliases ) do | |||
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) | |||
end | |||
ret = ret .. '\n|-' | |||
.. '\n| ' .. name | |||
.. '\n| ' .. table.concat( aliases, ', ' ) | |||
end | |||
end | |||
-- End the wikitable. | |||
ret = ret .. '\n|-' | |||
.. '\n|}' | |||
return ret | |||
end | end | ||
return p | return p |
Revision as of 06:02, 14 October 2013
-- -- -- NAMESPACE DETECT -- -- -- -- This module implements the 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. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- --
-- Configuration data -- -- Language-specific parameter names can be set here. --
local cfg = {}
-- The name for the parameter to display content for the main namespace: cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare: cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases'
-- End configuration data --
-- Specify variables available to the whole module local p = {} local args = {}
-- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end
end
-- Detects the namespace for a page object. local function detectNamespace(pageObject)
if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end
end
-- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace()
local ret if args[cfg.demospace] then -- Handle "demospace = main" properly. if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then ret = mw.site.namespaces[0].name else ret = args[cfg.demospace] end else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been -- specified, and return content of the appropriate parameter. local function compare()
local namespace = getNamespace() -- First, compare mainspace parameters. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, compare parameters for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] -- Check canonical namespace name. elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Finally, return parameters for other namespaces. This happens if -- there was no text specified for the namespace that was detected -- or if the demospace parameter is not a valid namespace. Note that -- the parameter for the detected namespace must be completely -- absent for this to happen, not merely blank. if args[cfg.other] then return args[cfg.other] end
end
-- Process the arguments. function p.main(frame)
-- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and -- page parameters. for k, v in pairs(origArgs) do v = mw.text.trim(v) -- Trim whitespace. if k == cfg.demospace or k == cfg.page then if v ~= then args[k] = v end else args[k] = v end end return compare()
end
-- Create a wikitable of all possible namespace parameters. function p.table()
-- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '' .. mw.ustring.lower( ns.name ) .. '
' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '' .. mw.ustring.lower( ns.canonicalName ) .. '
' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '' .. mw.ustring.lower(v) .. '
' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret
end
return p