全站通知:

模块:Tabs

来自星露谷物语维基
跳到导航 跳到搜索
[ 创建 | 刷新 ]文档页面
当前模块文档缺失,需要扩充。
local utils = require("Module:Utils")

local p = {}

local function parseTabsData(args, usePositional)
    local tabsData = {}
    local i = 1

    while true do
        local title, content

        if usePositional then
            title = args[i]
            content = args[i + 1]
            i = i + 2
        else
            title = args['title' .. i]
            content = args['content' .. i]
            i = i + 1
        end

        if not title or mw.text.trim(title) == '' then break end

        table.insert(tabsData, {title = title, content = content or ''})
    end

    return tabsData
end

local function createWidgetContent(content, isFirst)
    local widgetName = isFirst and 'Details1' or 'Details'

    return table.concat({
        '{{#Widget:' .. widgetName .. '}}', '{{#Widget:Summary}}',
        '{{#Widget:Summary2}}', content, '{{#Widget:Details2}}'
    })
end

local function renderTabs(tabsData, align, frame)
    local root = mw.html.create('div')
    root:addClass('custom-tabs-container')

    local tablist = root:tag('div')
    tablist:addClass('custom-tabs-list'):addClass('justify-content-' .. align)
        :attr('role', 'tablist')

    local contentContainer = root:tag('div')
    contentContainer:addClass('custom-tabs-content')

    contentContainer:tag('div'):wikitext(
        "{{#Widget:Details}}{{#Widget:Summary}}{{#Widget:Summary2}}{{#Widget:Details2}}")

    for index, data in ipairs(tabsData) do
        local tabLink = tablist:tag('a')
        tabLink:addClass('custom-tabs-tab'):attr('role', 'tab'):wikitext(
            data.title)

        local tabPanel = contentContainer:tag('div')
        tabPanel:addClass('custom-tabs-panel'):attr('role', 'tabpanel')

        if index == 1 then
            tabLink:addClass('is-active'):attr('aria-selected', 'true')
        end

        local detailsContent = createWidgetContent(data.content, index == 1)
        tabPanel:wikitext(detailsContent)
    end

    contentContainer:tag('div'):wikitext(
        "{{#Widget:Details}}{{#Widget:Summary}}{{#Widget:Summary2}}{{#Widget:Details2}}")

    return frame:preprocess(tostring(root))
end

local function processTabs(frame, usePositional)
    local args
    local errorMsg

    if usePositional then
        local getArgs = require('Module:Arguments').getArgs
        args = getArgs(frame, {trim = true, removeBlanks = false})
        errorMsg =
            '错误:未提供任何有效的标签页数据。请按顺序提供参数:|标题1|内容1|标题2|内容2...'
    else
        args = frame:getParent().args
        errorMsg =
            '错误:未提供任何有效的标签页数据。请使用“|title1=...”和“|content1=...”格式提供参数。'
    end

    local align = args.align or 'left'
    local tabsData = parseTabsData(args, usePositional)

    if #tabsData == 0 then
        return '<div class="errorbox">' .. errorMsg .. '</div>'
    end

    return renderTabs(tabsData, align, frame)
end

function p.tabs(frame) return processTabs(frame, false) end

function p.tabs2(frame) return processTabs(frame, true) end

return p