| 行 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('message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type(msg) .. ')', 2) | + | error(require('Module:TNT').format('I18n/Documentation', 'cfg-error-msg-type', cfgKey, expectType, 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('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4) | + | return valArray[match] or error(require('Module:TNT').format('I18n/Documentation', 'cfg-error-msg-empty', '$' .. match, cfgKey), 4) |
| | end | | end |
| | | | |
| 行 109: |
行 109: |
| | return p[funcName](args) | | return p[funcName](args) |
| | end | | end |
| | + | end |
| | + | |
| | + | ---------------------------------------------------------------------------- |
| | + | -- Load TemplateStyles |
| | + | ---------------------------------------------------------------------------- |
| | + | |
| | + | p.main = function(frame) |
| | + | local parent = frame.getParent(frame) |
| | + | local output = p._main(parent.args) |
| | + | return frame:extensionTag{ name='templatestyles', args = { src= message('templatestyles-scr') } } .. frame:preprocess(output) |
| | end | | end |
| | | | |
| 行 114: |
行 124: |
| | -- Main function | | -- Main function |
| | ---------------------------------------------------------------------------- | | ---------------------------------------------------------------------------- |
| − |
| |
| − | p.main = makeInvokeFunc('_main')
| |
| | | | |
| | function p._main(args) | | function p._main(args) |
| 行 135: |
行 143: |
| | :tag('div') | | :tag('div') |
| | :attr('id', message('main-div-id')) | | :attr('id', message('main-div-id')) |
| − | :addClass(message('main-div-classes')) | + | :addClass(message('main-div-class')) |
| − | :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)) |
| 行 334: |
行 337: |
| | -- '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' --> '[[Wikipedia:Template test cases|template sandbox]] page' | + | -- 'sandbox-notice-pagetype-template' --> '[[w:Wikipedia:Template test cases|template sandbox]] page' |
| − | -- 'sandbox-notice-pagetype-module' --> '[[Wikipedia:Template test cases|module sandbox]] page' | + | -- 'sandbox-notice-pagetype-module' --> '[[w: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' |
| 行 355: |
行 358: |
| | -- "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 |
| 行 365: |
行 370: |
| | local templateLink = makeWikilink(templateTitle.prefixedText) | | local templateLink = makeWikilink(templateTitle.prefixedText) |
| | local compareUrl = env.compareUrl | | local compareUrl = env.compareUrl |
| − | if compareUrl then | + | if isPreviewing or not 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 |
| 行 391: |
行 396: |
| | 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) |
| 行 402: |
行 408: |
| | -- '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 editProt = protectionLevels.edit and protectionLevels.edit[1] | + | local editLevels = protectionLevels.edit |
| − | local moveProt = protectionLevels.move and protectionLevels.move[1] | + | local moveLevels = protectionLevels.move |
| − | if editProt then
| + | if moveLevels and moveLevels[1] == 'sysop' or editLevels and editLevels[1] then |
| − | -- The page is edit-protected. | + | -- The page is full-move protected, or full, template, or semi-protected. |
| − | mProtectionBanner = require('Module:Protection banner') | + | local frame = mw.getCurrentFrame() |
| − | local reason = message('protection-reason-edit') | + | return frame:expandTemplate{title = protectionTemplate, args = message('protection-template-args', nil, 'table')} |
| − | 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 |
| 行 445: |
行 450: |
| | local links | | local links |
| | local content = args.content | | local content = args.content |
| − | if not content or args[1] then | + | if not content then |
| | -- No need to include the links if the documentation is on the template page itself. | | -- No need to include the links if the documentation is on the template page itself. |
| | local linksData = p.makeStartBoxLinksData(args, env) | | local linksData = p.makeStartBoxLinksData(args, env) |
| 行 492: |
行 497: |
| | 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 = message('view-link-display') | + | data.viewLinkDisplay = i18n['view-link-display'] |
| − | data.editLinkDisplay = message('edit-link-display') | + | data.editLinkDisplay = i18n['edit-link-display'] |
| − | data.historyLinkDisplay = message('history-link-display') | + | data.historyLinkDisplay = i18n['history-link-display'] |
| − | data.purgeLinkDisplay = message('purge-link-display') | + | data.purgeLinkDisplay = i18n['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 |
| 行 508: |
行 513: |
| | end | | end |
| | data.preload = preload | | data.preload = preload |
| − | data.createLinkDisplay = message('create-link-display') | + | data.createLinkDisplay = i18n['create-link-display'] |
| | return data | | return data |
| | end | | end |
| 行 553: |
行 558: |
| | -- | | -- |
| | -- Messages: | | -- Messages: |
| − | -- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]' | + | -- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=Documentation icon]]' |
| | -- 'template-namespace-heading' --> 'Template documentation' | | -- 'template-namespace-heading' --> 'Template documentation' |
| | -- 'module-namespace-heading' --> 'Module documentation' | | -- 'module-namespace-heading' --> 'Module documentation' |
| 行 579: |
行 584: |
| | data.heading = heading | | data.heading = heading |
| | elseif subjectSpace == 10 then -- Template namespace | | elseif subjectSpace == 10 then -- Template namespace |
| − | data.heading = message('documentation-icon-wikitext') .. ' ' .. message('template-namespace-heading') | + | data.heading = i18n['template-namespace-heading'] |
| | elseif subjectSpace == 828 then -- Module namespace | | elseif subjectSpace == 828 then -- Module namespace |
| − | data.heading = message('documentation-icon-wikitext') .. ' ' .. message('module-namespace-heading') | + | data.heading = i18n['module-namespace-heading'] |
| | elseif subjectSpace == 6 then -- File namespace | | elseif subjectSpace == 6 then -- File namespace |
| − | data.heading = message('file-namespace-heading') | + | data.heading = i18n['file-namespace-heading'] |
| − | else
| |
| − | 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 | | else |
| − | data.headingFontSize = '150%' | + | data.heading = i18n['other-namespaces-heading'] |
| | end | | end |
| | | | |
| 行 615: |
行 608: |
| | local sbox = mw.html.create('div') | | local sbox = mw.html.create('div') |
| | sbox | | sbox |
| − | :css('padding-bottom', '3px') | + | :addClass(message('header-div-class')) |
| − | :css('border-bottom', '1px solid #aaa')
| + | :tag('div') |
| − | :css('margin-bottom', '1ex')
| + | :addClass(message('heading-div-class')) |
| − | :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:tag('span') | + | sbox |
| − | :addClass(data.linksClass)
| + | :tag('div') |
| − | :attr('id', data.linksId)
| + | :addClass(data.linksClass) |
| − | :wikitext(links)
| + | :attr('id', data.linksId) |
| | + | :wikitext(links) |
| | end | | end |
| | return tostring(sbox) | | return tostring(sbox) |
| 行 652: |
行 641: |
| | -- 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. |
| − | return '\n' .. (content or '') .. '\n' | + | local cbox = mw.html.create('div') |
| | + | cbox |
| | + | :addClass(message('content-div-class')) |
| | + | :wikitext('\n' .. (content or '') .. '\n') |
| | + | return tostring(cbox) |
| | end | | end |
| | | | |
| 行 678: |
行 671: |
| | -- @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]].
| |
| | --]=] | | --]=] |
| | | | |
| 行 710: |
行 696: |
| | end | | end |
| | | | |
| − | -- Assemble the arguments for {{fmbox}}. | + | -- Assemble the footer text field. |
| − | 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 |
| 行 742: |
行 721: |
| | end | | end |
| | end | | end |
| − | fmargs.text = text
| |
| | | | |
| − | return messageBox.main('fmbox', fmargs) | + | local ebox = mw.html.create('div') |
| | + | ebox |
| | + | :addClass(message('footer-div-class')) |
| | + | :wikitext(text) |
| | + | return tostring(ebox) |
| | end | | end |
| | | | |
| 行 757: |
行 739: |
| | -- 'history-link-display' --> 'history' | | -- 'history-link-display' --> 'history' |
| | -- 'transcluded-from-blurb' --> | | -- 'transcluded-from-blurb' --> |
| − | -- 'The above [[Wikipedia:Template documentation|documentation]] | + | -- 'The above [[w:Wikipedia:Template documentation|documentation]] |
| − | -- is [[Wikipedia:Transclusion|transcluded]] from $1.' | + | -- is [[w: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 [[Wikipedia:Lua|Scribunto module]].' | + | -- 'You might want to $1 a documentation page for this [[w:Wikipedia:Lua|Scribunto module]].' |
| | --]=] | | --]=] |
| | local docTitle = env.docTitle | | local docTitle = env.docTitle |
| − | if not docTitle then | + | if not docTitle or args.content then |
| | return nil | | return nil |
| | end | | end |
| 行 773: |
行 755: |
| | local docLink = makeWikilink(docTitle.prefixedText) | | local docLink = makeWikilink(docTitle.prefixedText) |
| | local editUrl = docTitle:fullUrl{action = 'edit'} | | local editUrl = docTitle:fullUrl{action = 'edit'} |
| − | local editDisplay = message('edit-link-display') | + | local editDisplay = i18n['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 = message('history-link-display') | + | local historyDisplay = i18n['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}) |
| 行 785: |
行 767: |
| | -- /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 = message('create-link-display') | + | local createDisplay = i18n['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}) |
| 行 858: |
行 840: |
| | 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) |
| 行 872: |
行 851: |
| | local testcasesEditDisplay = message('testcases-edit-link-display') | | local testcasesEditDisplay = message('testcases-edit-link-display') |
| | local testcasesEditLink = makeUrlLink(testcasesEditUrl, testcasesEditDisplay) | | local testcasesEditLink = makeUrlLink(testcasesEditUrl, testcasesEditDisplay) |
| − | -- for Modules, add testcases run link if exists | + | testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink) |
| − | if testcasesTitle.contentModel == "Scribunto" 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 |