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)
m>Mr. Stradivarius (finish converting existing values to use env table) |
m>Mr. Stradivarius (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: | Line 73: | ||
return '<small style="font-style: normal;">(' .. table.concat(ret, ' | ') .. ')</small>' | return '<small style="font-style: normal;">(' .. table.concat(ret, ' | ') .. ')</small>' | ||
end | end | ||
local function err(msg) | |||
return string.format( | |||
'<strong class="error">[[Module:Documentation]] error: %s</strong>%s', | |||
msg, | |||
makeCategoryLink('Documentation template invocations with errors') | |||
) | |||
end | |||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
Line 106: | Line 114: | ||
function p._main(args) | function p._main(args) | ||
local env = p.getEnvironment(args) | |||
local | |||
local root = htmlBuilder.create() | local root = htmlBuilder.create() | ||
root | root | ||
Line 139: | Line 142: | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
function p. | function p.getEnvironment(args) | ||
-- Returns a table with information about the environment, including the title to use, the subject namespace, etc. | -- 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 | -- This is called from p._main using pcall in case we get any errors from exceeding the expensive function count | ||
Line 149: | Line 152: | ||
-- env.docspace - the name of the namespace the title puts its documentation in. | -- 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. | -- env.templatePage - the name of the template page with no namespace or interwiki prefixes. | ||
local env = {} | 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 envFunc then | |||
local val = envFunc() | |||
env[key] = val | |||
return val | |||
else | |||
return nil | |||
end | |||
end | |||
}) | |||
-- Get the title. | -- Get the title. | ||
local title | function envFuncs.title() | ||
local title | |||
local titleArg = args[message('titleArg', 'string')] | |||
if titleArg then | |||
title = mw.title.new(titleArg) | |||
if not title then | |||
error(message('titleArgError', 'string', {titleArg})) | |||
end | |||
else | |||
title = mw.title.getCurrentTitle() | |||
end | end | ||
return title | |||
title | |||
end | end | ||
-- Get the subject namespace number. | -- Get the subject namespace number. | ||
function envFuncs.subjectSpace() | |||
return mw.site.namespaces[env.title.namespace].subject.id | |||
end | |||
-- Get the name of the documentation namespace. | -- Get the name of the documentation namespace. | ||
local | function envFuncs.docspace() | ||
local subjectSpace = env.subjectSpace | |||
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. | |||
return mw.site.namespaces[subjectSpace].talk.name | |||
else | |||
return env.title.subjectNsText | |||
end | |||
end | end | ||
-- Get the template page with no namespace or interwiki prefixes. | -- Get the template page with no namespace or interwiki prefixes. | ||
local | function envFuncs.templatePage() | ||
local title = env.title | |||
local subpage = title.subpageText | |||
if subpage == message('sandboxSubpage', 'string') or subpage == message('testcasesSubpage', 'string') then | |||
return title.baseText | |||
else | |||
return title.text | |||
end | |||
end | |||
function env:grab(key) | |||
local success, val = pcall(function() return self[key] end) | |||
return success, val | |||
end | end | ||
return env | return env |