Changes

Module:Documentation

7,270 bytes added, 19:54, 27 December 2013
replace content with a port of English Wikipedia's Template:Documentation
--This module implements {{Documentationdocumentation}}. -- Get required modules.local getArgs = require('Module:Arguments').getArgslocal htmlBuilder = require('Module:HtmlBuilder')local messageBox = require('Module:Message box') 
local p = {}
function p-- Constants.corps(frame) args = frame:getParent().args local page currentTitle = mw.title.getCurrentTitle() doc local subjectSpace = pmw.docname(page)site.namespaces[currentTitle.namespace].subject.id  local corps = {}---------------------------------------------------------------------------- -- Helper functions if page.subpageText == 'sandbox' then---------------------------------------------------------------------------- table.insert(corps, '<div style="clear:both />') table.insertlocal function makeWikilink(corpspage, frame:preprocess('{{Template sandbox notice}}')display) end if display then table return mw.insert(corps, pustring.headerformat(page)) table.insert(corps, p.content(frame'[[%s|%s]]', page)) table.insert(corps, p.footer(pagedisplay)) if args.raw then else return frame:preprocess('<nowiki>' mw.ustring. table.concatformat(corps) .. '</nowiki>\n:[[%s]]' .. os.clock(), page) end return table.concat(corps)
end
local function p.docnamemakeUrlLink(pageurl, display) if not page.isSubpage then return pagemw.subjectNsText ustring.. ":" .. page.text .. "/doc" end if page.subpageText == format('doc[%s %s]' or page.subpageText == 'sandbox' or page.subpageText == 'testcases' then return page.subjectNsText .. ":" .. page.baseText .. "/doc" else return page.subjectNsText .. ":" .. page.text .. "/doc" end, url, display)
end
------------------------------------------------------------------------------ Main functions---------------------------------------------------------------------------- function p.ifexistmain(frame) local args = getArgs(frame, { valueFunc = function (pagekey, value) if not page type(value) == 'string' then return false end if mw value = value:match('^%s*(.title.new(page-)%s*$')-- Remove whitespace.exists if key == 'heading' or value ~= '' then return value else return nil end else return true value end end }) return falsep._main(args)
end
function p.header_main(pageargs) local header root = {'<div class="template-documentation"'}htmlBuilder.create() root if args .color then tablewikitext(p.insertprotectionTemplate(header, ' style="background:')) table .wikitext(p.insertsandboxNotice(header, args.color .. '"')) end table.insert(header, '><div style="margin -bottom:1ex; border-bottom:1px solid #aaa; padding-bottom:3px;">') table.insert(headerThis div tag is from {{documentation/start box}}, but moving it here so that we don'[[File:Template-infot have to worry about unclosed tags.png|50px|alt=Template documentation|link=]]') table .inserttag(header, '<span style="font-weight:bold; font-size:125%">&nbsp;div') if args.heading then table.insert(header, args.heading) else table .insertattr(header, 'Template documentationid') end table.insert(header, '</span>template-documentation') if not args.content then table .insertaddClass(header, '<span class="mwtemplate-editsection plainlinks">&#91;[documentation iezoomfix') local arg = mw.title .newwikitext(args[1] or doc) if args[1] and p.ifexiststartBox(args[1]) or p.ifexist(doc) then table .insertwikitext(header, arg:fullUrlp.content('action=view'args) .. ' view]') table .inserttag(header, '&#93;&#32;&#91;[div') table .insert(header, arg:fullUrlcss('action=editclear') .. ' edit]') table.insert(header, '&#93;&#32;&#91;[both') table.insert(header, arg:fullUrl(-- So right or left floating items don'action=history') t stick out of the doc box.. ' history]') table .insertdone(header, '&#93;&#32;&#91;[') table .insertdone(header, page:fullUrl('action=purge') .. ' purge]') else table .insertwikitext(header, arg:fullUrlp.endBox({["action"]="edit", ["preload"]="Template:Documentation/preload"}args)) table .insertwikitext(header, ' create]') end tablep.insertaddTrackingCategories(header, '&#93;</span>') end table.insert(header, '</div>') return table.concattostring(headerroot)
end
function p.contentsandboxNotice(frame, pageargs) local content if currentTitle.subpageText == {}'sandbox' then local arg frame = args[1] or doc if argsmw.content then table.insertgetCurrentFrame(content, '\n') table local root = htmlBuilder.insertcreate(content, args.content) else root table .insert(content, frame:preprocesstag('<nowiki />div')) table .insertcss(content'clear', '\nboth') if args[1] and p .ifexistdone(args[1]) or p.ifexist(doc) then table .insertwikitext(content, frame:preprocess(expandTemplate{title = 'template sandbox notice', args = {{' args.. arg .. 'livepage}}')) end end table.insert return tostring(content, '\n'root) table.insert(content, frame:preprocess('<nowiki />')) else table.insert(content, '<div style="clear:both" />\n') return nil return table.concat(content) end
end
function p.footerprotectionTemplate(page) local footer if currentTitle.namespace = {} local arg = mw.title.new(args[1] or doc) table.insert(footer, '</div><div class="template10 then -documentation plainlinks" ') table.insert(footer, 'style="font-style:italic; margin:2px 0px 0px; padding: 0.35em 0.9em') if args.color then table.insert(footer, '; background:') table.insert(footer, args.color) end table.insert(footer, ';">\n') if args.content then if args["link box"] then table.insert(footer, args["link box"]) else table.insert(footer, 'This documentation is directly included We are in this pagethe template namespace.') end else if args[1] and p local frame = mw.ifexistgetCurrentFrame(args[1]) or p.ifexist(doc) then table.insert(footer, 'The above [[Wikipedia:Template documentation|documentation]] is ') table.insert(footer, '[[Wikipedia:Transclusion|transcluded]] from [[') table.insert(footer, tostring local function getProtectionLevel(arg)protectionType) table.insert(footer, ']]&nbsp;<span style="font -size:89%; font-style:normal;">([')Gets the protection level for the current page. table.insert(footer, arg:fullUrl('action local level =edit')) table.insert(footer, ' edit]&nbsp;|&nbsp;[') table.insert(footer, argframe:fullUrlcallParserFunction('action=historyPROTECTIONLEVEL') .. ' history])</span>.<br />') end table.insert(footer, 'Editors can experiment in this templates 'protectionType) local sandbox = arg.subjectNsText .. ":" .. arg.baseText .. "/sandbox" local argsandbox = mw.title.new(sandbox) if p.ifexist(sandbox) then table.insert(footer, '[[' .. sandbox .. '|sandbox]]') table.insert(footer, '&nbsp;<span stylelevel ~="font-size:89%; font-style:normal;">([') table.insert(footer, argsandbox:fullUrl('action=edit'))then table.insert(footer, ' edit])</span>') return level else table.insert(footer, 'sandbox&nbsp;<span style="font return nil -size:89%; font-style:normal;">([') tableThe parser function returns the blank string if there is no match.insert(footer, argsandbox:fullUrl({["action"]="edit", ["preload"]="Template:Documentation/preload-sandbox"})) table.insert(footer, ' create])</span>') end end table.insert(footer, ' and ') local test = arg.subjectNsText .. ":" .. arg.baseText .. "/testcases" local argtest = mw.title.new(test) if p.ifexistgetProtectionLevel(test) then table.insert(footer, '[[' .. test .. '|testcases]]move') table.insert(footer, '&nbsp;<span style="font-size:89%; font-style:normal;">([= ') table.insert(footer, argtest:fullUrl(sysop'action=edit')) table.insertor getProtectionLevel(footer, ' edit])</span>')then else table.insert(footer, 'testcases&nbsp;<span style="font -size:89%; font-style:normal;">([') table.insert(footer, argtest:fullUrl({["action"]="edit", ["preload"]="Template:Documentation/preloadThe page is full-testcases"})) table.insert(footermove protected, ' create])</span>') end table.insert(footeror full, ' pages.<br />Please add categories to the ') table.insert(footertemplate, '<span class="plainlinks">[') if args[1] and p.ifexist(args[1]) or psemi-protected.ifexist(doc) then table.insert(footer, arg return frame:fullUrl(expandTemplate{title = 'action=editpp-template')) else table.insert(footer, arg:fullUrl(args = {["action"]docusage ="edit", ["preload"]="Template:Documentation/preload"'yes'}})) end table.insert(footer, ' /doc] subpage.') end table.insert(footer, '</div>') return table.concat(footer)nil
end
function p.startBox(args) -- Arg processing from {{documentation}}. local preload = args.preload -- Allow custom preloads. local heading = args.heading -- Blank values are not removed. local headingStyle = args['heading-style'] local content = args.content local docspace = p.docspace() local docname = args[1] -- Other docname, if fed. local templatePage = p.templatePage()  -- Arg processing from {{documentation/start box2}}. local docpage if docname then docpage = docname else local namespace = docspace or currentTitle.nsText local pagename = templatePage or currentTitle.text docpage = namespace .. ':' .. pagename .. '/doc' end local docTitle = mw.title.new(docpage) local docExist = docTitle.exists -- Output from {{documentation/start box}}.  -- First, check the heading parameter. if heading == '' then -- Heading is defined but blank, so do nothing. return nil end  -- Build the start box div. local sbox = htmlBuilder.create('div') sbox .css('padding-bottom', '3px') .css('border-bottom', '1px solid #aaa') .css('margin-bottom', '1ex')  -- Make the heading. local hspan = sbox.tag('span') if headingStyle then hspan.cssText(headingStyle) elseif subjectSpace == 10 then -- We are in the template or template talk namespaces. hspan .css('font-weight', 'bold') .css('fond-size', '125%') else hspan.css('font-size', '150%') end if heading then -- "heading" has data. hspan.wikitext(heading) elseif subjectSpace == 10 then -- Template namespace hspan.wikitext('[[File:Template-info.png|50px|link=|alt=Documentation icon]] Template documentation') elseif subjectSpace == 828 then -- Module namespace hspan.wikitext('[[File:Template-info.png|50px|link=|alt=Documentation icon]] Module documentation') elseif subjectSpace == 6 then -- File namespace hspan.wikitext('Summary') else hspan.wikitext('Documentation') end  -- Add the [view][edit][history][purge] or [create] links. -- Check for the content parameter first, as we don't need the links if the documentation -- content is being entered directly onto the template page. if not content then local lspan = sbox.tag('span') -- lspan is short for "link span". lspan .addClass('mw-editsection plainlinks') .attr('id', 'doc_editlinks') if docExist then local viewLink = makeWikilink(docpage, 'view') local editLink = makeUrlLink(docTitle:fullUrl{action = 'edit'}, 'edit') local historyLink = makeUrlLink(docTitle:fullUrl{action = 'history'}, 'history') local purgeLink = makeUrlLink(docTitle:fullUrl{action = 'purge'}, 'purge') local text = '[%s] [%s] [%s] [%s]' text = text:gsub('%[', '&#91;') -- Replace square brackets with HTML entities. text = text:gsub('%]', '&#93;') lspan.wikitext(mw.ustring.format(text, viewLink, editLink, historyLink, purgeLink)) else if preload then preload = mw.uri.encode(preload) elseif subjectSpace == 6 then -- File namespace preload = 'Template:Documentation/preload-filespace' else preload = 'Template:Documentation/preload' end lspan.wikitext(makeUrlLink(docTitle:fullUrl{action = 'edit', preload = preload}, 'create')) end end  return tostring(sbox)end function p.content(args) local content = args.content if not content then local docpage = args[1] if docpage and mw.title.new(docpage).exists then local frame = mw.getCurrentFrame() content = frame:preprocess('{{ ' .. docpage .. ' }}') else docpage = p.docspace() .. ':' .. p.templatePage() .. '/doc' if mw.title.new(docpage).exists then local frame = mw.getCurrentFrame() content = frame:preprocess('{{ ' .. docpage .. ' }}') end end 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' end function p.endBox(args) -- Argument processing in {{documentation}}. local preload = args.preload -- Allow custom preloads. local content = args.content local linkBox = args['link box'] -- So "link box=off" works. local docspace = p.docspace() local docname = args[1] -- Other docname, if fed. local templatePage = p.templatePage()  -- Argument processing in {{documentation/end box2}}. local docpageRoot = (docspace or currentTitle.nsText) .. ':' .. (templatePage or currentTitle.text) local docpage if docname then docpage = docname else docpage = docpageRoot .. '/doc' end local docTitle = mw.title.new(docpage) local docExist = docTitle.exists local docnameFed = args[1] and true local sandbox = docpageRoot .. '/sandbox' local testcases = docpageRoot .. '/testcases' templatePage = currentTitle.nsText .. ':' .. templatePage  -- Output from {{documentation/end box}} -- First, 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. if linkBox == 'off' or not (docExist or subjectSpace == 2 or subjectSpace == 828 or subjectSpace == 10) then return nil end  -- Assemble the arguments for {{fmbox}}. local fmargs = {} fmargs.id = 'documentation-meta-data' fmargs.image = 'none' fmargs.style = 'background-color: #ecfcf4' fmargs.textstyle = 'font-style: italic;'  -- Assemble the fmbox text field. local text = '' if linkBox then -- Use custom link box content if it is defined. text = text .. linkBox else if docExist then -- /doc exists; link to it. local docLink = makeWikilink(docpage) local editLink = makeUrlLink(docTitle:fullUrl{action = 'edit'}, 'edit') local historyLink = makeUrlLink(docTitle:fullUrl{action = 'history'}, 'history') text = text .. 'The above [[Wikipedia:Template documentation|documentation]] is [[Wikipedia:Transclusion|transcluded]] from ' .. docLink .. '.' .. ' <small style="font-style: normal;">(' .. editLink .. ' &#124; ' .. historyLink .. ')</small> <br />' elseif subjectSpace == 828 then -- /doc does not exist; ask to create it. local createLink = makeUrlLink(docTitle:fullUrl{action = 'edit', preload = 'Template:Documentation/preload-module-doc'}, 'create') text = text .. 'You might want to ' .. createLink .. ' a documentation page for this [[Wikipedia:Lua|Scribunto module]].<br />' end -- Add links to /sandbox and /testcases when appropriate. if subjectSpace == 2 or subjectSpace == 828 or subjectSpace == 10 then -- We are in the user, module or template namespaces. local pagePossessive = subjectSpace == 828 and "module's" or "template's" text = text .. 'Editors can experiment in this ' .. pagePossessive .. ' ' local sandboxTitle = mw.title.new(sandbox) if sandboxTitle.exists then local sandboxLink = makeWikilink(sandbox, 'sandbox') local sandboxEditLink = makeUrlLink(sandboxTitle:fullUrl{action = 'edit'}, 'edit') local compareLink = makeUrlLink(mw.title.new('Special:ComparePages'):fullUrl{page1 = mw.uri.encode(templatePage), page2 = mw.uri.encode(sandbox)}, 'diff') text = text .. sandboxLink .. ' <small style="font-style: normal">(' .. sandboxEditLink .. ' | ' .. compareLink .. ')</small>' else local sandboxPreload = 'Template:Documentation/preload-' .. (subjectSpace == 828 and 'module-' or '') .. 'sandbox' local sandboxCreateLink = makeUrlLink(sandboxTitle:fullUrl{action = 'edit', preload = sandboxPreload}, 'create') local mirrorPreload = mw.uri.encode(templatePage) local mirrorSummary = mw.uri.encode('Create sandbox version of ' .. makeWikilink(templatePage)) local mirrorLink = makeUrlLink(sandboxTitle:fullUrl{action = 'edit', preload = mirrorPreload, summary = mirrorSummary}, 'mirror') text = text .. 'sandbox <small style="font-style: normal">(' .. sandboxCreateLink .. ' | ' .. mirrorLink .. ')</small>' end text = text .. ' and ' local testcaseTitle = mw.title.new(testcases) if testcaseTitle.exists then local testcasesLink = makeWikilink(testcases, 'testcases') local testcasesEditLink = makeUrlLink(testcaseTitle:fullUrl{action = 'edit'}, 'edit') text = text .. testcasesLink .. ' <small style="font-style: normal">(' .. testcasesEditLink .. ')</small>' else local testcasesPreload = 'Template:Documentation/preload-' .. (subjectSpace == 828 and 'module-' or '') .. 'testcases' local testcasesCreateLink = makeUrlLink(testcaseTitle:fullUrl{action = 'edit', preload = testcasesPreload}, 'create') text = text .. 'testcases <small style="font-style: normal">(' .. testcasesCreateLink .. ')</small>' end text = text .. ' pages. <br />' -- Show the categories text, but not if "content" fed or "docname fed" since then it is unclear where to add the categories. if not content and not docnameFed then text = text .. 'Please add categories to the ' .. makeWikilink(docpage, '/doc') .. ' subpage.' end -- Show the "subpages" link. if subjectSpace == 828 then -- Module space. text = text .. ' ' .. makeWikilink('Special:PrefixIndex/' .. templatePage .. '/', 'Subpages of this module') elseif subjectSpace == 10 then -- Template space. text = text .. ' ' .. makeWikilink('Special:PrefixIndex/' .. templatePage .. '/', 'Subpages of this template') elseif subjectSpace ~= 6 then -- Don't show the link in file space. text = text .. ' ' .. makeWikilink('Special:PrefixIndex/' .. templatePage .. '/', 'Subpages of this page') end -- Show the "print" link if it exists. local printPage = templatePage .. '/Print' local printTitle = mw.title.new(printPage) if printTitle.exists then text = text .. '<br />A [[Help:Books/for experts#Improving the book layout|print version]] of this template exists at ' .. makeWikilink(printPage, '/Print') .. '.' .. 'If you make a change to this template, please update the print version as well.[[Category:Templates with print versions]]' end end end fmargs.text = text  -- Return the fmbox output. return messageBox.main('fmbox', fmargs)end function p.addTrackingCategories() -- Check if {{documentation}} is transcluded on a /doc or /testcases page. local ret = '' local subpage = currentTitle.subpageText if subpage == 'doc' or subpage == 'testcases' then local sort = (currentTitle.namespace == 0 and 'Main:' or '') .. currentTitle.prefixedText -- Sort on namespace. ret = ret .. makeWikilink('Category:Wikipedia pages with strange ((documentation)) usage', sort) end return retend function p.docspace() -- Determines the namespace of the documentation. if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then -- Pages in the Article, File, MediaWiki or Category namespaces must have their -- /doc, /sandbox and /testcases pages in talk space. return mw.site.namespaces[subjectSpace].talk.name else return currentTitle.subjectNsText endend function p.templatePage() -- Determines the template page. No namespace or interwiki prefixes are included. local subpage = currentTitle.subpageText if subpage == 'sandbox' or subpage == 'testcases' then return currentTitle.baseText else return currentTitle.text endend 
return p
Anonymous user