「モジュール:Documentation」を編集中
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
-- This module implements {{documentation}}. | -- This module implements {{documentation}}. | ||
− | + | ||
-- Get required modules. | -- Get required modules. | ||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
+ | local htmlBuilder = require('Module:HtmlBuilder') | ||
local messageBox = require('Module:Message box') | local messageBox = require('Module:Message box') | ||
− | + | ||
-- Get the config table. | -- Get the config table. | ||
local cfg = mw.loadData('Module:Documentation/config') | local cfg = mw.loadData('Module:Documentation/config') | ||
− | + | ||
local p = {} | local p = {} | ||
− | + | ||
-- Often-used functions. | -- Often-used functions. | ||
local ugsub = mw.ustring.gsub | local ugsub = mw.ustring.gsub | ||
− | + | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
-- Helper functions | -- Helper functions | ||
19行目: | 20行目: | ||
-- table for testing purposes. | -- table for testing purposes. | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
− | + | ||
local function message(cfgKey, valArray, expectType) | local function message(cfgKey, valArray, expectType) | ||
--[[ | --[[ | ||
38行目: | 39行目: | ||
return msg | return msg | ||
end | end | ||
− | + | ||
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('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4) | ||
end | end | ||
− | + | ||
local ret = ugsub(msg, '$([1-9][0-9]*)', getMessageVal) | local ret = ugsub(msg, '$([1-9][0-9]*)', getMessageVal) | ||
return ret | return ret | ||
end | end | ||
− | + | ||
p.message = message | p.message = message | ||
− | + | ||
local function makeWikilink(page, display) | local function makeWikilink(page, display) | ||
if display then | if display then | ||
57行目: | 58行目: | ||
end | end | ||
end | end | ||
− | + | ||
p.makeWikilink = makeWikilink | p.makeWikilink = makeWikilink | ||
− | + | ||
local function makeCategoryLink(cat, sort) | local function makeCategoryLink(cat, sort) | ||
local catns = mw.site.namespaces[14].name | local catns = mw.site.namespaces[14].name | ||
return makeWikilink(catns .. ':' .. cat, sort) | return makeWikilink(catns .. ':' .. cat, sort) | ||
end | end | ||
− | + | ||
p.makeCategoryLink = makeCategoryLink | p.makeCategoryLink = makeCategoryLink | ||
− | + | ||
local function makeUrlLink(url, display) | local function makeUrlLink(url, display) | ||
return mw.ustring.format('[%s %s]', url, display) | return mw.ustring.format('[%s %s]', url, display) | ||
end | end | ||
− | + | ||
p.makeUrlLink = makeUrlLink | p.makeUrlLink = makeUrlLink | ||
− | + | ||
local function makeToolbar(...) | local function makeToolbar(...) | ||
local ret = {} | local ret = {} | ||
84行目: | 85行目: | ||
return '<small style="font-style: normal;">(' .. table.concat(ret, ' | ') .. ')</small>' | return '<small style="font-style: normal;">(' .. table.concat(ret, ' | ') .. ')</small>' | ||
end | end | ||
− | + | ||
p.makeToolbar = makeToolbar | p.makeToolbar = makeToolbar | ||
− | + | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
-- Argument processing | -- Argument processing | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
− | + | ||
local function makeInvokeFunc(funcName) | local function makeInvokeFunc(funcName) | ||
return function (frame) | return function (frame) | ||
110行目: | 111行目: | ||
end | end | ||
end | end | ||
− | + | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
-- Main function | -- Main function | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
− | + | ||
p.main = makeInvokeFunc('_main') | p.main = makeInvokeFunc('_main') | ||
− | + | ||
function p._main(args) | function p._main(args) | ||
--[[ | --[[ | ||
127行目: | 128行目: | ||
--]] | --]] | ||
local env = p.getEnvironment(args) | local env = p.getEnvironment(args) | ||
− | local root = | + | local root = htmlBuilder.create() |
root | root | ||
− | + | .wikitext(p.protectionTemplate(env)) | |
− | + | .wikitext(p.sandboxNotice(args, env)) | |
-- This div tag is from {{documentation/start box}}, but moving it here | -- This div tag is from {{documentation/start box}}, but moving it here | ||
-- so that we don't have to worry about unclosed tags. | -- so that we don't have to worry about unclosed tags. | ||
− | + | .tag('div') | |
− | + | .attr('id', message('main-div-id')) | |
− | + | .addClass(message('main-div-classes')) | |
− | + | .newline() | |
− | + | .wikitext(p._startBox(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() | |
− | + | .wikitext(p._endBox(args, env)) | |
− | + | .wikitext(p.addTrackingCategories(env)) | |
− | |||
return tostring(root) | return tostring(root) | ||
end | end | ||
− | + | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
-- Environment settings | -- Environment settings | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
− | + | ||
function p.getEnvironment(args) | function p.getEnvironment(args) | ||
--[[ | --[[ | ||
178行目: | 178行目: | ||
-- returned will be nil. | -- returned will be nil. | ||
--]] | --]] | ||
− | + | ||
local env, envFuncs = {}, {} | local env, envFuncs = {}, {} | ||
− | + | ||
-- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value | -- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value | ||
-- returned by that function is memoized in the env table so that we don't call any of the functions | -- returned by that function is memoized in the env table so that we don't call any of the functions | ||
197行目: | 197行目: | ||
end | end | ||
}) | }) | ||
− | + | ||
function envFuncs.title() | function envFuncs.title() | ||
-- The title object for the current page, or a test page passed with args.page. | -- The title object for the current page, or a test page passed with args.page. | ||
209行目: | 209行目: | ||
return title | return title | ||
end | end | ||
− | + | ||
function envFuncs.templateTitle() | function envFuncs.templateTitle() | ||
--[[ | --[[ | ||
226行目: | 226行目: | ||
end | end | ||
end | end | ||
− | + | ||
function envFuncs.docTitle() | function envFuncs.docTitle() | ||
--[[ | --[[ | ||
243行目: | 243行目: | ||
return mw.title.new(docpage) | return mw.title.new(docpage) | ||
end | end | ||
− | + | ||
function envFuncs.sandboxTitle() | function envFuncs.sandboxTitle() | ||
--[[ | --[[ | ||
252行目: | 252行目: | ||
return mw.title.new(env.docpageBase .. '/' .. message('sandbox-subpage')) | return mw.title.new(env.docpageBase .. '/' .. message('sandbox-subpage')) | ||
end | end | ||
− | + | ||
function envFuncs.testcasesTitle() | function envFuncs.testcasesTitle() | ||
--[[ | --[[ | ||
261行目: | 261行目: | ||
return mw.title.new(env.docpageBase .. '/' .. message('testcases-subpage')) | return mw.title.new(env.docpageBase .. '/' .. message('testcases-subpage')) | ||
end | end | ||
− | + | ||
function envFuncs.printTitle() | function envFuncs.printTitle() | ||
--[[ | --[[ | ||
270行目: | 270行目: | ||
return env.templateTitle:subPageTitle(message('print-subpage')) | return env.templateTitle:subPageTitle(message('print-subpage')) | ||
end | end | ||
− | + | ||
function envFuncs.protectionLevels() | function envFuncs.protectionLevels() | ||
-- The protection levels table of the title object. | -- The protection levels table of the title object. | ||
return env.title.protectionLevels | return env.title.protectionLevels | ||
end | end | ||
− | + | ||
function envFuncs.subjectSpace() | function envFuncs.subjectSpace() | ||
-- The subject namespace number. | -- The subject namespace number. | ||
return mw.site.namespaces[env.title.namespace].subject.id | return mw.site.namespaces[env.title.namespace].subject.id | ||
end | end | ||
− | + | ||
function envFuncs.docSpace() | function envFuncs.docSpace() | ||
-- The documentation namespace number. For most namespaces this is the same as the | -- The documentation namespace number. For most namespaces this is the same as the | ||
292行目: | 292行目: | ||
end | end | ||
end | end | ||
− | + | ||
function envFuncs.docpageBase() | function envFuncs.docpageBase() | ||
-- The base page of the /doc, /sandbox, and /testcases subpages. | -- The base page of the /doc, /sandbox, and /testcases subpages. | ||
302行目: | 302行目: | ||
return docSpaceText .. ':' .. templateTitle.text | return docSpaceText .. ':' .. templateTitle.text | ||
end | end | ||
− | + | ||
function envFuncs.compareUrl() | function envFuncs.compareUrl() | ||
-- Diff link between the sandbox and the main template using [[Special:ComparePages]]. | -- Diff link between the sandbox and the main template using [[Special:ComparePages]]. | ||
317行目: | 317行目: | ||
end | end | ||
end | end | ||
− | + | ||
return env | return env | ||
end | end | ||
− | + | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
-- Auxiliary templates | -- Auxiliary templates | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
− | + | ||
function p.sandboxNotice(args, env) | function p.sandboxNotice(args, env) | ||
--[=[ | --[=[ | ||
398行目: | 398行目: | ||
return ret | return ret | ||
end | end | ||
− | + | ||
function p.protectionTemplate(env) | function p.protectionTemplate(env) | ||
-- Generates the padlock icon in the top right. | -- Generates the padlock icon in the top right. | ||
405行目: | 405行目: | ||
-- '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 | ||
− | + | if title.namespace ~= 10 and title.namespace ~= 828 then | |
− | |||
− | |||
− | |||
-- Don't display the protection template if we are not in the template or module namespaces. | -- Don't display the protection template if we are not in the template or module namespaces. | ||
return nil | return nil | ||
417行目: | 415行目: | ||
return nil | return nil | ||
end | end | ||
− | local | + | local editProt = protectionLevels.edit and protectionLevels.edit[1] |
− | local | + | local moveProt = protectionLevels.move and protectionLevels.move[1] |
− | + | if editProt then | |
− | -- The page is | + | -- The page is edit-protected. |
− | + | mProtectionBanner = require('Module:Protection banner') | |
− | return | + | 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 | ||
end | end | ||
end | end | ||
− | + | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
-- Start box | -- Start box | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
− | + | ||
p.startBox = makeInvokeFunc('_startBox') | p.startBox = makeInvokeFunc('_startBox') | ||
− | + | ||
function p._startBox(args, env) | function p._startBox(args, env) | ||
--[[ | --[[ | ||
463行目: | 468行目: | ||
end | end | ||
end | end | ||
− | + | ||
function p.makeStartBoxLinksData(args, env) | function p.makeStartBoxLinksData(args, env) | ||
--[[ | --[[ | ||
486行目: | 491行目: | ||
return nil | return nil | ||
end | end | ||
− | + | ||
local data = {} | local data = {} | ||
data.title = title | data.title = title | ||
510行目: | 515行目: | ||
return data | return data | ||
end | end | ||
− | + | ||
function p.renderStartBoxLinks(data) | function p.renderStartBoxLinks(data) | ||
--[[ | --[[ | ||
516行目: | 521行目: | ||
-- @data - a table of data generated by p.makeStartBoxLinksData | -- @data - a table of data generated by p.makeStartBoxLinksData | ||
--]] | --]] | ||
− | + | ||
local function escapeBrackets(s) | local function escapeBrackets(s) | ||
-- Escapes square brackets with HTML entities. | -- Escapes square brackets with HTML entities. | ||
523行目: | 528行目: | ||
return s | return s | ||
end | end | ||
− | + | ||
local ret | local ret | ||
local docTitle = data.docTitle | local docTitle = data.docTitle | ||
543行目: | 548行目: | ||
return ret | return ret | ||
end | end | ||
− | + | ||
function p.makeStartBoxData(args, env, links) | function p.makeStartBoxData(args, env, links) | ||
--[=[ | --[=[ | ||
568行目: | 573行目: | ||
end | end | ||
local data = {} | local data = {} | ||
− | + | ||
-- Heading | -- Heading | ||
local heading = args.heading -- Blank values are not removed. | local heading = args.heading -- Blank values are not removed. | ||
586行目: | 591行目: | ||
data.heading = message('other-namespaces-heading') | data.heading = message('other-namespaces-heading') | ||
end | end | ||
− | + | ||
-- Heading CSS | -- Heading CSS | ||
local headingStyle = args['heading-style'] | local headingStyle = args['heading-style'] | ||
598行目: | 603行目: | ||
data.headingFontSize = '150%' | data.headingFontSize = '150%' | ||
end | end | ||
− | + | ||
-- Data for the [view][edit][history][purge] or [create] links. | -- Data for the [view][edit][history][purge] or [create] links. | ||
if links then | if links then | ||
605行目: | 610行目: | ||
data.links = links | data.links = links | ||
end | end | ||
− | + | ||
return data | return data | ||
end | end | ||
− | + | ||
function p.renderStartBox(data) | function p.renderStartBox(data) | ||
-- Renders the start box html. | -- Renders the start box html. | ||
-- @data - a table of data generated by p.makeStartBoxData. | -- @data - a table of data generated by p.makeStartBoxData. | ||
− | local sbox = | + | local sbox = htmlBuilder.create('div') |
sbox | sbox | ||
− | + | .css('padding-bottom', '3px') | |
− | + | .css('border-bottom', '1px solid #aaa') | |
− | + | .css('margin-bottom', '1ex') | |
− | + | .newline() | |
− | + | .tag('span') | |
− | + | .cssText(data.headingStyleText) | |
− | + | .css('font-weight', data.headingFontWeight) | |
− | + | .css('font-size', data.headingFontSize) | |
− | + | .wikitext(data.heading) | |
local links = data.links | local links = data.links | ||
if links then | if links then | ||
− | sbox | + | sbox.tag('span') |
− | + | .addClass(data.linksClass) | |
− | + | .attr('id', data.linksId) | |
− | + | .wikitext(links) | |
end | end | ||
return tostring(sbox) | return tostring(sbox) | ||
end | end | ||
− | + | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
-- Documentation content | -- Documentation content | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
− | + | ||
p.content = makeInvokeFunc('_content') | p.content = makeInvokeFunc('_content') | ||
− | + | ||
function p._content(args, env) | function p._content(args, env) | ||
-- Displays the documentation contents | -- Displays the documentation contents | ||
653行目: | 658行目: | ||
return '\n' .. (content or '') .. '\n' | return '\n' .. (content or '') .. '\n' | ||
end | end | ||
− | + | ||
p.contentTitle = makeInvokeFunc('_contentTitle') | p.contentTitle = makeInvokeFunc('_contentTitle') | ||
− | + | ||
function p._contentTitle(args, env) | function p._contentTitle(args, env) | ||
env = env or p.getEnvironment(args) | env = env or p.getEnvironment(args) | ||
665行目: | 670行目: | ||
end | end | ||
end | end | ||
− | + | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
-- End box | -- End box | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
− | + | ||
p.endBox = makeInvokeFunc('_endBox') | p.endBox = makeInvokeFunc('_endBox') | ||
− | + | ||
function p._endBox(args, env) | function p._endBox(args, env) | ||
--[=[ | --[=[ | ||
685行目: | 690行目: | ||
-- The HTML is generated by the {{fmbox}} template, courtesy of [[Module:Message box]]. | -- The HTML is generated by the {{fmbox}} template, courtesy of [[Module:Message box]]. | ||
--]=] | --]=] | ||
− | + | ||
-- Get environment data. | -- Get environment data. | ||
env = env or p.getEnvironment(args) | env = env or p.getEnvironment(args) | ||
693行目: | 698行目: | ||
return nil | return nil | ||
end | end | ||
− | + | ||
-- Check whether we should output the end box at all. Add the end | -- 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 | -- box by default if the documentation exists or if we are in the | ||
708行目: | 713行目: | ||
return nil | return nil | ||
end | end | ||
− | + | ||
-- Assemble the arguments for {{fmbox}}. | -- Assemble the arguments for {{fmbox}}. | ||
local fmargs = {} | local fmargs = {} | ||
715行目: | 720行目: | ||
fmargs.style = message('fmbox-style') -- Sets 'background-color: #ecfcf4' | fmargs.style = message('fmbox-style') -- Sets 'background-color: #ecfcf4' | ||
fmargs.textstyle = message('fmbox-textstyle') -- 'font-style: italic;' | fmargs.textstyle = message('fmbox-textstyle') -- 'font-style: italic;' | ||
− | + | ||
-- Assemble the fmbox text field. | -- Assemble the fmbox text field. | ||
local text = '' | local text = '' | ||
742行目: | 747行目: | ||
end | end | ||
fmargs.text = text | fmargs.text = text | ||
− | + | ||
return messageBox.main('fmbox', fmargs) | return messageBox.main('fmbox', fmargs) | ||
end | end | ||
− | + | ||
function p.makeDocPageBlurb(args, env) | function p.makeDocPageBlurb(args, env) | ||
--[=[ | --[=[ | ||
791行目: | 796行目: | ||
return ret | return ret | ||
end | end | ||
− | + | ||
function p.makeExperimentBlurb(args, env) | function p.makeExperimentBlurb(args, env) | ||
--[[ | --[[ | ||
807行目: | 812行目: | ||
-- 'mirror-edit-summary' --> 'Create sandbox version of $1' | -- 'mirror-edit-summary' --> 'Create sandbox version of $1' | ||
-- 'mirror-link-display' --> 'mirror' | -- 'mirror-link-display' --> 'mirror' | ||
− | |||
-- 'sandbox-link-display' --> 'sandbox' | -- 'sandbox-link-display' --> 'sandbox' | ||
-- 'testcases-link-display' --> 'testcases' | -- 'testcases-link-display' --> 'testcases' | ||
-- 'testcases-edit-link-display'--> 'edit' | -- 'testcases-edit-link-display'--> 'edit' | ||
+ | -- 'module-testcases-preload' --> 'Template:Documentation/preload-module-testcases' | ||
-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox' | -- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox' | ||
-- 'testcases-create-link-display' --> 'create' | -- 'testcases-create-link-display' --> 'create' | ||
855行目: | 860行目: | ||
local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay) | local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay) | ||
local mirrorSummary = message('mirror-edit-summary', {makeWikilink(templatePage)}) | local mirrorSummary = message('mirror-edit-summary', {makeWikilink(templatePage)}) | ||
− | + | local mirrorUrl = sandboxTitle:fullUrl{action = 'edit', preload = templatePage, summary = mirrorSummary} | |
− | local mirrorUrl = sandboxTitle:fullUrl{action = 'edit', preload = | ||
local mirrorDisplay = message('mirror-link-display') | local mirrorDisplay = message('mirror-link-display') | ||
local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay) | local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay) | ||
889行目: | 893行目: | ||
return message(messageName, {sandboxLinks, testcasesLinks}) | return message(messageName, {sandboxLinks, testcasesLinks}) | ||
end | end | ||
− | + | ||
function p.makeCategoriesBlurb(args, env) | function p.makeCategoriesBlurb(args, env) | ||
--[[ | --[[ | ||
906行目: | 910行目: | ||
return message('add-categories-blurb', {docPathLink}) | return message('add-categories-blurb', {docPathLink}) | ||
end | end | ||
− | + | ||
function p.makeSubpagesBlurb(args, env) | function p.makeSubpagesBlurb(args, env) | ||
--[[ | --[[ | ||
912行目: | 916行目: | ||
-- @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: | -- Messages: | ||
-- 'template-pagetype' --> 'template' | -- 'template-pagetype' --> 'template' | ||
938行目: | 942行目: | ||
return message('subpages-blurb', {subpagesLink}) | return message('subpages-blurb', {subpagesLink}) | ||
end | end | ||
− | + | ||
function p.makePrintBlurb(args, env) | function p.makePrintBlurb(args, env) | ||
--[=[ | --[=[ | ||
968行目: | 972行目: | ||
return ret | return ret | ||
end | end | ||
− | + | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
-- Tracking categories | -- Tracking categories | ||
---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ||
− | + | ||
function p.addTrackingCategories(env) | function p.addTrackingCategories(env) | ||
--[[ | --[[ | ||
-- Check if {{documentation}} is transcluded on a /doc or /testcases page. | -- Check if {{documentation}} is transcluded on a /doc or /testcases page. | ||
-- @env - environment table containing title objects, etc., generated with p.getEnvironment | -- @env - environment table containing title objects, etc., generated with p.getEnvironment | ||
− | + | ||
-- Messages: | -- Messages: | ||
-- 'display-strange-usage-category' --> true | -- 'display-strange-usage-category' --> true | ||
1,004行目: | 1,008行目: | ||
return ret | return ret | ||
end | end | ||
− | + | ||
return p | return p |