Module:Documentation

From Minetest Wiki
Jump to navigation Jump to search

Documentation for this module may be created at Module:Documentation/doc

local p = {}

local HtmlBuilder = require('Module:HtmlBuilder')
local getLanguageCode = require('Module:Languages').getLanguageCode
local makeInvokeFunc = require('Module:Arguments').makeInvokeFunc

function p._main(frame, args)
    local headingParam = args['heading']
    local contentParam = args['content']
    local linkBoxParam = args['link box']
    local currentTitle = mw.title.getCurrentTitle()
    local docPageName = args[1]
    if not docPageName then
        local currentLangCode = getLanguageCode(currentTitle)
        local pageName = args['page']
        if pageName then
            if currentLangCode == 'en' then
                docPageName = pageName .. '/doc'
            else
                docPageName = pageName .. '/doc/' .. currentLangCode
            end
        else
            if currentLangCode == 'en' then
                docPageName = currentTitle.fullText .. '/doc'
            else
                local namespace = currentTitle.nsText
                local basePageName = currentTitle.baseText
                docPageName = namespace .. ':' .. basePageName  .. '/doc/' .. currentLangCode
            end
        end
    end
    local docPageTitle = mw.title.new(docPageName)

    local root = HtmlBuilder.create()

    local startBox = root:tag('div')
    startBox:cssText('clear: both; margin: 1em 0 0 0; border: 1px solid #aaa; background-color: #ecfcf4; padding: 12px')

    -- Add heading if non-empty
    if headingParam ~= '' then
        local headingDiv = startBox:tag('div')
        headingDiv:cssText('padding-bottom: 3px; border-bottom: 1px solid #aaa; margin-bottom: 1ex')

        local headingSpan = headingDiv:tag('span')
        headingSpan:cssText('font-weight: bold; font-size: 125%')
        if headingParam then
            headingSpan:wikitext(headingParam)
        else
            headingSpan:wikitext('[[File:Documentation icon.png|50px|link=]] ' .. args['default-heading'])
        end

        -- Add action links if doc is not on template page
        if not contentParam then
            local actionsSpan = headingDiv:tag('span')
            actionsSpan:addClass('plainlinks')
            actionsSpan:cssText('font-size: small; font-weight: 400; margin-left: 1em; vertical-align: baseline; line-height: 1em; display: inline-block')

            local function escapeBrackets(s)
                -- Replace brackets with HTML entities
                s = s:gsub('%[', '[')
                s = s:gsub('%]', ']')
                return s
            end

            if docPageTitle.exists then
                format = '[%s] [%s] [%s] [%s]'
                local viewLink = '[[:' .. docPageName .. '|' .. args['view-link-display'] .. ']]'
                local editLink = '[' .. docPageTitle:fullUrl{action = 'edit'} .. ' ' .. args['edit-link-display'] .. ']'
                local historyLink = '[' .. docPageTitle:fullUrl{action = 'history'} .. ' ' .. args['history-link-display'] .. ']'
                local purgeLink = '[' .. currentTitle:fullUrl{action = 'purge'} .. ' ' .. args['purge-link-display'] .. ']'
                actionsSpan:wikitext(mw.ustring.format(escapeBrackets('[%s] [%s] [%s] [%s]'), viewLink, editLink, historyLink, purgeLink))
            else
                local createLink = '[' .. docPageTitle:fullUrl{action = 'edit'} .. ' ' .. args['create-link-display'] .. ']'
                actionsSpan:wikitext(mw.ustring.format(escapeBrackets('[%s]'), createLink))
            end
        end
    end

    -- Transclude doc contents
    local content = contentParam
    if not content and docPageTitle.exists then
        content = frame:expandTemplate{title = ':' .. docPageName}
    end
    if content then
        -- Add line breaks so headings at start and end are interpreted correctly
        startBox:wikitext('\n' .. content .. '\n')
    end

    -- Prevent floating items from sticking out of doc box
    local clear = startBox:tag('div')
    clear:css('clear', 'both')

    if not contentParam and linkBoxParam ~= 'off' and docPageTitle.exists then
        local endBox = root:tag('div')
        endBox:addClass('plainlinks')
        endBox:cssText('clear: both; width: 100%; border: 1px solid #aaa; margin: .2em 0; background-color: #ecfcf4')

        local endBoxNode = endBox:tag('div')
        endBoxNode:cssText('border: none; width: 100%; padding: .25em .9em; font-style: italic')
        if linkBoxParam then
            endBoxNode:wikitext(linkBoxParam)
        else
            endBoxNode:wikitext(mw.ustring.format(args['transcluded-from-blurb'], '[[:' .. docPageName .. '|' .. docPageName .. ']]'), ' ')

            local editUrl = docPageTitle:fullUrl{action = 'edit'}
            local historyUrl = docPageTitle:fullUrl{action = 'history'}
            local actionsNode = endBoxNode:tag('small')
            actionsNode:cssText('font-style: normal')
            actionsNode:wikitext('([', editUrl, ' ' .. args['edit-link-display'] .. '] | [', historyUrl, ' ' .. args['history-link-display'] .. '])')
        end
    end

    return tostring(root)
end

p.main = makeInvokeFunc(p._main, {passFrameParam = true, inherited = true})

return p