Module:Namespace detect

From Wikitia
Revision as of 10:51, 24 June 2013 by wikipedia>Mr. Stradivarius (new function for creating a table of possible input parameters, a couple of portability fixes)
Jump to navigation Jump to search

Lua error in package.lua at line 80: module 'Module:Transclusion_count/data/N' not found.

This module allows you to output different text depending on the namespace that a given page is in. It is a Lua implementation of the {{namespace detect}} template, with a few improvements: all namespaces and all namespace aliases are supported, and namespace names are detected automatically for the local wiki.


{{#invoke: Namespace detect | main
| page              = <!-- page to detect namespace for, if not the current page -->
| main              = <!-- text to return for the main namespace -->
| talk              = <!-- text to return for talk namespaces -->

<!-- text to return for specific subject namespaces -->
| portal            = 
| category          = 
| user 	            = 
| wikipedia         = 
| education program = 
| mediawiki         = 
| book              = 
| timedtext         = 
| template          = 
| special           = 
| media             = 
| file              = 
| image             = 
| help 	            = 
| module            = 

| other             = <!-- text to return for unspecified namespaces -->
| demospace         = <!-- namespace to display text for -->

| subjectns         = <!-- set to "yes" to treat talk pages as the corresponding subject page -->


  • main - text to return if the page is in the main namespace.
  • talk - text to return if the page is in a talk namespace. This can be any talk namespace - it will match any of "Talk:", "Wikipedia talk:", "User talk:", etc.
  • Subject namespace parameters, e.g. wikipedia, user, file... - the text to return if the page is in the corresponding namespace. This module accepts all subject namespaces as parameters, including namespace aliases and virtual namespaces. See below for a list of supported values.
  • other - text to return if no parameters for the page's namespace were specified. This text is also returned if |demospace= is set to an invalid namespace value.
  • subjectns - if on a talk page, use the corresponding subject page. Can be set with values of "yes", "y", "true" or "1".
  • demopage - specifies a page to detect the namespace of. If not specified, and if the |demospace= parameter is not set, then the module uses the current page.
  • demospace - force the module to behave as if the page was in the specified namespace. Often used for demonstrations.

Namespace parameters

Possible values for subject namespace parameters are as follows:

Namespace Aliases
gadget definition
file image

Table function

Use the following to display a table with the different possible namespace parameters:

{{#invoke:Namespace detect|table|talk=yes}}

To include the parameter for talk namespaces, use |talk=yes.

Porting to different wikis

This module is designed to be portable. To use it on a different wiki, all you need to do is to change the values in Module:Namespace detect/config. Instructions are available on that page.

Technical details

The module uses a data page at Module:Namespace detect/data. This page is loaded with mw.loadData, which means it is processed once per page rather than once per #invoke. This was done for performance reasons.

--                                                                  --
--                        NAMESPACE DETECT                          --
--                                                                  --
--      This module implements the {{namespace detect}} 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: = '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: = '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 if it is specified. Otherwise
    -- get the title object for the current page.
    if args[] then
        -- Get the page object, passing the function through pcall 
        -- in case we are over the expensive function count limit.
        local noError, pageObject = pcall(, args[])
        if not noError then
            return nil
            return pageObject
        return mw.title.getCurrentTitle()

-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
    if pageObject.isTalkPage then
        -- Returns the value of or the local "Talk" namespace name. 
        return or[1].name
        return pageObject.nsText

-- 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
        ret =  args[cfg.demospace]
        local pageObject = getPageObject()
        if pageObject then
            ret = detectNamespace( getPageObject() )
            return nil -- return nil if the page object doesn't exist.
    return mw.ustring.lower(ret)

-- Compare the namespace found with the parameters that have been
-- specified, and return the appropriate parameter.
local function compare()
    local namespace = getNamespace()
    -- First, return arguments for mainspace.
    if namespace ==[0].name and args[cfg.main] then
        return args[cfg.main]
    -- Next, return arguments for non-main namespaces.
    for nsid, ns in pairs( ) do
        local nsname = mw.ustring.lower( )
        -- Check the namespace, and ignore main namespace values.
        if nsid ~= 0 and nsname == namespace then
            if args[nsname] then
                return args[nsname]
                -- Check alias names.
                for _, alias in ipairs( ns.aliases ) do
                    local aliasArg = args[ mw.ustring.lower( alias ) ]
                    if aliasArg then
                        return aliasArg
    -- Then, return arguments for other namespaces, if the main
    -- namespace wasn't specified, or if the demospace parameter
    -- is set to "other".
    if args[cfg.other] then
        return args[cfg.other]

-- Process the arguments.
function p.main(frame)
    -- If called via #invoke, use the args passed into the invoking template.
    -- Otherwise, for testing purposes, 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
        origArgs = frame
    -- Remove blank arguments.
    for k, v in pairs(origArgs) do
        if v ~= '' then
            args[k] = v
    return compare()

-- 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( ) do
        if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
            local name = '<code>' .. mw.ustring.lower( ) .. '</code>'
            local aliases = {}
            for _, v in ipairs( ns.aliases ) do
                table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
            ret = ret .. '\n|-'
                .. '\n| ' .. name
                .. '\n| ' .. table.concat( aliases, ', ' )
    -- End the wikitable.
    ret = ret .. '\n|-'
        .. '\n|}'
    return ret

return p