Module:Documentation

-- local yesno = require("Module:Yesno")

local p = {}

local i18n = { codejump = 'Jump to code ↴', header = '%s Documentation', doccat = 'Category:%s documentation', doc_msg = 'This is the documentation page, it should be transcluded into the main %s page. See Template:Documentation for more information', nocat = 'Category:Pages with templates requiring substitution', nodoc = 'This %s has no documentation. If you know how to use this %s, [%s please create it] .', nodoc_cat = 'Category:%s with no documentation', pagetype_module = 'module', pagetype_stylesheet = 'stylesheet', pagetype_script = 'script', pagetype_template = 'template', transcluded = 'The above documentation is transcluded from %s.' }

local function getType( namespace, page ) local pageType = i18n['pagetype_template'] if namespace == 'Module' then pageType = i18n['pagetype_module'] elseif page.fullText:gsub( '/doc$', '' ):find( '%.css$' ) then pageType = i18n['pagetype_stylesheet'] elseif page.fullText:gsub( '/doc$', '' ):find( '%.js$' ) then pageType = i18n['pagetype_script'] end return pageType end

local function ucfirst( s ) return mw.ustring.upper( mw.ustring.sub( s, 1, 1 ) ) .. mw.ustring.sub( s, 2 ) end

-- Returns true if `f` is probably a Scribunto Frame object local function isFrame( f ) return type( f ) == 'table' and type( f.args ) == 'table' and type( f.getParent ) == 'function' end

-- Creating a documentation page or transclution through function p.create( f ) local args = require( 'Module:ProcessArgs' ).norm

local page = args.page and mw.title.new( args.page ) or mw.title.getCurrentTitle

local docPage = page.nsText .. ':' .. page.baseText .. '/doc' local out if page.fullText == docPage then out = f:preprocess( '' ) else local pageType = '' if args.type then pageType = '|type=' .. args.type end out = '\n' .. ''	end if not mw.isSubsting then out = f:preprocess( out ) if not args.nocat then out = out ..  .. i18n['nocat'] ..  end end return out end

-- Header on the documentation page function p.docPage( f ) local args if isFrame( f ) then args = require( 'Module:ProcessArgs' ).merge( true ) else args = f		f = mw.getCurrentFrame end

local page = args.page and mw.title.new( args.page ) or mw.title.getCurrentTitle

if page.subpageText ~= 'doc' and not args.demo then return end local namespace = page.nsText local pageType = mw.ustring.lower( args.type or getType( namespace, page ) ) local body = mw.html.create( 'div' ) body :css{ ['margin-bottom'] = '0.8em', padding = '0.8em 1em 0.7em', ['background-color'] = 'inherit', border = '1px solid #AAA' }		:tag( 'div' ) :css( 'float', 'right' ) :wikitext( '', page:fullUrl( 'action=purge' ), ' purge' ) :done :wikitext(string.format(i18n['doc_msg'], pageType)) if not args.nocat and not args.demo then body:wikitext(  .. string.format( i18n['doccat'], ucfirst( pageType ) ) ..  ) end return body end

-- Wrapper around the documentation on the main page function p.page( f ) local args if isFrame( f ) then args = require( 'Module:ProcessArgs' ).merge( true ) else args = f		f = mw.getCurrentFrame end

local page = args.page and mw.title.new( args.page ) or mw.title.getCurrentTitle

local namespace = page.nsText local docPage = mw.title.new( namespace .. ':' .. page.text .. '/doc' ) local noDoc = args.nodoc or not docPage.exists local pageType = mw.ustring.lower( args.type or getType( namespace, page ) ) local docText if not noDoc then docText = mw.text.trim( f:expandTemplate{ title = ':' .. docPage.fullText } ) if docText == '' then docText = nil noDoc = 1 else docText = '\n' .. docText .. '\n' end end local action = 'edit' local preload = '' local colour = 'inherit' local message local category if noDoc then action = 'create' preload = '&redlink=1&preload=Template:Documentation/preload' colour = 'inherit' message = string.format("" .. i18n['nodoc'] .. "", pageType, pageType, docPage:fullUrl( 'action=edit' .. preload )) if not args.nocat then category = string.format(i18n['nodoc_cat'], ucfirst( pageType .. 's' ) ) if not mw.title.new( category ).exists then category = string.format(i18n['nodoc_cat'],'Page') end end end local links = {  .. action .. , 'purge' }	if not noDoc then table.insert( links, 1, 'view' ) end links = mw.html.create( 'span' ) :css( 'float', 'right' ) :wikitext( mw.text.nowiki( '[' ), table.concat( links, ' | ' ), mw.text.nowiki( ']' ) ) local body = mw.html.create( 'div' ) body:css{ ['background-color'] = colour, border = '1px solid #AAA', padding = '0.8em 1em 0.7em', ['margin-top'] = '1em', clear = 'both' }	local header = mw.html.create( 'div' ) :css{ margin = '-0.8em -1em 0.8em', padding = '0.8em 1em 0.7em', ['background-color'] = 'inherit', ['border-bottom'] = 'inherit' }	header :node( links ) :tag( 'span' ) :css{ ['font-weight'] = 'bold', ['font-size'] = '130%', ['margin-right'] = '1em', ['line-height'] = '1' }			:wikitext( i18n['header']:format( ucfirst( pageType ) ) ) if not noDoc and pageType ~= i18n['pagetype_template'] and pageType ~= 'message' then header :tag( 'span' ) :css( 'white-space', 'nowrap' ) :wikitext(  .. i18n['codejump'] ..  ) end body :node( header ) :wikitext( message ) :wikitext( docText ) if not noDoc then body :tag( 'div' ) :css{ margin = '0.7em -1em -0.7em', ['background-color'] = 'inherit', ['border-top'] = 'inherit', padding = '0.8em 1em 0.7em', clear = 'both' }				:node( links ) :wikitext( i18n['transcluded']:format( docPage.fullText ) ) end if category then body:wikitext( , category,  ) end local anchor = '' if not noDoc and pageType ~= i18n['pagetype_template'] and pageType ~= 'message' then anchor = mw.html.create( 'div' ):attr( 'id', 'the-code' ) end return tostring( body ) .. tostring( anchor ) end

return p