Module:Documentation: Difference between revisions
Content added Content deleted
(set the proper error level for formatMessage, although it looks like it doesn't work because of the upvalues) |
(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 |