行 7: |
行 7: |
| -- Get the config table. | | -- Get the config table. |
| local cfg = mw.loadData('Module:Documentation/config') | | local cfg = mw.loadData('Module:Documentation/config') |
− | local i18n = mw.loadData('Module:Documentation/i18n')
| + | |
| local p = {} | | local p = {} |
| | | |
行 33: |
行 33: |
| expectType = expectType or 'string' | | expectType = expectType or 'string' |
| if type(msg) ~= expectType then | | if type(msg) ~= expectType then |
− | error(require('Module:TNT').format('I18n/Documentation', 'cfg-error-msg-type', cfgKey, expectType, type(msg)), 2) | + | error('message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type(msg) .. ')', 2) |
| end | | end |
| if not valArray then | | if not valArray then |
行 41: |
行 41: |
| local function getMessageVal(match) | | local function getMessageVal(match) |
| match = tonumber(match) | | match = tonumber(match) |
− | return valArray[match] or error(require('Module:TNT').format('I18n/Documentation', 'cfg-error-msg-empty', '$' .. match, cfgKey), 4) | + | return valArray[match] or error('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4) |
| end | | end |
| | | |
行 112: |
行 112: |
| | | |
| ---------------------------------------------------------------------------- | | ---------------------------------------------------------------------------- |
− | -- Load TemplateStyles | + | -- Entry points |
| ---------------------------------------------------------------------------- | | ---------------------------------------------------------------------------- |
| | | |
− | p.main = function(frame) | + | function p.nonexistent(frame) |
− | local parent = frame.getParent(frame) | + | if mw.title.getCurrentTitle().subpageText == 'testcases' then |
− | local output = p._main(parent.args)
| + | return frame:expandTemplate{title = 'module test cases notice'} |
− | return frame:extensionTag{ name='templatestyles', args = { src= message('templatestyles-scr') } } .. frame:preprocess(output)
| + | else |
| + | return p.main(frame) |
| + | end |
| end | | end |
| | | |
行 124: |
行 126: |
| -- Main function | | -- Main function |
| ---------------------------------------------------------------------------- | | ---------------------------------------------------------------------------- |
| + | |
| + | p.main = makeInvokeFunc('_main') |
| | | |
| function p._main(args) | | function p._main(args) |
行 137: |
行 141: |
| local root = mw.html.create() | | local root = mw.html.create() |
| root | | root |
| + | :wikitext(p._getModuleWikitext(args, env)) |
| :wikitext(p.protectionTemplate(env)) | | :wikitext(p.protectionTemplate(env)) |
| :wikitext(p.sandboxNotice(args, env)) | | :wikitext(p.sandboxNotice(args, env)) |
行 143: |
行 148: |
| :tag('div') | | :tag('div') |
| :attr('id', message('main-div-id')) | | :attr('id', message('main-div-id')) |
− | :addClass(message('main-div-class')) | + | :addClass(message('main-div-classes')) |
| + | :newline() |
| :wikitext(p._startBox(args, env)) | | :wikitext(p._startBox(args, env)) |
| :wikitext(p._content(args, env)) | | :wikitext(p._content(args, env)) |
| + | :tag('div') |
| + | :css('clear', 'both') -- So right or left floating items don't stick out of the doc box. |
| + | :newline() |
| + | :done() |
| :done() | | :done() |
| :wikitext(p._endBox(args, env)) | | :wikitext(p._endBox(args, env)) |
行 326: |
行 336: |
| -- Auxiliary templates | | -- Auxiliary templates |
| ---------------------------------------------------------------------------- | | ---------------------------------------------------------------------------- |
| + | p.getModuleWikitext = makeInvokeFunc('_getModuleWikitext') |
| + | |
| + | function p._getModuleWikitext(args, env) |
| + | local currentTitle = mw.title.getCurrentTitle() |
| + | if currentTitle.contentModel ~= 'Scribunto' then return end |
| + | pcall(require, currentTitle.prefixedText) -- if it fails, we don't care |
| + | local moduleWikitext = package.loaded["Module:Module wikitext"] |
| + | if moduleWikitext then |
| + | return moduleWikitext.main() |
| + | end |
| + | return '' |
| + | end |
| + | |
| | | |
| function p.sandboxNotice(args, env) | | function p.sandboxNotice(args, env) |
行 337: |
行 360: |
| -- 'sandbox-notice-blurb' --> 'This is the $1 for $2.' | | -- 'sandbox-notice-blurb' --> 'This is the $1 for $2.' |
| -- 'sandbox-notice-diff-blurb' --> 'This is the $1 for $2 ($3).' | | -- 'sandbox-notice-diff-blurb' --> 'This is the $1 for $2 ($3).' |
− | -- 'sandbox-notice-pagetype-template' --> '[[w:Wikipedia:Template test cases|template sandbox]] page' | + | -- 'sandbox-notice-pagetype-template' --> '[[Wikipedia:Template test cases|template sandbox]] page' |
− | -- 'sandbox-notice-pagetype-module' --> '[[w:Wikipedia:Template test cases|module sandbox]] page' | + | -- 'sandbox-notice-pagetype-module' --> '[[Wikipedia:Template test cases|module sandbox]] page' |
| -- 'sandbox-notice-pagetype-other' --> 'sandbox page' | | -- 'sandbox-notice-pagetype-other' --> 'sandbox page' |
| -- 'sandbox-notice-compare-link-display' --> 'diff' | | -- 'sandbox-notice-compare-link-display' --> 'diff' |
行 358: |
行 381: |
| -- "This is the template sandbox for [[Template:Foo]] (diff)." | | -- "This is the template sandbox for [[Template:Foo]] (diff)." |
| local text = '' | | local text = '' |
− | local frame = mw.getCurrentFrame()
| |
− | local isPreviewing = frame:preprocess('{{REVISIONID}}') == '' -- True if the page is being previewed.
| |
| local pagetype | | local pagetype |
| if subjectSpace == 10 then | | if subjectSpace == 10 then |
行 367: |
行 388: |
| else | | else |
| pagetype = message('sandbox-notice-pagetype-other') | | pagetype = message('sandbox-notice-pagetype-other') |
| + | end |
| + | local pagetypee |
| + | if subjectSpace == 10 then |
| + | pagetypee = message('template-pagetype') |
| + | elseif subjectSpace == 828 then |
| + | pagetypee = message('module-pagetype') |
| + | else |
| + | pagetypee = message('default-pagetype')--message 'other-pagetype' 不存在 |
| end | | end |
| local templateLink = makeWikilink(templateTitle.prefixedText) | | local templateLink = makeWikilink(templateTitle.prefixedText) |
| local compareUrl = env.compareUrl | | local compareUrl = env.compareUrl |
− | if isPreviewing or not compareUrl then | + | if compareUrl then |
− | text = text .. message('sandbox-notice-blurb', {pagetype, templateLink})
| |
− | else
| |
| local compareDisplay = message('sandbox-notice-compare-link-display') | | local compareDisplay = message('sandbox-notice-compare-link-display') |
| local compareLink = makeUrlLink(compareUrl, compareDisplay) | | local compareLink = makeUrlLink(compareUrl, compareDisplay) |
| text = text .. message('sandbox-notice-diff-blurb', {pagetype, templateLink, compareLink}) | | text = text .. message('sandbox-notice-diff-blurb', {pagetype, templateLink, compareLink}) |
| + | else |
| + | text = text .. message('sandbox-notice-blurb', {pagetype, templateLink}) |
| end | | end |
| -- Get the test cases page blurb if the page exists. This is something like | | -- Get the test cases page blurb if the page exists. This is something like |
行 381: |
行 410: |
| local testcasesTitle = env.testcasesTitle | | local testcasesTitle = env.testcasesTitle |
| if testcasesTitle and testcasesTitle.exists then | | if testcasesTitle and testcasesTitle.exists then |
− | if testcasesTitle.contentModel == "Scribunto" then | + | if testcasesTitle.namespace == mw.site.namespaces.Module.id then |
| local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display') | | local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display') |
| local testcasesRunLinkDisplay = message('sandbox-notice-testcases-run-link-display') | | local testcasesRunLinkDisplay = message('sandbox-notice-testcases-run-link-display') |
| local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay) | | local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay) |
| local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay) | | local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay) |
− | text = text .. '<br />' .. message('sandbox-notice-testcases-run-blurb', {testcasesLink, testcasesRunLink}) | + | text = text .. '<br /><small>' .. message('sandbox-notice-testcases-run-blurb', {pagetypee, testcasesLink, testcasesRunLink}) .. '</small>' |
| else | | else |
| local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display') | | local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display') |
| local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay) | | local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay) |
− | text = text .. '<br />' .. message('sandbox-notice-testcases-blurb', {testcasesLink}) | + | text = text .. '<br /><small>' .. message('sandbox-notice-testcases-blurb', {pagetypee, testcasesLink}) .. '</small>' |
| end | | end |
| end | | end |
行 396: |
行 425: |
| text = text .. makeCategoryLink(message('sandbox-category')) | | text = text .. makeCategoryLink(message('sandbox-category')) |
| omargs.text = text | | omargs.text = text |
− | omargs.class = message('sandbox-class')
| |
| local ret = '<div style="clear: both;"></div>' | | local ret = '<div style="clear: both;"></div>' |
| ret = ret .. messageBox.main('ombox', omargs) | | ret = ret .. messageBox.main('ombox', omargs) |
行 408: |
行 436: |
| -- 'protection-template' --> 'pp-template' | | -- 'protection-template' --> 'pp-template' |
| -- 'protection-template-args' --> {docusage = 'yes'} | | -- 'protection-template-args' --> {docusage = 'yes'} |
| + | local protectionLevels, mProtectionBanner |
| local title = env.title | | local title = env.title |
− | local protectionLevels
| |
− | local protectionTemplate = message('protection-template')
| |
− | local namespace = title.namespace
| |
− | if not (protectionTemplate and (namespace == 10 or namespace == 828)) then
| |
− | -- Don't display the protection template if we are not in the template or module namespaces.
| |
− | return nil
| |
− | end
| |
| protectionLevels = env.protectionLevels | | protectionLevels = env.protectionLevels |
| if not protectionLevels then | | if not protectionLevels then |
| return nil | | return nil |
| end | | end |
− | local editLevels = protectionLevels.edit | + | local editProt = protectionLevels.edit and protectionLevels.edit[1] |
− | local moveLevels = protectionLevels.move | + | local moveProt = protectionLevels.move and protectionLevels.move[1] |
− | if moveLevels and moveLevels[1] == 'sysop' or editLevels and editLevels[1] then
| + | if editProt then |
− | -- The page is full-move protected, or full, template, or semi-protected. | + | -- The page is edit-protected. |
− | local frame = mw.getCurrentFrame() | + | mProtectionBanner = require('Module:Protection banner') |
− | return frame:expandTemplate{title = protectionTemplate, args = message('protection-template-args', nil, 'table')} | + | local reason = message('protection-reason-edit') |
| + | return mProtectionBanner._main{reason, small = true} |
| + | elseif moveProt and moveProt ~= 'autoconfirmed' then |
| + | -- The page is move-protected but not edit-protected. Exclude move |
| + | -- protection with the level "autoconfirmed", as this is equivalent to |
| + | -- no move protection at all. |
| + | mProtectionBanner = require('Module:Protection banner') |
| + | return mProtectionBanner._main{action = 'move', small = true} |
| else | | else |
| return nil | | return nil |
行 488: |
行 517: |
| if not title or not docTitle then | | if not title or not docTitle then |
| return nil | | return nil |
− | end
| |
− | if docTitle.isRedirect then
| |
− | docTitle = docTitle.redirectTarget
| |
| end | | end |
| | | |
行 497: |
行 523: |
| data.docTitle = docTitle | | data.docTitle = docTitle |
| -- View, display, edit, and purge links if /doc exists. | | -- View, display, edit, and purge links if /doc exists. |
− | data.viewLinkDisplay = i18n['view-link-display'] | + | data.viewLinkDisplay = message('view-link-display') |
− | data.editLinkDisplay = i18n['edit-link-display'] | + | data.editLinkDisplay = message('edit-link-display') |
− | data.historyLinkDisplay = i18n['history-link-display'] | + | data.historyLinkDisplay = message('history-link-display') |
− | data.purgeLinkDisplay = i18n['purge-link-display'] | + | data.purgeLinkDisplay = message('purge-link-display') |
| -- Create link if /doc doesn't exist. | | -- Create link if /doc doesn't exist. |
| local preload = args.preload | | local preload = args.preload |
行 513: |
行 539: |
| end | | end |
| data.preload = preload | | data.preload = preload |
− | data.createLinkDisplay = i18n['create-link-display'] | + | data.createLinkDisplay = message('create-link-display') |
| return data | | return data |
| end | | end |
行 558: |
行 584: |
| -- | | -- |
| -- Messages: | | -- Messages: |
− | -- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=Documentation icon]]' | + | -- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]' |
| -- 'template-namespace-heading' --> 'Template documentation' | | -- 'template-namespace-heading' --> 'Template documentation' |
| -- 'module-namespace-heading' --> 'Module documentation' | | -- 'module-namespace-heading' --> 'Module documentation' |
行 584: |
行 610: |
| data.heading = heading | | data.heading = heading |
| elseif subjectSpace == 10 then -- Template namespace | | elseif subjectSpace == 10 then -- Template namespace |
− | data.heading = i18n['template-namespace-heading'] | + | data.heading = message('documentation-icon-wikitext') .. ' ' .. message('template-namespace-heading') |
| elseif subjectSpace == 828 then -- Module namespace | | elseif subjectSpace == 828 then -- Module namespace |
− | data.heading = i18n['module-namespace-heading'] | + | data.heading = message('documentation-icon-wikitext') .. ' ' .. message('module-namespace-heading') |
| elseif subjectSpace == 6 then -- File namespace | | elseif subjectSpace == 6 then -- File namespace |
− | data.heading = i18n['file-namespace-heading'] | + | data.heading = message('file-namespace-heading') |
| else | | else |
− | data.heading = i18n['other-namespaces-heading'] | + | data.heading = message('other-namespaces-heading') |
| + | end |
| + | |
| + | -- Heading CSS |
| + | local headingStyle = args['heading-style'] |
| + | if headingStyle then |
| + | data.headingStyleText = headingStyle |
| + | elseif subjectSpace == 10 then |
| + | -- We are in the template or template talk namespaces. |
| + | data.headingFontWeight = 'bold' |
| + | data.headingFontSize = '125%' |
| + | else |
| + | data.headingFontSize = '150%' |
| end | | end |
| | | |
行 608: |
行 646: |
| local sbox = mw.html.create('div') | | local sbox = mw.html.create('div') |
| sbox | | sbox |
− | :addClass(message('header-div-class')) | + | :css('padding-bottom', '3px') |
− | :tag('div') | + | :css('border-bottom', '1px solid #aaa') |
− | :addClass(message('heading-div-class')) | + | :css('margin-bottom', '1ex') |
| + | :newline() |
| + | :tag('span') |
| + | :cssText(data.headingStyleText) |
| + | :css('font-weight', data.headingFontWeight) |
| + | :css('font-size', data.headingFontSize) |
| :wikitext(data.heading) | | :wikitext(data.heading) |
| local links = data.links | | local links = data.links |
| if links then | | if links then |
− | sbox | + | sbox:tag('span') |
− | :tag('div')
| + | :addClass(data.linksClass) |
− | :addClass(data.linksClass)
| + | :attr('id', data.linksId) |
− | :attr('id', data.linksId)
| + | :wikitext(links) |
− | :wikitext(links)
| |
| end | | end |
| return tostring(sbox) | | return tostring(sbox) |
行 641: |
行 683: |
| -- The line breaks below are necessary so that "=== Headings ===" at the start and end | | -- The line breaks below are necessary so that "=== Headings ===" at the start and end |
| -- of docs are interpreted correctly. | | -- of docs are interpreted correctly. |
− | local cbox = mw.html.create('div') | + | return '\n' .. (content or '') .. '\n' |
− | cbox
| |
− | :addClass(message('content-div-class'))
| |
− | :wikitext('\n' .. (content or '') .. '\n')
| |
− | return tostring(cbox)
| |
| end | | end |
| | | |
行 671: |
行 709: |
| -- @args - a table of arguments passed by the user | | -- @args - a table of arguments passed by the user |
| -- @env - environment table containing title objects, etc., generated with p.getEnvironment | | -- @env - environment table containing title objects, etc., generated with p.getEnvironment |
| + | -- |
| + | -- Messages: |
| + | -- 'fmbox-id' --> 'documentation-meta-data' |
| + | -- 'fmbox-style' --> 'background-color: #ecfcf4' |
| + | -- 'fmbox-textstyle' --> 'font-style: italic' |
| + | -- |
| + | -- The HTML is generated by the {{fmbox}} template, courtesy of [[Module:Message box]]. |
| --]=] | | --]=] |
| | | |
行 696: |
行 741: |
| end | | end |
| | | |
− | -- Assemble the footer text field. | + | -- Assemble the arguments for {{fmbox}}. |
| + | local fmargs = {} |
| + | fmargs.id = message('fmbox-id') -- Sets 'documentation-meta-data' |
| + | fmargs.image = 'none' |
| + | fmargs.style = message('fmbox-style') -- Sets 'background-color: #ecfcf4' |
| + | fmargs.textstyle = message('fmbox-textstyle') -- 'font-style: italic;' |
| + | |
| + | -- Assemble the fmbox text field. |
| local text = '' | | local text = '' |
| if linkBox then | | if linkBox then |
行 714: |
行 766: |
| text = text .. (p.makeCategoriesBlurb(args, env) or '') | | text = text .. (p.makeCategoriesBlurb(args, env) or '') |
| end | | end |
− | text = text .. ' ' .. (p.makeSubpagesBlurb(args, env) or '') --"Subpages of this template" | + | text = text .. (p.makeSubpagesBlurb(args, env) or '') --"Subpages of this template" |
| local printBlurb = p.makePrintBlurb(args, env) -- Two-line blurb about print versions of templates. | | local printBlurb = p.makePrintBlurb(args, env) -- Two-line blurb about print versions of templates. |
| if printBlurb then | | if printBlurb then |
行 721: |
行 773: |
| end | | end |
| end | | end |
| + | fmargs.text = text |
| | | |
− | local ebox = mw.html.create('div') | + | return messageBox.main('fmbox', fmargs) |
− | ebox
| |
− | :addClass(message('footer-div-class'))
| |
− | :wikitext(text)
| |
− | return tostring(ebox)
| |
| end | | end |
| | | |
行 739: |
行 788: |
| -- 'history-link-display' --> 'history' | | -- 'history-link-display' --> 'history' |
| -- 'transcluded-from-blurb' --> | | -- 'transcluded-from-blurb' --> |
− | -- 'The above [[w:Wikipedia:Template documentation|documentation]] | + | -- 'The above [[Wikipedia:Template documentation|documentation]] |
− | -- is [[w:Wikipedia:Transclusion|transcluded]] from $1.' | + | -- is [[Wikipedia:Transclusion|transcluded]] from $1.' |
| -- 'module-preload' --> 'Template:Documentation/preload-module-doc' | | -- 'module-preload' --> 'Template:Documentation/preload-module-doc' |
| -- 'create-link-display' --> 'create' | | -- 'create-link-display' --> 'create' |
| -- 'create-module-doc-blurb' --> | | -- 'create-module-doc-blurb' --> |
− | -- 'You might want to $1 a documentation page for this [[w:Wikipedia:Lua|Scribunto module]].' | + | -- 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].' |
| --]=] | | --]=] |
| local docTitle = env.docTitle | | local docTitle = env.docTitle |
− | if not docTitle or args.content then | + | if not docTitle then |
| return nil | | return nil |
| end | | end |
行 755: |
行 804: |
| local docLink = makeWikilink(docTitle.prefixedText) | | local docLink = makeWikilink(docTitle.prefixedText) |
| local editUrl = docTitle:fullUrl{action = 'edit'} | | local editUrl = docTitle:fullUrl{action = 'edit'} |
− | local editDisplay = i18n['edit-link-display'] | + | local editDisplay = message('edit-link-display') |
| local editLink = makeUrlLink(editUrl, editDisplay) | | local editLink = makeUrlLink(editUrl, editDisplay) |
| local historyUrl = docTitle:fullUrl{action = 'history'} | | local historyUrl = docTitle:fullUrl{action = 'history'} |
− | local historyDisplay = i18n['history-link-display'] | + | local historyDisplay = message('history-link-display') |
| local historyLink = makeUrlLink(historyUrl, historyDisplay) | | local historyLink = makeUrlLink(historyUrl, historyDisplay) |
| ret = message('transcluded-from-blurb', {docLink}) | | ret = message('transcluded-from-blurb', {docLink}) |
行 767: |
行 816: |
| -- /doc does not exist; ask to create it. | | -- /doc does not exist; ask to create it. |
| local createUrl = docTitle:fullUrl{action = 'edit', preload = message('module-preload')} | | local createUrl = docTitle:fullUrl{action = 'edit', preload = message('module-preload')} |
− | local createDisplay = i18n['create-link-display'] | + | local createDisplay = message('create-link-display') |
| local createLink = makeUrlLink(createUrl, createDisplay) | | local createLink = makeUrlLink(createUrl, createDisplay) |
| ret = message('create-module-doc-blurb', {createLink}) | | ret = message('create-module-doc-blurb', {createLink}) |
行 840: |
行 889: |
| local mirrorPreload = message('mirror-link-preload') | | local mirrorPreload = message('mirror-link-preload') |
| local mirrorUrl = sandboxTitle:fullUrl{action = 'edit', preload = mirrorPreload, summary = mirrorSummary} | | local mirrorUrl = sandboxTitle:fullUrl{action = 'edit', preload = mirrorPreload, summary = mirrorSummary} |
| + | if subjectSpace == 828 then |
| + | mirrorUrl = sandboxTitle:fullUrl{action = 'edit', preload = templateTitle.prefixedText, summary = mirrorSummary} |
| + | end |
| local mirrorDisplay = message('mirror-link-display') | | local mirrorDisplay = message('mirror-link-display') |
| local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay) | | local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay) |
行 851: |
行 903: |
| local testcasesEditDisplay = message('testcases-edit-link-display') | | local testcasesEditDisplay = message('testcases-edit-link-display') |
| local testcasesEditLink = makeUrlLink(testcasesEditUrl, testcasesEditDisplay) | | local testcasesEditLink = makeUrlLink(testcasesEditUrl, testcasesEditDisplay) |
− | testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink) | + | -- for Modules, add testcases run link if exists |
| + | if subjectSpace == 828 and testcasesTitle.talkPageTitle and testcasesTitle.talkPageTitle.exists then |
| + | local testcasesRunLinkDisplay = message('testcases-run-link-display') |
| + | local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay) |
| + | testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink, testcasesRunLink) |
| + | else |
| + | testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink) |
| + | end |
| else | | else |
| local testcasesPreload | | local testcasesPreload |