Module:Documentation: Difference between revisions

convert env table to use a metatable so we only process things when we need to; add a grab method and an err function for dealing with errors (main functions need to be converted to use these)
(finish converting existing values to use env table)
(convert env table to use a metatable so we only process things when we need to; add a grab method and an err function for dealing with errors (main functions need to be converted to use these))
Line 73:
return '<small style="font-style: normal;">(' .. table.concat(ret, ' &#124; ') .. ')</small>'
end
 
local function err(msg)
return string.format(
return string.format('<strong class="error">[[Module:Documentation]] error: %s</strong>%s', env) -- If there's an error, env is the error message.
msg,
makeCategoryLink('Documentation template invocations with errors')
)
end
 
----------------------------------------------------------------------------
Line 106 ⟶ 114:
 
function p._main(args)
local env = p.getEnvironment(args)
-- Get environment data, using pcall in case we get any errors.
local success, env = pcall(p.getEnv, args)
if not success then
return string.format('<strong class="error">[[Module:Documentation]] error: %s</strong>', env) -- If there's an error, env is the error message.
end
-- Build the documentation.
local root = htmlBuilder.create()
root
Line 139 ⟶ 142:
----------------------------------------------------------------------------
 
function p.getEnvgetEnvironment(args)
-- Returns a table with information about the environment, including the title to use, the subject namespace, etc.
-- This is called from p._main using pcall in case we get any errors from exceeding the expensive function count
Line 149 ⟶ 152:
-- env.docspace - the name of the namespace the title puts its documentation in.
-- env.templatePage - the name of the template page with no namespace or interwiki prefixes.
local env, envFuncs = {}, {}
 
-- Set up the metatable. If a nil value is called, we call that function in the envFuncs table and memoize it
-- in the env table so we don't have to call any of the functions more than once.
setmetatable(env, {
__index = function (t, key)
local envFunc = envFuncs[key]
if titleArgenvFunc then
local val = envFunc()
env[key] = val
return val
else
return nil
end
end
})
 
-- Get the title.
localfunction envFuncs.title()
local title
local titleArg = args[message('titleArg', 'string')]
if titleArg then
titleif = mw.title.new(titleArg) then
if title not= mw.title then.new(titleArg)
if not successtitle then
error(message('titleArgError', 'string', {titleArg}))
end
else
title = mw.title.getCurrentTitle()
end
return title
else
title = mw.title.getCurrentTitle()
end
env.title = title
 
-- Get the subject namespace number.
function envFuncs.subjectSpace()
local subjectSpace = return mw.site.namespaces[env.title.namespace].subject.id
env.subjectSpace = subjectSpace
end
-- Get the name of the documentation namespace.
localfunction envFuncs.docspace()
if local subjectSpace == 0 or env.subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then
if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then
-- Pages in the Article, File, MediaWiki or Category namespaces must have their
-- /doc, /sandbox and /testcases pages in talk space.
docspace = return mw.site.namespaces[subjectSpace].talk.name
else
else
docspace = return env.title.subjectNsText
end
end
env.docspace = docspace
-- Get the template page with no namespace or interwiki prefixes.
localfunction envFuncs.templatePage()
local subpagetitle = titleenv.subpageTexttitle
local subpage = title.subpageText
if subpage == message('sandboxSubpage', 'string') or subpage == message('testcasesSubpage', 'string') then
templatePage = return title.baseText
else
else
templatePage = return title.text
end
end
 
function env:grab(key)
local success, envval = pcall(p.getEnv,function() return self[key] argsend)
return success, val
end
env.templatePage = templatePage
 
return env