Editing
Module:Documentation
Jump to navigation
Jump to search
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
local p = {} -- Load modules (language wikis exclusive) -- ... -- Customizable strings local i18n = { -- default settings, change when necessary defaultDocPage = 'doc', -- documentation page suffix defaultSandboxPage = 'sandbox', -- sandbox page suffix defaultTestCasePage = 'testcases', -- testcases page suffix defaultPreload = 'Template:Documentation/preload', -- page that stores qualified documentation page contents defaultStyles = 'Module:Documentation/styles.css', -- stylesheet for this module when using TemplateStyles, remove or set to nil if your wiki not use this -- format strings, should not be translated commonInternalLink = '[[%s]]', commonInternalLinkPipe = '[[%s|%s]]', commonExternalLink = '[%s]', commonExternalLinkWithName = '[%s %s]', commonNamespacedPage = '%s:%s', commonNamespacedPageWithSub = '%s:%s/%s', -- namespace names, translate if your language prefers localized namespace name, although remain it untouched most likely not affect anything namespaceCategory = 'Category', namespaceSpecial = 'Special', namespaceUser = 'User', -- names of special pages, translate if your language prefers localized namespace name, although remain it untouched will still correctly linked to target page specialPurge = 'Purge', specialEdit = 'EditPage', specialHistory = 'PageHistory', -- translate following types if your language displays differ pageType_template = 'template', pageType_module = 'module', pageType_widget = 'widget', pageType_stylesheet = 'stylesheet', pageType_script = 'script', pageType_message = 'message', -- modify them if your wiki use different style to displaying links linkBar = '%s', -- format used for whole link bar linkFormat = mw.text.nowiki( '[' ) .. '%s' .. mw.text.nowiki( ']' ), -- format used for each individual links linkSeparator = ' ', -- separator between links -- name of different type of links, change them if necessary linkTextPurge = mw.getCurrentFrame():callParserFunction( 'int:smw_purge' ):lower(), linkTextView = mw.getCurrentFrame():callParserFunction( 'int:view' ):lower(), linkTextEdit = mw.getCurrentFrame():callParserFunction( 'int:edit' ):lower(), linkTextHistory = mw.getCurrentFrame():callParserFunction( 'int:history_short' ):lower(), linkTextCreate = mw.getCurrentFrame():callParserFunction( 'int:create' ):lower(), -- strings used in p.create(): contents shown when using {{docc}} or {{subst:docc}} createOutputFormat = '%s%s', -- overall format createSplitDocPagePrompt = '\n<!-- Put categories/interwikis on the documentation page -->', -- this string is shown when a separate documentation page is created createNoSubstCategory = 'Pages with templates requiring substitution', -- tracking category for using {{docc}} without substitution -- strings used in p.docPage(): contents shown in documentation page docPagePrompt = 'This is the documentation page. It %s transcluded into %s. See [[Template:Documentation]] for more information.', -- message shown as documentation header in documentation pages. Params: word used when page is a module or not; code page's type docPagePromptWill = 'is', -- word used when code page is a module page docPagePromptShould = 'should be', -- word used when code is not a module page docPageBadDocPrompt = "<br>'''This %s's documentation needs improving or additional information.'''", -- additional message if a documentation page marked as baddoc docPageCategory = 'Documentation pages', -- tracking category for documentation pages -- strings used in p.page(): contents shown in code page pageNoDocPrompt = "'''This %s has no documentation. If you know how to use this %s, please create it.'''", -- message shown when a separate documentation page is not exist, both parameters refers to page type pageNoDocCategory = '%ss with no documentation', -- tracking category for pages without documentation, parameters refers to page type pageNoDocCategoryDefault = 'Pages with no documentation', -- fallback tracking category for pages without documentation pageBadDocPrompt = "'''This %s's documentation needs improving or additional information.'''\n", -- message shown when a documentation page marked as baddoc, both parameters refers to page type pageBadDocCategory = '%ss with bad documentation', -- tracking category for pages marked as baddoc, parameters refers to page type pageBadDocCategoryDefault = 'Pages with bad documentation', -- fallback tracking category for pages marked as baddoc pageDocHeaderTitle = 'Documentation', -- message shown as the title of the documentation header pageDocJumpToCode = 'Jump to code β΄', -- text of the link to jump to the code pageDocHeaderBottom = 'The above documentation is transcluded from %s.', -- message shown as the bottom line of the documentation header } -- Customizable functions local function pageCategoryHandler( category ) return mw.getCurrentFrame():expandTemplate{ title = 'translation category', args = { category, project = '0' } } end -- Load modules local loadStyles = require( 'Module:TSLoader' ).call local static = require( 'Module:Static' ) if not static.Documentation then static.Documentation = {} end -- Internal functions local function getType( namespace, page ) local pageType = 'template' if namespace == 'Module' then pageType = 'module' elseif namespace == 'Widget' then pageType = 'widget' elseif page.fullText:gsub( '/' .. i18n.defaultDocPage .. '$', '' ):find( '%.css$' ) then pageType = 'stylesheet' elseif page.fullText:gsub( '/' .. i18n.defaultDocPage .. '$', '' ):find( '%.js$' ) then pageType = 'script' elseif namespace == 'MediaWiki' then pageType = 'message' end return pageType end local function getDisplayType( pageType ) return i18n[ 'pageType_' .. pageType ] or i18n.pageType_template end -- Exported functions function p.create( f ) -- Creating a documentation page or transclusion through {{subst:docc}} local args = require( 'Module:ProcessArgs' ).norm() local page = mw.title.getCurrentTitle() local docPage = args.page or i18n.commonNamespacedPageWithSub:format( page.nsText, page.baseText, i18n.defaultDocPage ) local out if not args.content and tostring( page ) == docPage then local pageType = mw.ustring.lower( args.type or getType( page.nsText, page ) ) local pageTypeDisplay = getDisplayType( pageType ) out = f:preprocess( mw.title.new( i18n.defaultPreload ):getContent():gsub( '$1' , pageTypeDisplay ) ) else local templateArgs = {} for _, key in ipairs{ 'type', 'page', 'content', 'nodoc', 'baddoc' } do local val = args[ key ] if val then if key == 'content' then val = '\n' .. val .. '\n' end table.insert( templateArgs, key .. '=' .. val ) end end out = '{{documentation|' .. table.concat( templateArgs, '|' ) .. '}}' out = out:gsub( '|}}', '}}' ) out = i18n.createOutputFormat:format( out, args.content and '' or i18n.createSplitDocPagePrompt ) end if not mw.isSubsting() then out = f:preprocess( out ) if not args.nocat then out = out .. i18n.commonInternalLink:format( i18n.commonNamespacedPage:format( i18n.namespaceCategory, i18n.createNoSubstCategory ) ) end end return out end function p.docPage( f ) -- Header on the documentation page local args = require( 'Module:ProcessArgs' ).merge( true ) local badDoc = args.baddoc if badDoc then static.Documentation.badDoc = '1' end local page = mw.title.getCurrentTitle() local subpage = page.subpageText if subpage == i18n.defaultSandboxPage or subpage == i18n.defaultTestCasePage then page = page.basePageTitle end local docPage = mw.title.new( args.page or i18n.commonNamespacedPageWithSub:format( page.nsText, page.baseText, i18n.defaultDocPage ) ) if docPage ~= page then return end local namespace = page.nsText local pageType = mw.ustring.lower( args.type or getType( namespace, page ) ) local pageTypeDisplay = getDisplayType( pageType ) local body = mw.html.create( 'div' ):addClass( 'documentation' ) body :addClass( badDoc and 'documentation-badDoc' or '' ) :tag( 'div' ) :attr( 'id', 'documentation-header-tools' ) :wikitext( i18n.linkBar:format( i18n.linkFormat:format( i18n.commonInternalLinkPipe:format( i18n.commonNamespacedPageWithSub:format( i18n.namespaceSpecial, i18n.specialPurge, page.fullText ), i18n.linkTextPurge ) ) ) ) :done() :wikitext( i18n.docPagePrompt:format( pageType == 'module' and i18n.docPagePromptWill or i18n.docPagePromptShould, i18n.commonInternalLink:format( i18n.commonNamespacedPage:format( namespace, page.baseText ) ) ) ) if badDoc then body:wikitext( i18n.docPageBadDocPrompt:format( pageTypeDisplay ) ) end if not ( args.nocat or namespace == i18n.namespaceUser ) then body:wikitext( i18n.commonInternalLink:format( i18n.commonNamespacedPage:format( i18n.namespaceCategory, i18n.docPageCategory ) ) ) end return loadStyles( i18n.defaultStyles ) .. tostring( body ) end function p.page( f ) -- Wrapper around the documentation on the main page -- mw.text.trim uses mw.ustring.gsub, which silently fails on large strings local function trim( s ) return ( s:gsub( '^[\t\r\n\f ]+', '' ):gsub( '[\t\r\n\f ]+$', '' ) ) --return string.gsub( s, '^[\t\r\n\f ]*(.-)[\t\r\n\f ]*$', '%1' ) end local args = require( 'Module:ProcessArgs' ).merge( true ) local page = mw.title.getCurrentTitle() local subpage = page.subpageText if subpage == i18n.defaultSandboxPage or subpage == i18n.defaultTestCasePage then page = page.basePageTitle end local namespace = page.nsText local docText = trim( args.content or '' ) if docText == '' then docText = nil end local docPage local noDoc if docText then docPage = page else docPage = mw.title.new( args.page or i18n.commonNamespacedPageWithSub:format( namespace, page.text, i18n.defaultDocPage ) ) noDoc = args.nodoc or not docPage.exists end local badDoc = args.baddoc local pageType = mw.ustring.lower( args.type or getType( namespace, page ) ) local pageTypeDisplay = getDisplayType( pageType ) if not docText and not noDoc then docText = trim( f:expandTemplate{ title = ':' .. docPage.fullText } ) if static.Documentation.badDoc and static.Documentation.badDoc == '1' then badDoc = 1 end if docText == '' then docText = nil noDoc = 1 end end if docText then docText = '\n' .. docText .. '\n' end local docClass = '' local message local category if noDoc then docClass = 'documentation-noDoc' message = i18n.pageNoDocPrompt:format( pageTypeDisplay, pageTypeDisplay ) if not ( args.nocat or namespace == i18n.namespaceUser ) then category = i18n.pageNoDocCategory:format( pageTypeDisplay ) if not mw.title.new( i18n.commonNamespacedPage:format( i18n.namespaceCategory, category ) ).exists then category = i18n.pageNoDocCategoryDefault end end elseif badDoc then docClass = 'documentation-badDoc' message = i18n.pageBadDocPrompt:format( pageTypeDisplay ) if not ( args.nocat or namespace == i18n.namespaceUser ) then category = i18n.pageBadDocCategory:format( pageTypeDisplay ) if not mw.title.new( i18n.commonNamespacedPage:format( i18n.namespaceCategory, category ) ).exists then category = i18n.pageBadDocCategoryDefault end end end -- Generates the link bar local links = mw.html.create( 'span' ) :attr( 'id', 'documentation-header-tools' ) local linkList = {} if not noDoc then if page ~= docPage then table.insert( linkList, i18n.linkFormat:format( i18n.commonInternalLinkPipe:format( docPage.fullText, i18n.linkTextView ) ) ) end table.insert( linkList, i18n.linkFormat:format( i18n.commonInternalLinkPipe:format( i18n.commonNamespacedPageWithSub:format( i18n.namespaceSpecial, i18n.specialEdit, docPage.fullText ), i18n.linkTextEdit ) ) ) table.insert( linkList, i18n.linkFormat:format( i18n.commonInternalLinkPipe:format( i18n.commonNamespacedPageWithSub:format( i18n.namespaceSpecial, i18n.specialHistory, docPage.fullText ), i18n.linkTextHistory ) ) ) else table.insert( linkList, i18n.linkFormat:format( i18n.commonExternalLinkWithName:format( docPage:canonicalUrl{ action = 'edit', preload = i18n.defaultPreload, preloadparams = pageTypeDisplay }, i18n.linkTextCreate ) ) ) end table.insert( linkList, i18n.linkFormat:format( i18n.commonInternalLinkPipe:format( i18n.commonNamespacedPageWithSub:format( i18n.namespaceSpecial, i18n.specialPurge, docPage.fullText ), i18n.linkTextPurge ) ) ) links:wikitext( i18n.linkBar:format( table.concat( linkList, i18n.linkSeparator ) ) ) local body = mw.html.create( 'div' ):addClass( 'documentation' ) body :addClass( docClass ) local header = mw.html.create( 'div' ) :addClass( 'documentation-header-top' ) header :node( links ) :tag( 'span' ) :addClass( 'documentation-header-title' ) :wikitext( i18n.pageDocHeaderTitle ) local codePages = { module = true, stylesheet = true, script = true, } if not noDoc and codePages[ pageType ] then header :tag( 'span' ) :attr( 'id', 'documentation-jump-to-code' ) :wikitext( i18n.commonInternalLinkPipe:format( '#the-code', i18n.pageDocJumpToCode ) ) end body :node( header ):done() :wikitext( message ) :wikitext( docText ) if not noDoc and page ~= docPage then body :tag( 'div' ) :addClass( 'documentation-header-bottom' ) :node( links ) :wikitext( i18n.pageDocHeaderBottom:format( i18n.commonInternalLink:format( docPage.fullText ) ) ) end if category then body:wikitext( pageCategoryHandler( category ) ) end local anchor = '' if not noDoc and pageType ~= 'template' and pageType ~= 'message' then anchor = mw.html.create( 'div' ):attr( 'id', 'the-code' ) end return loadStyles( i18n.defaultStyles ) .. tostring( body ) .. tostring( anchor ) end return p
Summary:
Please note that all contributions to Modded Wiki are considered to be released under the Creative Commons Attribution-NonCommercial-ShareAlike (see
Wiki:Copyrights
for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Navigation menu
Personal tools
Not logged in
Talk
Contributions
Create account
Log in
Namespaces
Module
Discussion
English
Views
Read
Edit source
View history
More
Refresh
Search
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Tools
What links here
Related changes
Special pages
Page information