ماژول:Documentation

بو ماژول اوچون بلگه‌لر ماژول:Documentation/بلگه صفحه‌سینده یارادیلا بیلینر

-- This module implements {{documentation}}.-- Get required modules.local getArgs = require('Module:Arguments').getArgs-- Get the config table.local cfg = mw.loadData('Module:Documentation/config')local p = {}-- Often-used functions.local ugsub = mw.ustring.gsub------------------------------------------------------------------------------ Helper functions---- These are defined as local functions, but are made available in the p-- table for testing purposes.----------------------------------------------------------------------------local function message(cfgKey, valArray, expectType)--[[-- Gets a message from the cfg table and formats it if appropriate.-- The function raises an error if the value from the cfg table is not-- of the type expectType. The default type for expectType is 'string'.-- If the table valArray is present, strings such as $1, $2 etc. in the-- message are substituted with values from the table keys [1], [2] etc.-- For example, if the message "foo-message" had the value 'Foo $2 bar $1.',-- message('foo-message', {'baz', 'qux'}) would return "Foo qux bar baz."--]]local msg = cfg[cfgKey]expectType = expectType or 'string'if type(msg) ~= expectType thenerror('message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type(msg) .. ')', 2)endif not valArray thenreturn msgendlocal function getMessageVal(match)match = tonumber(match)return valArray[match] or error('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4)endreturn ugsub(msg, '$([1-9][0-9]*)', getMessageVal)endp.message = messagelocal function makeWikilink(page, display)if display thenreturn mw.ustring.format('[[%s|%s]]', page, display)elsereturn mw.ustring.format('[[%s]]', page)endendp.makeWikilink = makeWikilinklocal function makeCategoryLink(cat, sort)local catns = mw.site.namespaces[14].namereturn makeWikilink(catns .. ':' .. cat, sort)endp.makeCategoryLink = makeCategoryLinklocal function makeUrlLink(url, display)return mw.ustring.format('[%s %s]', url, display)endp.makeUrlLink = makeUrlLinklocal function makeToolbar(...)local ret = {}local lim = select('#', ...)if lim < 1 thenreturn nilendfor i = 1, lim doret[#ret + 1] = select(i, ...)end-- 'documentation-toolbar'return '<span class="' .. message('toolbar-class') .. '">('.. table.concat(ret, ' &#124; ') .. ')</span>'endp.makeToolbar = makeToolbar------------------------------------------------------------------------------ Argument processing----------------------------------------------------------------------------local function makeInvokeFunc(funcName)return function (frame)local args = getArgs(frame, {valueFunc = function (key, value)if type(value) == 'string' thenvalue = value:match('^%s*(.-)%s*$') -- Remove whitespace.if key == 'heading' or value ~= '' thenreturn valueelsereturn nilendelsereturn valueendend})return p[funcName](args)endend------------------------------------------------------------------------------ Entry points----------------------------------------------------------------------------function p.nonexistent(frame)if mw.title.getCurrentTitle().subpageText == 'testcases' thenreturn frame:expandTemplate{title = 'module test cases notice'}elsereturn p.main(frame)endendp.main = makeInvokeFunc('_main')function p._main(args)--[[-- This function defines logic flow for the module.-- @args - table of arguments passed by the user--]]local env = p.getEnvironment(args)local root = mw.html.create()root:wikitext(p._getModuleWikitext(args, env)):wikitext(p.protectionTemplate(env)):wikitext(p.sandboxNotice(args, env)):tag('div')-- 'documentation-container':addClass(message('container')):attr('role', 'complementary'):attr('aria-labelledby', args.heading ~= '' and 'documentation-heading' or nil):attr('aria-label', args.heading == '' and 'Documentation' or nil):newline():tag('div')-- 'documentation':addClass(message('main-div-classes')):newline():wikitext(p._startBox(args, env)):wikitext(p._content(args, env)):tag('div')-- 'documentation-clear':addClass(message('clear')):done():newline():done():wikitext(p._endBox(args, env)):done():wikitext(p.addTrackingCategories(env))-- 'Module:Documentation/styles.css'return mw.getCurrentFrame():extensionTag ('templatestyles', '', {src=cfg['templatestyles']}) .. tostring(root)end------------------------------------------------------------------------------ Environment settings----------------------------------------------------------------------------function p.getEnvironment(args)--[[-- Returns a table with information about the environment, including title-- objects and other namespace- or path-related data.-- @args - table of arguments passed by the user---- Title objects include:-- env.title - the page we are making documentation for (usually the current title)-- env.templateTitle - the template (or module, file, etc.)-- env.docTitle - the /doc subpage.-- env.sandboxTitle - the /sandbox subpage.-- env.testcasesTitle - the /testcases subpage.---- Data includes:-- env.protectionLevels - the protection levels table of the title object.-- env.subjectSpace - the number of the title's subject namespace.-- env.docSpace - the number of the namespace the title puts its documentation in.-- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace.-- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template.-- -- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value-- returned will be nil.--]]local env, envFuncs = {}, {}-- 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-- more than once. (Nils won't be memoized.)setmetatable(env, {__index = function (t, key)local envFunc = envFuncs[key]if envFunc thenlocal success, val = pcall(envFunc)if success thenenv[key] = val -- Memoise the value.return valendendreturn nilend})function envFuncs.title()-- The title object for the current page, or a test page passed with args.page.local titlelocal titleArg = args.pageif titleArg thentitle = mw.title.new(titleArg)elsetitle = mw.title.getCurrentTitle()endreturn titleendfunction envFuncs.templateTitle()--[[-- The template (or module, etc.) title object.-- Messages:-- 'sandbox-subpage' --> 'sandbox'-- 'testcases-subpage' --> 'testcases'--]]local subjectSpace = env.subjectSpacelocal title = env.titlelocal subpage = title.subpageTextif subpage == message('sandbox-subpage') or subpage == message('testcases-subpage') thenreturn mw.title.makeTitle(subjectSpace, title.baseText)elsereturn mw.title.makeTitle(subjectSpace, title.text)endendfunction envFuncs.docTitle()--[[-- Title object of the /doc subpage.-- Messages:-- 'doc-subpage' --> 'doc'--]]local title = env.titlelocal docname = args[1] -- User-specified doc page.local docpageif docname thendocpage = docnameelsedocpage = env.docpageBase .. '/' .. message('doc-subpage')endreturn mw.title.new(docpage)endfunction envFuncs.sandboxTitle()--[[-- Title object for the /sandbox subpage.-- Messages:-- 'sandbox-subpage' --> 'sandbox'--]]return mw.title.new(env.docpageBase .. '/' .. message('sandbox-subpage'))endfunction envFuncs.testcasesTitle()--[[-- Title object for the /testcases subpage.-- Messages:-- 'testcases-subpage' --> 'testcases'--]]return mw.title.new(env.docpageBase .. '/' .. message('testcases-subpage'))endfunction envFuncs.protectionLevels()-- The protection levels table of the title object.return env.title.protectionLevelsendfunction envFuncs.subjectSpace()-- The subject namespace number.return mw.site.namespaces[env.title.namespace].subject.idendfunction envFuncs.docSpace()-- The documentation namespace number. For most namespaces this is the-- same as the subject namespace. However, pages in the Article, File,-- MediaWiki or Category namespaces must have their /doc, /sandbox and-- /testcases pages in talk space.local subjectSpace = env.subjectSpaceif subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 thenreturn subjectSpace + 1elsereturn subjectSpaceendendfunction envFuncs.docpageBase()-- The base page of the /doc, /sandbox, and /testcases subpages.-- For some namespaces this is the talk page, rather than the template page.local templateTitle = env.templateTitlelocal docSpace = env.docSpacelocal docSpaceText = mw.site.namespaces[docSpace].name-- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon.return docSpaceText .. ':' .. templateTitle.textendfunction envFuncs.compareUrl()-- Diff link between the sandbox and the main template using [[Special:ComparePages]].local templateTitle = env.templateTitlelocal sandboxTitle = env.sandboxTitleif templateTitle.exists and sandboxTitle.exists thenlocal compareUrl = mw.uri.fullUrl('Special:ComparePages',{ page1 = templateTitle.prefixedText, page2 = sandboxTitle.prefixedText})return tostring(compareUrl)elsereturn nilendendreturn envend------------------------------------------------------------------------------ Auxiliary templates----------------------------------------------------------------------------p.getModuleWikitext = makeInvokeFunc('_getModuleWikitext')function p._getModuleWikitext(args, env)local currentTitle = mw.title.getCurrentTitle()if currentTitle.contentModel ~= 'Scribunto' then return endpcall(require, currentTitle.prefixedText) -- if it fails, we don't carelocal moduleWikitext =  package.loaded["Module:Module wikitext"]if moduleWikitext thenreturn moduleWikitext.main()endendfunction p.sandboxNotice(args, env)--[=[-- Generates a sandbox notice for display above sandbox pages.-- @args - a table of arguments passed by the user-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- -- Messages:-- 'sandbox-notice-image' --> '[[File:Sandbox.svg|50px|alt=|link=]]'-- 'sandbox-notice-blurb' --> 'This is the $1 for $2.'-- '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-module' --> '[[Wikipedia:Template test cases|module sandbox]] page'-- 'sandbox-notice-pagetype-other' --> 'sandbox page'-- 'sandbox-notice-compare-link-display' --> 'diff'-- 'sandbox-notice-testcases-blurb' --> 'See also the companion subpage for $1.'-- 'sandbox-notice-testcases-link-display' --> 'test cases'-- 'sandbox-category' --> 'Template sandboxes'--]=]local title = env.titlelocal sandboxTitle = env.sandboxTitlelocal templateTitle = env.templateTitlelocal subjectSpace = env.subjectSpaceif not (subjectSpace and title and sandboxTitle and templateTitleand mw.title.equals(title, sandboxTitle)) thenreturn nilend-- Build the table of arguments to pass to {{ombox}}. We need just two fields, "image" and "text".local omargs = {}omargs.image = message('sandbox-notice-image')-- Get the text. We start with the opening blurb, which is something like-- "This is the template sandbox for [[Template:Foo]] (diff)."local text = ''local pagetypeif subjectSpace == 10 thenpagetype = message('sandbox-notice-pagetype-template')elseif subjectSpace == 828 thenpagetype = message('sandbox-notice-pagetype-module')elsepagetype = message('sandbox-notice-pagetype-other')endlocal templateLink = makeWikilink(templateTitle.prefixedText)local compareUrl = env.compareUrlif compareUrl thenlocal compareDisplay = message('sandbox-notice-compare-link-display')local compareLink = makeUrlLink(compareUrl, compareDisplay)text = text .. message('sandbox-notice-diff-blurb', {pagetype, templateLink, compareLink})elsetext = text .. message('sandbox-notice-blurb', {pagetype, templateLink})end-- Get the test cases page blurb if the page exists. This is something like-- "See also the companion subpage for [[Template:Foo/testcases|test cases]]."local testcasesTitle = env.testcasesTitleif testcasesTitle and testcasesTitle.exists thenif testcasesTitle.contentModel == "Scribunto" thenlocal testcasesLinkDisplay = message('sandbox-notice-testcases-link-display')local testcasesRunLinkDisplay = message('sandbox-notice-testcases-run-link-display')local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)text = text .. '<br />' .. message('sandbox-notice-testcases-run-blurb', {testcasesLink, testcasesRunLink})elselocal testcasesLinkDisplay = message('sandbox-notice-testcases-link-display')local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)text = text .. '<br />' .. message('sandbox-notice-testcases-blurb', {testcasesLink})endend-- Add the sandbox to the sandbox category.omargs.text = text .. makeCategoryLink(message('sandbox-category'))-- 'documentation-clear'return '<div class="' .. message('clear') .. '"></div>'.. require('Module:Message box').main('ombox', omargs)endfunction p.protectionTemplate(env)-- Generates the padlock icon in the top right.-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- Messages:-- 'protection-template' --> 'pp-template'-- 'protection-template-args' --> {docusage = 'yes'}local protectionLevels = env.protectionLevelsif not protectionLevels thenreturn nilendlocal editProt = protectionLevels.edit and protectionLevels.edit[1]local moveProt = protectionLevels.move and protectionLevels.move[1]if editProt then-- The page is edit-protected.return require('Module:Protection banner')._main{message('protection-reason-edit'), 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.return require('Module:Protection banner')._main{action = 'move', small = true}elsereturn nilendend------------------------------------------------------------------------------ Start box----------------------------------------------------------------------------p.startBox = makeInvokeFunc('_startBox')function p._startBox(args, env)--[[-- This function generates the start box.-- @args - a table of arguments passed by the user-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- -- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make-- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox-- which generate the box HTML.--]]env = env or p.getEnvironment(args)local linkslocal content = args.contentif not content or args[1] then-- No need to include the links if the documentation is on the template page itself.local linksData = p.makeStartBoxLinksData(args, env)if linksData thenlinks = p.renderStartBoxLinks(linksData)endend-- Generate the start box html.local data = p.makeStartBoxData(args, env, links)if data thenreturn p.renderStartBox(data)else-- User specified no heading.return nilendendfunction p.makeStartBoxLinksData(args, env)--[[-- Does initial processing of data to make the [view] [edit] [history] [purge] links.-- @args - a table of arguments passed by the user-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- -- Messages:-- 'view-link-display' --> 'view'-- 'edit-link-display' --> 'edit'-- 'history-link-display' --> 'history'-- 'purge-link-display' --> 'purge'-- 'module-preload' --> 'Template:Documentation/preload-module-doc'-- 'docpage-preload' --> 'Template:Documentation/preload'-- 'create-link-display' --> 'create'--]]local subjectSpace = env.subjectSpacelocal title = env.titlelocal docTitle = env.docTitleif not title or not docTitle thenreturn nilendif docTitle.isRedirect then docTitle = docTitle.redirectTargetendlocal data = {}data.title = titledata.docTitle = docTitle-- View, display, edit, and purge links if /doc exists.data.viewLinkDisplay = message('view-link-display')data.editLinkDisplay = message('edit-link-display')data.historyLinkDisplay = message('history-link-display')data.purgeLinkDisplay = message('purge-link-display')-- Create link if /doc doesn't exist.local preload = args.preloadif not preload thenif subjectSpace == 828 then -- Module namespacepreload = message('module-preload')elsepreload = message('docpage-preload')endenddata.preload = preloaddata.createLinkDisplay = message('create-link-display')return dataendfunction p.renderStartBoxLinks(data)--[[-- Generates the [view][edit][history][purge] or [create][purge] links from the data table.-- @data - a table of data generated by p.makeStartBoxLinksData--]]local function escapeBrackets(s)-- Escapes square brackets with HTML entities.s = s:gsub('%[', '&#91;') -- Replace square brackets with HTML entities.s = s:gsub('%]', '&#93;')return sendlocal retlocal docTitle = data.docTitlelocal title = data.titlelocal purgeLink = makeUrlLink(title:fullUrl{action = 'purge'}, data.purgeLinkDisplay)if docTitle.exists thenlocal viewLink = makeWikilink(docTitle.prefixedText, data.viewLinkDisplay)local editLink = makeUrlLink(docTitle:fullUrl{action = 'edit'}, data.editLinkDisplay)local historyLink = makeUrlLink(docTitle:fullUrl{action = 'history'}, data.historyLinkDisplay)ret = '[%s] [%s] [%s] [%s]'ret = escapeBrackets(ret)ret = mw.ustring.format(ret, viewLink, editLink, historyLink, purgeLink)elselocal createLink = makeUrlLink(docTitle:fullUrl{action = 'edit', preload = data.preload}, data.createLinkDisplay)ret = '[%s] [%s]'ret = escapeBrackets(ret)ret = mw.ustring.format(ret, createLink, purgeLink)endreturn retendfunction p.makeStartBoxData(args, env, links)--[=[-- Does initial processing of data to pass to the start-box render function, p.renderStartBox.-- @args - a table of arguments passed by the user-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- @links - a string containing the [view][edit][history][purge] links - could be nil if there's an error.---- Messages:-- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]'-- 'template-namespace-heading' --> 'Template documentation'-- 'module-namespace-heading' --> 'Module documentation'-- 'file-namespace-heading' --> 'Summary'-- 'other-namespaces-heading' --> 'Documentation'-- 'testcases-create-link-display' --> 'create'--]=]local subjectSpace = env.subjectSpaceif not subjectSpace then-- Default to an "other namespaces" namespace, so that we get at least some output-- if an error occurs.subjectSpace = 2endlocal data = {}-- Headinglocal heading = args.heading -- Blank values are not removed.if heading == '' then-- Don't display the start box if the heading arg is defined but blank.return nilendif heading thendata.heading = headingelseif subjectSpace == 10 then -- Template namespacedata.heading = message('documentation-icon-wikitext') .. ' ' .. message('template-namespace-heading')elseif subjectSpace == 828 then -- Module namespacedata.heading = message('documentation-icon-wikitext') .. ' ' .. message('module-namespace-heading')elseif subjectSpace == 6 then -- File namespacedata.heading = message('file-namespace-heading')elsedata.heading = message('other-namespaces-heading')end-- Heading CSSlocal headingStyle = args['heading-style']if headingStyle thendata.headingStyleText = headingStyleelse-- 'documentation-heading'data.headingClass = message('main-div-heading-class')end-- Data for the [view][edit][history][purge] or [create] links.if links then-- 'mw-editsection-like plainlinks'data.linksClass = message('start-box-link-classes')data.links = linksendreturn dataendfunction p.renderStartBox(data)-- Renders the start box html.-- @data - a table of data generated by p.makeStartBoxData.local sbox = mw.html.create('div')sbox-- 'documentation-startbox':addClass(message('start-box-class')):newline():tag('span'):addClass(data.headingClass):attr('id', 'documentation-heading'):cssText(data.headingStyleText):wikitext(data.heading)local links = data.linksif links thensbox:tag('span'):addClass(data.linksClass):attr('id', data.linksId):wikitext(links)endreturn tostring(sbox)end------------------------------------------------------------------------------ Documentation content----------------------------------------------------------------------------p.content = makeInvokeFunc('_content')function p._content(args, env)-- Displays the documentation contents-- @args - a table of arguments passed by the user-- @env - environment table containing title objects, etc., generated with p.getEnvironmentenv = env or p.getEnvironment(args)local docTitle = env.docTitlelocal content = args.contentif not content and docTitle and docTitle.exists thencontent = args._content or mw.getCurrentFrame():expandTemplate{title = docTitle.prefixedText}end-- The line breaks below are necessary so that "=== Headings ===" at the start and end-- of docs are interpreted correctly.return '\n' .. (content or '') .. '\n' endp.contentTitle = makeInvokeFunc('_contentTitle')function p._contentTitle(args, env)env = env or p.getEnvironment(args)local docTitle = env.docTitleif not args.content and docTitle and docTitle.exists thenreturn docTitle.prefixedTextelsereturn ''endend------------------------------------------------------------------------------ End box----------------------------------------------------------------------------p.endBox = makeInvokeFunc('_endBox')function p._endBox(args, env)--[=[-- This function generates the end box (also known as the link box).-- @args - a table of arguments passed by the user-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- --]=]-- Get environment data.env = env or p.getEnvironment(args)local subjectSpace = env.subjectSpacelocal docTitle = env.docTitleif not subjectSpace or not docTitle thenreturn nilend-- 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.local linkBox = args['link box']if linkBox == 'off'or not (docTitle.existsor subjectSpace == 2or subjectSpace == 828or subjectSpace == 10)thenreturn nilend-- Assemble the link box.local text = ''if linkBox thentext = text .. linkBoxelsetext = text .. (p.makeDocPageBlurb(args, env) or '') -- "This documentation is transcluded from [[Foo]]." if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then-- We are in the user, template or module namespaces.-- Add sandbox and testcases links.-- "Editors can experiment in this template's sandbox and testcases pages."text = text .. (p.makeExperimentBlurb(args, env) or '') .. '<br />'if not args.content and not args[1] then-- "Please add categories to the /doc subpage."-- Don't show this message with inline docs or with an explicitly specified doc page,-- as then it is unclear where to add the categories.text = text .. (p.makeCategoriesBlurb(args, env) or '')endtext = text .. ' ' .. (p.makeSubpagesBlurb(args, env) or '') --"Subpages of this template"endendlocal box = mw.html.create('div')-- 'documentation-metadata'box:attr('role', 'note'):addClass(message('end-box-class'))-- 'plainlinks':addClass(message('end-box-plainlinks')):wikitext(text):done()return '\n' .. tostring(box)endfunction p.makeDocPageBlurb(args, env)--[=[-- Makes the blurb "This documentation is transcluded from [[Template:Foo]] (edit, history)".-- @args - a table of arguments passed by the user-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- -- Messages:-- 'edit-link-display' --> 'edit'-- 'history-link-display' --> 'history'-- 'transcluded-from-blurb' --> -- 'The above [[Wikipedia:Template documentation|documentation]] -- is [[Help:Transclusion|transcluded]] from $1.'-- 'module-preload' --> 'Template:Documentation/preload-module-doc'-- 'create-link-display' --> 'create'-- 'create-module-doc-blurb' -->-- 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].'--]=]local docTitle = env.docTitleif not docTitle thenreturn nilendlocal retif docTitle.exists then-- /doc exists; link to it.local docLink = makeWikilink(docTitle.prefixedText)local editUrl = docTitle:fullUrl{action = 'edit'}local editDisplay = message('edit-link-display')local editLink = makeUrlLink(editUrl, editDisplay)local historyUrl = docTitle:fullUrl{action = 'history'}local historyDisplay = message('history-link-display')local historyLink = makeUrlLink(historyUrl, historyDisplay)ret = message('transcluded-from-blurb', {docLink}).. ' '.. makeToolbar(editLink, historyLink).. '<br />'elseif env.subjectSpace == 828 then-- /doc does not exist; ask to create it.local createUrl = docTitle:fullUrl{action = 'edit', preload = message('module-preload')}local createDisplay = message('create-link-display')local createLink = makeUrlLink(createUrl, createDisplay)ret = message('create-module-doc-blurb', {createLink}).. '<br />'endreturn retendfunction p.makeExperimentBlurb(args, env)--[[-- Renders the text "Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages."-- @args - a table of arguments passed by the user-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- -- Messages:-- 'sandbox-link-display' --> 'sandbox'-- 'sandbox-edit-link-display' --> 'edit'-- 'compare-link-display' --> 'diff'-- 'module-sandbox-preload' --> 'Template:Documentation/preload-module-sandbox'-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox'-- 'sandbox-create-link-display' --> 'create'-- 'mirror-edit-summary' --> 'Create sandbox version of $1'-- 'mirror-link-display' --> 'mirror'-- 'mirror-link-preload' --> 'Template:Documentation/mirror'-- 'sandbox-link-display' --> 'sandbox'-- 'testcases-link-display' --> 'testcases'-- 'testcases-edit-link-display'--> 'edit'-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox'-- 'testcases-create-link-display' --> 'create'-- 'testcases-link-display' --> 'testcases'-- 'testcases-edit-link-display' --> 'edit'-- 'module-testcases-preload' --> 'Template:Documentation/preload-module-testcases'-- 'template-testcases-preload' --> 'Template:Documentation/preload-testcases'-- 'experiment-blurb-module' --> 'Editors can experiment in this module's $1 and $2 pages.'-- 'experiment-blurb-template' --> 'Editors can experiment in this template's $1 and $2 pages.'--]]local subjectSpace = env.subjectSpacelocal templateTitle = env.templateTitlelocal sandboxTitle = env.sandboxTitlelocal testcasesTitle = env.testcasesTitlelocal templatePage = templateTitle.prefixedTextif not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle thenreturn nilend-- Make links.local sandboxLinks, testcasesLinksif sandboxTitle.exists thenlocal sandboxPage = sandboxTitle.prefixedTextlocal sandboxDisplay = message('sandbox-link-display')local sandboxLink = makeWikilink(sandboxPage, sandboxDisplay)local sandboxEditUrl = sandboxTitle:fullUrl{action = 'edit'}local sandboxEditDisplay = message('sandbox-edit-link-display')local sandboxEditLink = makeUrlLink(sandboxEditUrl, sandboxEditDisplay)local compareUrl = env.compareUrllocal compareLinkif compareUrl thenlocal compareDisplay = message('compare-link-display')compareLink = makeUrlLink(compareUrl, compareDisplay)endsandboxLinks = sandboxLink .. ' ' .. makeToolbar(sandboxEditLink, compareLink)elselocal sandboxPreloadif subjectSpace == 828 thensandboxPreload = message('module-sandbox-preload')elsesandboxPreload = message('template-sandbox-preload')endlocal sandboxCreateUrl = sandboxTitle:fullUrl{action = 'edit', preload = sandboxPreload}local sandboxCreateDisplay = message('sandbox-create-link-display')local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay)local mirrorSummary = message('mirror-edit-summary', {makeWikilink(templatePage)})local mirrorPreload = message('mirror-link-preload')local mirrorUrl = sandboxTitle:fullUrl{action = 'edit', preload = mirrorPreload, summary = mirrorSummary}if subjectSpace == 828 thenmirrorUrl = sandboxTitle:fullUrl{action = 'edit', preload = templateTitle.prefixedText, summary = mirrorSummary}endlocal mirrorDisplay = message('mirror-link-display')local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay)sandboxLinks = message('sandbox-link-display') .. ' ' .. makeToolbar(sandboxCreateLink, mirrorLink)endif testcasesTitle.exists thenlocal testcasesPage = testcasesTitle.prefixedTextlocal testcasesDisplay = message('testcases-link-display')local testcasesLink = makeWikilink(testcasesPage, testcasesDisplay)local testcasesEditUrl = testcasesTitle:fullUrl{action = 'edit'}local testcasesEditDisplay = message('testcases-edit-link-display')local testcasesEditLink = makeUrlLink(testcasesEditUrl, testcasesEditDisplay)-- for Modules, add testcases run link if existsif testcasesTitle.contentModel == "Scribunto"  and testcasesTitle.talkPageTitle and testcasesTitle.talkPageTitle.exists thenlocal testcasesRunLinkDisplay = message('testcases-run-link-display')local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink, testcasesRunLink)elsetestcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink)endelselocal testcasesPreloadif subjectSpace == 828 thentestcasesPreload = message('module-testcases-preload')elsetestcasesPreload = message('template-testcases-preload')endlocal testcasesCreateUrl = testcasesTitle:fullUrl{action = 'edit', preload = testcasesPreload}local testcasesCreateDisplay = message('testcases-create-link-display')local testcasesCreateLink = makeUrlLink(testcasesCreateUrl, testcasesCreateDisplay)testcasesLinks = message('testcases-link-display') .. ' ' .. makeToolbar(testcasesCreateLink)endlocal messageNameif subjectSpace == 828 thenmessageName = 'experiment-blurb-module'elsemessageName = 'experiment-blurb-template'endreturn message(messageName, {sandboxLinks, testcasesLinks})endfunction p.makeCategoriesBlurb(args, env)--[[-- Generates the text "Please add categories to the /doc subpage."-- @args - a table of arguments passed by the user-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- Messages:-- 'doc-link-display' --> '/doc'-- 'add-categories-blurb' --> 'Please add categories to the $1 subpage.'--]]local docTitle = env.docTitleif not docTitle thenreturn nilendlocal docPathLink = makeWikilink(docTitle.prefixedText, message('doc-link-display'))return message('add-categories-blurb', {docPathLink})endfunction p.makeSubpagesBlurb(args, env)--[[-- Generates the "Subpages of this template" link.-- @args - a table of arguments passed by the user-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- Messages:-- 'template-pagetype' --> 'template'-- 'module-pagetype' --> 'module'-- 'default-pagetype' --> 'page'-- 'subpages-link-display' --> 'Subpages of this $1'--]]local subjectSpace = env.subjectSpacelocal templateTitle = env.templateTitleif not subjectSpace or not templateTitle thenreturn nilendlocal pagetypeif subjectSpace == 10 thenpagetype = message('template-pagetype')elseif subjectSpace == 828 thenpagetype = message('module-pagetype')elsepagetype = message('default-pagetype')endlocal subpagesLink = makeWikilink('Special:PrefixIndex/' .. templateTitle.prefixedText .. '/',message('subpages-link-display', {pagetype}))return message('subpages-blurb', {subpagesLink})end------------------------------------------------------------------------------ Tracking categories----------------------------------------------------------------------------function p.addTrackingCategories(env)--[[-- Check if {{documentation}} is transcluded on a /doc or /testcases page.-- @env - environment table containing title objects, etc., generated with p.getEnvironment-- Messages:-- 'display-strange-usage-category' --> true-- 'doc-subpage' --> 'doc'-- 'testcases-subpage' --> 'testcases'-- 'strange-usage-category' --> 'Wikipedia pages with strange ((documentation)) usage'-- -- /testcases pages in the module namespace are not categorised, as they may have-- {{documentation}} transcluded automatically.--]]local title = env.titlelocal subjectSpace = env.subjectSpaceif not title or not subjectSpace thenreturn nilendlocal subpage = title.subpageTextlocal ret = ''if message('display-strange-usage-category', nil, 'boolean')and (subpage == message('doc-subpage')or subjectSpace ~= 828 and subpage == message('testcases-subpage'))thenret = ret .. makeCategoryLink(message('strange-usage-category'))endreturn retendreturn p