Module:Lua

可在Module:Lua/doc创建此模块的帮助文档

-------------------------------------------------------------------------------
-- 
--                                 Module:Lua
-- 
-- This module implements Template:Lua.
-------------------------------------------------------------------------------

local mTableTools = require('Module:TableTools')
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local p = {}

function p.main(frame)
    local args = getArgs(frame, {
        wrappers = 'Template:Lua'
    })
    return p._main(args)
end

function p._main(args)
    local modules = mTableTools.compressSparseArray(args)
    local box = p.renderBox(modules)
    local trackingCategories = p.renderTrackingCategories(args, modules)
    return box .. trackingCategories
end

---------------------------------------------
--function p.renderBox(modules)
--    local html = mw.html.create('div')
--        :addClass('c-sidebar')
--    if #modules < 1 then
--        html
--            :tag('strong')
--                :addClass('error')
--                :wikitext('Error: no modules specified')
--    else
--        local title = mw.title.getCurrentTitle()
--        if title.subpageText == 'doc' then
--            title = title.basePageTitle
--        end
--        local header = html:tag('div')
--            :cssText('text-align: center;')
--            :tag('p')
--                :wikitext('[[File:Lua programming language logo.svg|40px|alt=Lua logo|link=]]')
--                :done()
--        if title.contentModel == 'Scribunto' then
--            html
--                :tag('p')
--                    :wikitext('This module depends on the following other modules:')
--        else
--            html
--                :tag('p')
--                    :wikitext('This template uses the following modules:')
--        end
--
--        local list = html:tag('ul')
--        for _, module in ipairs(modules) do
--            list
--                :tag('li')
--                    :wikitext(string.format('[[:%s]]', module))
--        end
--    end
--    return tostring(html)
--end
---------------------------------------------

function p.renderBox(modules)
    local box = '<div style="width:344px; height:auto; float:right; clear:none; text-align:left" class="eu4box"><div class="heading">'

    local header
    local content = ''
    if #modules < 1 then
        header = "Error: no modules specified"
    else
        local title = mw.title.getCurrentTitle()
        if title.subpageText == 'doc' then
            title = title.basePageTitle
        end
        if title.contentModel == 'Scribunto' then
            header = "This module depends on the following other modules:"
        else
            header = "This template uses the following modules:"
        end
        
        for _, module in ipairs(modules) do
            content = content .. string.format('[[:%s]]<br>', module)
        end
    end

    box = box .. '<div style="padding: 3px 0px; text-align:left">' .. header .. '</div></div>'
    if #modules > 0 then
        box = box .. content
    end
    box = box .. '</div>'
    return box
end

function p.renderTrackingCategories(args, modules, title)
    if yesno(args.nocat) then
        return ''
    end
    local cats = {}
    local subpageBlacklist = {
        doc = true,
        sandbox = true,
        sandbox2 = true,
        testcases = true
    }
    title = title or mw.title.getCurrentTitle()
    if not subpageBlacklist[title.subpageText] then
        local protCatName
        if title.namespace == 10 then
            local category = args.category or 'Lua-based templates'
            cats[#cats + 1] = category
            protCatName = 'Templates using under-protected modules'
        elseif title.namespace == 828 then
            protCatName = 'Modules depending on under-protected modules'
        end
        if not args.noprotcat and protCatName then
            local protLevels = {
                autoconfirmed = 1,
                extendedconfirmed = 2,
                templateeditor = 3,
                sysop = 4
            }
            local currentProt
            if title.id ~= 0 then
                -- id is 0 (page does not exist) if am previewing before creating a template.
                currentProt = title.protectionLevels["edit"][1]
            end
            if currentProt == nil then
                currentProt = 0
            else
                currentProt = protLevels[currentProt]
            end
            for i, module in ipairs(modules) do
                local moduleProt = mw.title.new(module).protectionLevels["edit"][1]
                if moduleProt == nil then
                    moduleProt = 0
                else
                    moduleProt = protLevels[moduleProt]
                end
                if moduleProt < currentProt then
                    cats[#cats + 1] = protCatName
                    break
                end
            end
        end
    end
    for i, cat in ipairs(cats) do
        cats[i] = string.format('[[Category:%s]]', cat)
    end
    return table.concat(cats)
end

return p