16
edits
m (Undo revision 3151 by Abhidevananda (talk) not having the comment creates more script errors) |
Fred Bauder (talk | contribs) (Reimport and edit replacing Wikipedia and wp with SV) |
||
Line 11: | Line 11: | ||
-- -- | -- -- | ||
---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ||
---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ||
-- Configuration data -- | -- Configuration data -- | ||
-- Language-specific parameter names can be set here. -- | -- Language-specific parameter names can be set here. -- | ||
---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ||
local cfg = {} | local cfg = {} | ||
-- The name for the parameter to display content for the main namespace: | -- The name for the parameter to display content for the main namespace: | ||
cfg.main = 'main' | cfg.main = 'main' | ||
-- The name for the parameter to display content in talk namespaces: | -- The name for the parameter to display content in talk namespaces: | ||
cfg.talk = 'talk' | cfg.talk = 'talk' | ||
-- The name for the parameter to display content for "other" namespaces | -- The name for the parameter to display content for "other" namespaces | ||
-- (namespaces for which parameters have not been specified, or for when | -- (namespaces for which parameters have not been specified, or for when | ||
-- cfg.demospace is set to cfg.other): | -- cfg.demospace is set to cfg.other): | ||
cfg.other = 'other' | cfg.other = 'other' | ||
-- The name for the parameter to set a demonstration namespace: | -- The name for the parameter to set a demonstration namespace: | ||
cfg.demospace = 'demospace' | cfg.demospace = 'demospace' | ||
-- The name for the parameter to set a specific page to compare: | -- The name for the parameter to set a specific page to compare: | ||
cfg.page = 'page' | cfg.page = 'page' | ||
-- The header for the namespace column in the wikitable containing the | -- The header for the namespace column in the wikitable containing the | ||
-- list of possible subject-space parameters. | -- list of possible subject-space parameters. | ||
cfg.wikitableNamespaceHeader = 'Namespace' | cfg.wikitableNamespaceHeader = 'Namespace' | ||
-- The header for the wikitable containing the list of possible | -- The header for the wikitable containing the list of possible | ||
-- subject-space parameters. | -- subject-space parameters. | ||
cfg.wikitableAliasesHeader = 'Aliases' | cfg.wikitableAliasesHeader = 'Aliases' | ||
---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ||
-- End configuration data -- | -- End configuration data -- | ||
---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ||
-- | ---------------------------------------------------------------------- | ||
-- Global functions -- | |||
-- The following functions are global, because we want them -- | |||
-- to be accessible from other Lua modules called using -- | |||
-- require(). -- | |||
---------------------------------------------------------------------- | |||
-- Declare the table of functions to return. | |||
local p = {} | local p = {} | ||
-- 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 p.getPageObject( page ) | |||
-- 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 | if 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, | local noError, pageObject = pcall(mw.title.new, page) | ||
if not noError then | if not noError then | ||
return nil | return nil | ||
Line 71: | Line 77: | ||
end | end | ||
end | end | ||
-- | --[[ Returns a table of how parameter names map to namespace names. | ||
local | The keys are the actual namespace names, in lower case, and the | ||
if | values are the possible parameter names for that namespace, also | ||
-- | in lower case. The table entries are structured like this: | ||
[''] = { | |||
{'main'}, | |||
}, | |||
['SV'] = { | |||
{'SV', 'project' } | |||
} | |||
]] | |||
function p.getParamMappings() | |||
local mappings = {} | |||
mappings[mw.ustring.lower( mw.site.namespaces[0].name )] = { cfg.main } | |||
mappings[cfg.talk] = { cfg.talk } | |||
for nsid, ns in pairs( mw.site.subjectNamespaces ) do | |||
if nsid ~= 0 then -- Exclude main namespace. | |||
local nsname = mw.ustring.lower( ns.name ) | |||
local canonicalName = mw.ustring.lower( ns.canonicalName ) | |||
mappings[nsname] = { nsname } | |||
if canonicalName ~= nsname then | |||
table.insert( mappings[nsname], canonicalName ) | |||
end | |||
for _, alias in ipairs( ns.aliases ) do | |||
table.insert( mappings[nsname], mw.ustring.lower( alias ) ) | |||
end | |||
end | |||
end | |||
return mappings | |||
end | |||
--[[ Create a wikitable of all subject namespace parameters, for documentation | |||
purposes. Talk is excluded, as it should usually be treated separately in | |||
the documentation. | |||
]] | |||
function p.table() | |||
-- Get the parameter mappings. | |||
local mappings = p.getParamMappings() | |||
-- Start the wikitable. | |||
local ret = '{| class="wikitable"' | |||
.. '\n|-' | |||
.. '\n! ' .. cfg.wikitableNamespaceHeader | |||
.. '\n! ' .. cfg.wikitableAliasesHeader | |||
-- Generate the row for the main namespace, as we want this | |||
-- to be first in the list. | |||
ret = ret .. '\n|-' | |||
.. '\n| <code>' .. cfg.main .. '</code>' | |||
.. '\n|' | |||
-- Enclose all parameter names in <code> tags. | |||
for ns, params in pairs( mappings ) do | |||
if ns ~= mw.site.namespaces[0].name then | |||
for i, param in ipairs( params ) do | |||
mappings[ns][i] = '<code>' .. param .. '</code>' | |||
end | |||
end | |||
end | |||
-- Generate the other wikitable rows. | |||
for ns, params in pairs( mappings ) do | |||
if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace. | |||
ret = ret .. '\n|-' | |||
.. '\n| ' .. params[1] | |||
.. '\n| ' .. table.concat( params, ', ', 2 ) | |||
end | |||
end | end | ||
-- End the wikitable. | |||
ret = ret .. '\n|-' | |||
.. '\n|}' | |||
return ret | |||
end | end | ||
---------------------------------------------------------------------- | |||
-- Local functions -- | |||
-- The following are internal functions, which we do not want -- | |||
-- to be accessible from other modules. -- | |||
---------------------------------------------------------------------- | |||
-- 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( page, demospace ) | ||
local ret | local ret | ||
if | if demospace then | ||
-- Handle "demospace = main" properly. | -- Handle "demospace = main" properly. | ||
if mw.ustring.lower( | if mw.ustring.lower( demospace ) == cfg.main then | ||
ret = mw.site.namespaces[0].name | ret = mw.site.namespaces[0].name | ||
else | else | ||
ret = | ret = demospace | ||
end | end | ||
else | else | ||
local pageObject = getPageObject() | local pageObject = p.getPageObject( page ) | ||
if pageObject then | if pageObject then | ||
ret = | if pageObject.isTalkPage then | ||
-- {{namespace detect}} uses the same value for all talk | |||
-- namespaces, so that's what the module should do too. | |||
ret = cfg.talk | |||
else | |||
ret = pageObject.nsText | |||
end | |||
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 103: | Line 187: | ||
return mw.ustring.lower(ret) | return mw.ustring.lower(ret) | ||
end | end | ||
-- 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( args ) | ||
-- Get the namespace to compare the parameters to, and the parameter | |||
-- mapping table. | |||
-- | local namespace = getNamespace( args[cfg.page], args[cfg.demospace] ) | ||
local mappings = p.getParamMappings() | |||
-- Check for any matches in the namespace arguments. The order we check | |||
-- them doesn't matter, as there can only be one match. | |||
-- | for ns, params in pairs( mappings ) do | ||
for | if ns == namespace then | ||
-- Check all aliases for matches. The default local namespace is | |||
-- checked first, as {{namespace detect}} checked these before | |||
-- alias names. | |||
for _, param in ipairs( params ) do | |||
-- Check local namespace | if args[param] then | ||
return args[param] | |||
-- | |||
end | end | ||
end | end | ||
end | end | ||
end | end | ||
-- | -- If there were no matches, return parameters for other namespaces. | ||
-- there was no text specified for the namespace that | -- This happens if there was no text specified for the namespace that | ||
-- or if the demospace parameter is not a valid namespace. | -- was detected or if the demospace parameter is not a valid namespace. | ||
-- the parameter for the detected namespace must be completely | -- 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 147: | Line 220: | ||
end | end | ||
end | end | ||
-- | ---------------------------------------------------------------------- | ||
-- Main function -- | |||
-- This is the function that will be most used. It processes -- | |||
-- the arguments and calls the compare() function. It is -- | |||
-- global, but is put down here as it depends on the other -- | |||
-- local in order for it to work. -- | |||
---------------------------------------------------------------------- | |||
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 163: | Line 243: | ||
origArgs = frame | origArgs = frame | ||
end | end | ||
-- Trim whitespace and remove blank arguments for demospace and | -- Trim whitespace and remove blank arguments for demospace and | ||
-- page parameters. | -- page parameters. | ||
local args = {} | |||
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 176: | Line 257: | ||
end | end | ||
end | end | ||
return compare() | return compare(args) | ||
end | end | ||
return p | return p |
edits