Line 7: |
Line 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 = {} |
| | | |
Line 33: |
Line 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 |
Line 41: |
Line 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 |
| | | |
Line 109: |
Line 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 |
| | | |
Line 114: |
Line 124: |
| -- Main function | | -- Main function |
| ---------------------------------------------------------------------------- | | ---------------------------------------------------------------------------- |
− |
| |
− | p.main = makeInvokeFunc('_main')
| |
| | | |
| function p._main(args) | | function p._main(args) |
Line 135: |
Line 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)) |
Line 334: |
Line 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' |
Line 355: |
Line 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 |
Line 365: |
Line 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 |
Line 391: |
Line 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) |
Line 402: |
Line 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 |
Line 445: |
Line 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) |
Line 492: |
Line 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 |
Line 508: |
Line 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 |
Line 553: |
Line 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' |
Line 579: |
Line 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 |
| | | |
Line 615: |
Line 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) |
Line 652: |
Line 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 |
| | | |
Line 678: |
Line 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]].
| |
| --]=] | | --]=] |
| | | |
Line 710: |
Line 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 |
Line 742: |
Line 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 |
| | | |
Line 757: |
Line 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 |
Line 773: |
Line 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}) |
Line 785: |
Line 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}) |
Line 858: |
Line 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) |
Line 872: |
Line 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 |