Module:Documentation: Difference between revisions
check existence of all cfg messages - this should help avoid hard-to-track-down bugs and silent failures if translators make a coding mistake
m>Mr. Stradivarius (set the proper error level for formatMessage, although it looks like it doesn't work because of the upvalues) |
m>Mr. Stradivarius (check existence of all cfg messages - this should help avoid hard-to-track-down bugs and silent failures if translators make a coding mistake) |
||
Line 32: | Line 32: | ||
--]] | --]] | ||
checkType('formatMessage', 1, cfgKey, 'string') | checkType('formatMessage', 1, cfgKey, 'string') | ||
checkType('formatMessage', 2, valArray, 'table') | checkType('formatMessage', 2, valArray, 'table', true) | ||
local msg = cfg[cfgKey] | local msg = cfg[cfgKey] | ||
if msg == nil then | |||
error('formatMessage: no message found for cfg key "' .. cfgKey .. '"', 2) | |||
end | |||
if not valArray then | |||
return msg | |||
end | |||
local function getMessageVal(match) | local function getMessageVal(match) | ||
Line 79: | Line 85: | ||
local function makeInvokeFunc(funcName) | local function makeInvokeFunc(funcName) | ||
return function (frame) | return function (frame) | ||
local headingArg = | local headingArg = formatMessage('headingArg') | ||
local args = getArgs(frame, { | local args = getArgs(frame, { | ||
valueFunc = function (key, value) | valueFunc = function (key, value) | ||
Line 112: | Line 118: | ||
-- so that we don't have to worry about unclosed tags. | -- so that we don't have to worry about unclosed tags. | ||
.tag('div') | .tag('div') | ||
.attr('id', | .attr('id', formatMessage('mainDivId')) | ||
.addClass( | .addClass(formatMessage('mainDivClasses')) | ||
.wikitext(p._startBox(args)) | .wikitext(p._startBox(args)) | ||
.wikitext(p._content(args)) | .wikitext(p._content(args)) | ||
Line 126: | Line 132: | ||
function p.sandboxNotice(args) | function p.sandboxNotice(args) | ||
local sandboxNoticeTemplate = | local sandboxNoticeTemplate = formatMessage('sandboxNoticeTemplate') | ||
if not (sandboxNoticeTemplate and currentTitle.subpageText == | if not (sandboxNoticeTemplate and currentTitle.subpageText == formatMessage('sandboxSubpage')) then | ||
return nil | return nil | ||
end | end | ||
Line 136: | Line 142: | ||
.css('clear', 'both') | .css('clear', 'both') | ||
.done() | .done() | ||
.wikitext(frame:expandTemplate{title = sandboxNoticeTemplate, args = {[ | .wikitext(frame:expandTemplate{title = sandboxNoticeTemplate, args = {[formatMessage('sandboxNoticeLivepageParam')] = args[formatMessage('livepageArg')]}}) | ||
return tostring(notice) | return tostring(notice) | ||
end | end | ||
function p.protectionTemplate() | function p.protectionTemplate() | ||
local protectionTemplate = | local protectionTemplate = formatMessage('protectionTemplate') | ||
if not (protectionTemplate and currentTitle.namespace == 10) then | if not (protectionTemplate and currentTitle.namespace == 10) then | ||
-- Don't display the protection template if we are not in the template namespace. | -- Don't display the protection template if we are not in the template namespace. | ||
Line 158: | Line 164: | ||
if getProtectionLevel('move') == 'sysop' or getProtectionLevel('edit') then | if getProtectionLevel('move') == 'sysop' or getProtectionLevel('edit') then | ||
-- The page is full-move protected, or full, template, or semi-protected. | -- The page is full-move protected, or full, template, or semi-protected. | ||
return frame:expandTemplate{title = protectionTemplate, args = | return frame:expandTemplate{title = protectionTemplate, args = formatMessage('protectionTemplateArgs')} | ||
end | end | ||
return nil | return nil | ||
Line 167: | Line 173: | ||
function p._startBox(args) | function p._startBox(args) | ||
-- Arg processing from {{documentation}}. | -- Arg processing from {{documentation}}. | ||
local preload = args[ | local preload = args[formatMessage('preloadArg')] -- Allow custom preloads. | ||
local heading = args[ | local heading = args[formatMessage('headingArg')] -- Blank values are not removed. | ||
local headingStyle = args[ | local headingStyle = args[formatMessage('headingStyleArg')] | ||
local content = args[ | local content = args[formatMessage('contentArg')] | ||
local docspace = p.docspace() | local docspace = p.docspace() | ||
local docname = args[1] -- Other docname, if fed. | local docname = args[1] -- Other docname, if fed. | ||
Line 182: | Line 188: | ||
local namespace = docspace or currentTitle.nsText | local namespace = docspace or currentTitle.nsText | ||
local pagename = templatePage or currentTitle.text | local pagename = templatePage or currentTitle.text | ||
docpage = namespace .. ':' .. pagename .. '/' .. | docpage = namespace .. ':' .. pagename .. '/' .. formatMessage('docSubpage') | ||
end | end | ||
local docTitle = mw.title.new(docpage) | local docTitle = mw.title.new(docpage) | ||
Line 218: | Line 224: | ||
hspan.wikitext(heading) | hspan.wikitext(heading) | ||
elseif subjectSpace == 10 then -- Template namespace | elseif subjectSpace == 10 then -- Template namespace | ||
hspan.wikitext( | hspan.wikitext(formatMessage('documentationIconWikitext') .. ' ' .. formatMessage('templateNamespaceHeading')) | ||
elseif subjectSpace == 828 then -- Module namespace | elseif subjectSpace == 828 then -- Module namespace | ||
hspan.wikitext( | hspan.wikitext(formatMessage('documentationIconWikitext') .. ' ' .. formatMessage('moduleNamespaceHeading')) | ||
elseif subjectSpace == 6 then -- File namespace | elseif subjectSpace == 6 then -- File namespace | ||
hspan.wikitext( | hspan.wikitext(formatMessage('fileNamespaceHeading')) | ||
else | else | ||
hspan.wikitext( | hspan.wikitext(formatMessage('otherNamespaceHeading')) | ||
end | end | ||
Line 233: | Line 239: | ||
local lspan = sbox.tag('span') -- lspan is short for "link span". | local lspan = sbox.tag('span') -- lspan is short for "link span". | ||
lspan | lspan | ||
.addClass( | .addClass(formatMessage('startBoxLinkclasses')) | ||
.attr('id', | .attr('id', formatMessage('startBoxLinkId')) | ||
if docExist then | if docExist then | ||
local viewLink = makeWikilink(docpage, | local viewLink = makeWikilink(docpage, formatMessage('viewLinkDisplay')) | ||
local editLink = makeUrlLink(docTitle:fullUrl{action = 'edit'}, | local editLink = makeUrlLink(docTitle:fullUrl{action = 'edit'}, formatMessage('editLinkDisplay')) | ||
local historyLink = makeUrlLink(docTitle:fullUrl{action = 'history'}, | local historyLink = makeUrlLink(docTitle:fullUrl{action = 'history'}, formatMessage('historyLinkDisplay')) | ||
local purgeLink = makeUrlLink(currentTitle:fullUrl{action = 'purge'}, | local purgeLink = makeUrlLink(currentTitle:fullUrl{action = 'purge'}, formatMessage('purgeLinkDisplay')) | ||
local text = '[%s] [%s] [%s] [%s]' | local text = '[%s] [%s] [%s] [%s]' | ||
text = text:gsub('%[', '[') -- Replace square brackets with HTML entities. | text = text:gsub('%[', '[') -- Replace square brackets with HTML entities. | ||
Line 247: | Line 253: | ||
if not preload then | if not preload then | ||
if subjectSpace == 6 then -- File namespace | if subjectSpace == 6 then -- File namespace | ||
preload = | preload = formatMessage('fileDocpagePreload') | ||
else | else | ||
preload = | preload = formatMessage('docpagePreload') | ||
end | end | ||
end | end | ||
lspan.wikitext(makeUrlLink(docTitle:fullUrl{action = 'edit', preload = preload}, | lspan.wikitext(makeUrlLink(docTitle:fullUrl{action = 'edit', preload = preload}, formatMessage('createLinkDisplay'))) | ||
end | end | ||
end | end | ||
Line 262: | Line 268: | ||
function p._content(args) | function p._content(args) | ||
local content = args[ | local content = args[formatMessage('contentArg')] | ||
if not content then | if not content then | ||
local docpage = args[1] | local docpage = args[1] | ||
Line 269: | Line 275: | ||
content = frame:preprocess('{{ ' .. docpage .. ' }}') | content = frame:preprocess('{{ ' .. docpage .. ' }}') | ||
else | else | ||
docpage = p.docspace() .. ':' .. p.templatePage() .. '/' .. | docpage = p.docspace() .. ':' .. p.templatePage() .. '/' .. formatMessage('docSubpage') | ||
if mw.title.new(docpage).exists then | if mw.title.new(docpage).exists then | ||
local frame = mw.getCurrentFrame() | local frame = mw.getCurrentFrame() | ||
Line 285: | Line 291: | ||
function p._endBox(args) | function p._endBox(args) | ||
-- Argument processing in {{documentation}}. | -- Argument processing in {{documentation}}. | ||
local content = args[ | local content = args[formatMessage('contentArg')] | ||
local linkBox = args[ | local linkBox = args[formatMessage('linkBoxArg')] -- So "link box=off" works. | ||
local docspace = p.docspace() | local docspace = p.docspace() | ||
local docname = args[1] -- Other docname, if fed. | local docname = args[1] -- Other docname, if fed. | ||
Line 297: | Line 303: | ||
docpage = docname | docpage = docname | ||
else | else | ||
docpage = docpageRoot .. '/' .. | docpage = docpageRoot .. '/' .. formatMessage('docSubpage') | ||
end | end | ||
local docTitle = mw.title.new(docpage) | local docTitle = mw.title.new(docpage) | ||
local docExist = docTitle.exists | local docExist = docTitle.exists | ||
local docnameFed = args[1] and true | local docnameFed = args[1] and true | ||
local sandbox = docpageRoot .. '/' .. | local sandbox = docpageRoot .. '/' .. formatMessage('sandboxSubpage') | ||
local testcases = docpageRoot .. '/' .. | local testcases = docpageRoot .. '/' .. formatMessage('testcasesSubpage') | ||
templatePage = currentTitle.nsText .. ':' .. templatePage | templatePage = currentTitle.nsText .. ':' .. templatePage | ||
Line 310: | Line 316: | ||
-- First, check whether we should output the end box at all. Add the end box by default if the documentation | -- First, check whether we should output the end box at all. Add the end box by default if the documentation | ||
-- exists or if we are in the user, module or template namespaces. | -- exists or if we are in the user, module or template namespaces. | ||
if linkBox == | if linkBox == formatMessage('linkBoxOff') or not (docExist or subjectSpace == 2 or subjectSpace == 828 or subjectSpace == 10) then | ||
return nil | return nil | ||
end | end | ||
Line 316: | Line 322: | ||
-- Assemble the arguments for {{fmbox}}. | -- Assemble the arguments for {{fmbox}}. | ||
local fmargs = {} | local fmargs = {} | ||
fmargs[ | fmargs[formatMessage('fmboxIdParam')] = formatMessage('fmboxId') -- Sets fmargs.id = 'documentation-meta-data' | ||
fmargs[ | fmargs[formatMessage('fmboxImageParam')] = formatMessage('fmboxImageNone') -- Sets fmargs.image = 'none' | ||
fmargs[ | fmargs[formatMessage('fmboxStyleParam')] = formatMessage('fmboxStyle') -- Sets fmargs.style = 'background-color: #ecfcf4' | ||
fmargs[ | fmargs[formatMessage('fmboxTextstyleParam')] = formatMessage('fmboxTextstyle') -- Sets fmargs.textstyle = 'font-style: italic;' | ||
-- Assemble the fmbox text field. | -- Assemble the fmbox text field. | ||
Line 330: | Line 336: | ||
-- /doc exists; link to it. | -- /doc exists; link to it. | ||
local docLink = makeWikilink(docpage) | local docLink = makeWikilink(docpage) | ||
local editLink = makeUrlLink(docTitle:fullUrl{action = 'edit'}, | local editLink = makeUrlLink(docTitle:fullUrl{action = 'edit'}, formatMessage('editLinkDisplay')) | ||
local historyLink = makeUrlLink(docTitle:fullUrl{action = 'history'}, | local historyLink = makeUrlLink(docTitle:fullUrl{action = 'history'}, formatMessage('historyLinkDisplay')) | ||
text = text .. formatMessage('transcludedFromBlurb', {docLink}) .. ' ' .. makeToolbar(editLink, historyLink) .. '<br />' | text = text .. formatMessage('transcludedFromBlurb', {docLink}) .. ' ' .. makeToolbar(editLink, historyLink) .. '<br />' | ||
elseif subjectSpace == 828 then | elseif subjectSpace == 828 then | ||
-- /doc does not exist; ask to create it. | -- /doc does not exist; ask to create it. | ||
local createLink = makeUrlLink(docTitle:fullUrl{action = 'edit', preload = | local createLink = makeUrlLink(docTitle:fullUrl{action = 'edit', preload = formatMessage('modulePreload')}, formatMessage('createLinkDisplay')) | ||
text = text .. formatMessage('createModuleDocBlurb', {createLink}) .. '<br />' | text = text .. formatMessage('createModuleDocBlurb', {createLink}) .. '<br />' | ||
end | end | ||
Line 342: | Line 348: | ||
-- We are in the user, module or template namespaces. | -- We are in the user, module or template namespaces. | ||
local sandboxLinks, testcasesLinks | local sandboxLinks, testcasesLinks | ||
local pagePossessive = subjectSpace == 828 and | local pagePossessive = subjectSpace == 828 and formatMessage('modulePossessive') or formatMessage('templatePossessive') | ||
local sandboxTitle = mw.title.new(sandbox) | local sandboxTitle = mw.title.new(sandbox) | ||
if sandboxTitle.exists then | if sandboxTitle.exists then | ||
local sandboxLink = makeWikilink(sandbox, | local sandboxLink = makeWikilink(sandbox, formatMessage('sandboxLinkDisplay')) | ||
local sandboxEditLink = makeUrlLink(sandboxTitle:fullUrl{action = 'edit'}, | local sandboxEditLink = makeUrlLink(sandboxTitle:fullUrl{action = 'edit'}, formatMessage('sandboxEditLinkDisplay')) | ||
local compareLink = makeUrlLink(mw.title.new('Special:ComparePages'):fullUrl{page1 = templatePage, page2 = sandbox}, | local compareLink = makeUrlLink(mw.title.new('Special:ComparePages'):fullUrl{page1 = templatePage, page2 = sandbox}, formatMessage('compareLinkDisplay')) | ||
sandboxLinks = sandboxLink .. ' ' .. makeToolbar(sandboxEditLink, compareLink) | sandboxLinks = sandboxLink .. ' ' .. makeToolbar(sandboxEditLink, compareLink) | ||
else | else | ||
local sandboxPreload = subjectSpace == 828 and | local sandboxPreload = subjectSpace == 828 and formatMessage('moduleSandboxPreload') or formatMessage('templateSandboxPreload') | ||
local sandboxCreateLink = makeUrlLink(sandboxTitle:fullUrl{action = 'edit', preload = sandboxPreload}, | local sandboxCreateLink = makeUrlLink(sandboxTitle:fullUrl{action = 'edit', preload = sandboxPreload}, formatMessage('sandboxCreateLinkDisplay')) | ||
local mirrorSummary = formatMessage('mirrorEditSummary', {makeWikilink(templatePage)}) | local mirrorSummary = formatMessage('mirrorEditSummary', {makeWikilink(templatePage)}) | ||
local mirrorLink = makeUrlLink(sandboxTitle:fullUrl{action = 'edit', preload = templatePage, summary = mirrorSummary}, | local mirrorLink = makeUrlLink(sandboxTitle:fullUrl{action = 'edit', preload = templatePage, summary = mirrorSummary}, formatMessage('mirrorLinkDisplay')) | ||
sandboxLinks = | sandboxLinks = formatMessage('sandboxLinkDisplay') .. ' ' .. makeToolbar(sandboxCreateLink, mirrorLink) | ||
end | end | ||
local testcaseTitle = mw.title.new(testcases) | local testcaseTitle = mw.title.new(testcases) | ||
if testcaseTitle.exists then | if testcaseTitle.exists then | ||
local testcasesLink = makeWikilink(testcases, | local testcasesLink = makeWikilink(testcases, formatMessage('testcasesLinkDisplay')) | ||
local testcasesEditLink = makeUrlLink(testcaseTitle:fullUrl{action = 'edit'}, | local testcasesEditLink = makeUrlLink(testcaseTitle:fullUrl{action = 'edit'}, formatMessage('testcasesEditLinkDisplay')) | ||
testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink) | testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink) | ||
else | else | ||
local testcasesPreload = subjectSpace == 828 and | local testcasesPreload = subjectSpace == 828 and formatMessage('moduleTestcasesPreload') or formatMessage('templateTestcasesPreload') | ||
local testcasesCreateLink = makeUrlLink(testcaseTitle:fullUrl{action = 'edit', preload = testcasesPreload}, | local testcasesCreateLink = makeUrlLink(testcaseTitle:fullUrl{action = 'edit', preload = testcasesPreload}, formatMessage('testcasesCreateLinkDisplay')) | ||
testcasesLinks = | testcasesLinks = formatMessage('testcasesLinkDisplay') .. ' ' .. makeToolbar(testcasesCreateLink) | ||
end | end | ||
text = text .. formatMessage('experimentBlurb', {pagePossessive, sandboxLinks, testcasesLinks}) .. '<br />' | text = text .. formatMessage('experimentBlurb', {pagePossessive, sandboxLinks, testcasesLinks}) .. '<br />' | ||
-- Show the categories text, but not if "content" fed or "docname fed" since then it is unclear where to add the categories. | -- Show the categories text, but not if "content" fed or "docname fed" since then it is unclear where to add the categories. | ||
if not content and not docnameFed then | if not content and not docnameFed then | ||
local docPathLink = makeWikilink(docpage, | local docPathLink = makeWikilink(docpage, formatMessage('docLinkDisplay')) | ||
text = text .. formatMessage('addCategoriesBlurb', {docPathLink}) | text = text .. formatMessage('addCategoriesBlurb', {docPathLink}) | ||
end | end | ||
Line 376: | Line 382: | ||
local pagetype | local pagetype | ||
if subjectSpace == 10 then | if subjectSpace == 10 then | ||
pagetype = | pagetype = formatMessage('templatePagetype') | ||
elseif subjectSpace == 828 then | elseif subjectSpace == 828 then | ||
pagetype = | pagetype = formatMessage('modulePagetype') | ||
else | else | ||
pagetype = | pagetype = formatMessage('defaultPagetype') | ||
end | end | ||
text = text .. ' ' .. makeWikilink('Special:PrefixIndex/' .. templatePage .. '/', formatMessage('subpagesLinkDisplay', {pagetype})) | text = text .. ' ' .. makeWikilink('Special:PrefixIndex/' .. templatePage .. '/', formatMessage('subpagesLinkDisplay', {pagetype})) | ||
end | end | ||
-- Show the "print" link if it exists. | -- Show the "print" link if it exists. | ||
local printPage = templatePage .. '/' .. | local printPage = templatePage .. '/' .. formatMessage('printSubpage') | ||
local printTitle = mw.title.new(printPage) | local printTitle = mw.title.new(printPage) | ||
if printTitle.exists then | if printTitle.exists then | ||
local printLink = makeWikilink(printPage, | local printLink = makeWikilink(printPage, formatMessage('printLinkDisplay')) | ||
text = text .. '<br />' .. formatMessage('printBlurb', {printLink}) | text = text .. '<br />' .. formatMessage('printBlurb', {printLink}) | ||
.. ( | .. (formatMessage('displayPrintCategory') and makeCategoryLink(formatMessage('printCategory')) or '') | ||
end | end | ||
end | end | ||
Line 404: | Line 410: | ||
local ret = '' | local ret = '' | ||
local subpage = currentTitle.subpageText | local subpage = currentTitle.subpageText | ||
if | if formatMessage('displayStrangeUsageCategory') and (subpage == formatMessage('docSubpage') or subpage == formatMessage('testcasesSubpage')) then | ||
local sort = (currentTitle.namespace == 0 and | local sort = (currentTitle.namespace == 0 and formatMessage('strangeUsageCategoryMainspaceSort') or '') .. currentTitle.prefixedText -- Sort on namespace. | ||
ret = ret .. makeCategoryLink( | ret = ret .. makeCategoryLink(formatMessage('strangeUsageCategory'), sort) | ||
end | end | ||
return ret | return ret | ||
Line 425: | Line 431: | ||
-- Determines the template page. No namespace or interwiki prefixes are included. | -- Determines the template page. No namespace or interwiki prefixes are included. | ||
local subpage = currentTitle.subpageText | local subpage = currentTitle.subpageText | ||
if subpage == | if subpage == formatMessage('sandboxSubpage') or subpage == formatMessage('testcasesSubpage') then | ||
return currentTitle.baseText | return currentTitle.baseText | ||
else | else |