• Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

Module:GakumasCard

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Template-info.svg 模块文档  [创建] [刷新]
local getArgs = require('Module:Arguments').getArgs

local p = {}

-- 角色名称与缩写的对应表
local charaAbbrList = {
    ['花海咲季'] = 'hski',
    ['月村手毬'] = 'ttmr',
    ['藤田言音'] = 'fktn',
    ['有村麻央'] = 'amao',
    ['葛城莉莉娅'] = 'kllj',
    ['仓本千奈'] = 'kcna',
    ['紫云清夏'] = 'ssmk',
    ['篠泽广'] = 'shro',
    ['姬崎莉波'] = 'hrnm',
    ['花海佑芽'] = 'hume',
    ['秦谷美铃'] = 'hmsz',
    ['十王星南'] = 'jsna',
    ['根绪亚纱里'] = 'nasr'
}

-- 通过当前页面匹配对应角色缩写
local function getCharaAbbr(args, frame)
    local pageTitle = frame:preprocess('{{FULLPAGENAME}}')
    return charaAbbrList[pageTitle] or args['角色缩写'] or 'fktn' -- 默认值
end

-- 检查是否需要特殊处理卡图
local function needsSpecialImage(cardName)
    return mw.ustring.find(cardName or '', " '") ~= nil
end

-- 解析卡片信息
local function parseCardInfo(cardInfo)
    if not cardInfo then return {'', '', ''} end
    local parts = mw.text.split(cardInfo, ',')
    for i, v in ipairs(parts) do
        parts[i] = mw.text.trim(v) -- 去除前后空格
    end
    -- 确保总是返回3个值
    return {
        parts[1] or '',
        parts[2] or '',
        parts[3] or ''
    }
end

function p.main(frame)
    local args = getArgs(frame)
    return p._main(args, frame)
end

function p._main(args, frame)
    -- 定义共通样式
    local labelColor = args['LabelColor'] or '#F39800'
    local sharedStyle = {
        ['data-label-color'] = labelColor,
        ['data-label-border-color'] = 'transparent',
        ['data-text-border-color'] = 'transparent',
        ['data-label-background-color'] = 'transparent',
        ['data-text-background-color'] = 'transparent',
        ['data-text-padding'] = '1px',
        ['data-label-color-side-reverse'] = 'yes'
    }
    
    -- 获取角色缩写
    local charaAbbr = getCharaAbbr(args, frame)
    
    -- 开始构建外层容器
    local container = mw.html.create('div')
    container
        :addClass('Tabs bg_image auto_width')
        :attr('style', 'background-size: 1500px;')
        :attr('data-auto-width', 'yes')
    
    -- 添加共通样式属性
    for k, v in pairs(sharedStyle) do
        container:attr(k, v)
    end
    
    -- 添加主标签容器
    local mainTab = container:tag('div'):addClass('Tab')
    
    -- 循环处理3种卡片稀有度
    for rarityToggle = 1, 3 do
        local rarity, rarityIcon
        if rarityToggle == 1 then
            rarity = 'R'
            rarityIcon = 'r'
        elseif rarityToggle == 2 then
            rarity = 'SR'
            rarityIcon = 'sr'
        else
            rarity = 'SSR'
            rarityIcon = 'ssr'
        end
        
        -- 检查该稀有度是否存在卡片
        local cardCount = tonumber(args[rarity .. '卡片数量'])
        if cardCount > 0 then
            -- 添加稀有度标签
            mainTab
                :tag('div')
                :addClass('TabLabelText')
                :attr('style', 'margin-right: 3px')
                :wikitext('[[File:imas_gakuen_icon_rarity_' .. rarityIcon .. '.png|35px|alt=' .. rarity .. '|link=]]')
                :done()
            
            -- 添加卡片内容区域
            local contentDiv = mainTab:tag('div'):addClass('TabContentText')
            local innerTabs = contentDiv:tag('div'):addClass('Tabs')
            
            -- 添加共通样式属性
            for k, v in pairs(sharedStyle) do
                innerTabs:attr(k, v)
            end
            
            -- 循环处理该稀有度的每张卡片
            for cardIndex = 1, cardCount do
                -- 解析卡片信息
                local cardInfoParts = parseCardInfo(args[rarity .. '卡片信息' .. cardIndex])
                local cardId = cardInfoParts[1]
                local cardPlan = cardInfoParts[2]
                local cardEffect = cardInfoParts[3]
                
                -- 处理计划类型图标
                local planIcon
                if cardPlan == '理性' or cardPlan == 'logic' then
                    planIcon = 'logic'
                elseif cardPlan == '感性' or cardPlan == 'sense' then
                    planIcon = 'sense'
                elseif cardPlan == '非凡' or cardPlan == 'extraordinary' then
                    planIcon = 'extraordinary'
                else
                    planIcon = 'logic' -- 默认
                end
                
                -- 处理效果类型图标
                local effectIcon
                if cardEffect == '1' or cardEffect == '好调' then
                    effectIcon = '1'
                elseif cardEffect == '2' or cardEffect == '好印象' then
                    effectIcon = '2'
                elseif cardEffect == '3' or cardEffect == '干劲' then
                    effectIcon = '3'
                elseif cardEffect == '4' or cardEffect == '集中' then
                    effectIcon = '4'
                elseif cardEffect == '5' or cardEffect == '全力' then
                    effectIcon = '5'
                elseif cardEffect == '6' or cardEffect == '坚决' then
                    effectIcon = '6'
                else
                    effectIcon = '1' -- 默认
                end
                
                -- 获取卡名
                local cardName = args[rarity .. '卡名' .. cardIndex] or ''
                local specialImage = needsSpecialImage(cardName)
                
                -- 添加卡片标签
                local cardTab = innerTabs:tag('div'):addClass('Tab')
                cardTab
                    :tag('div')
                    :addClass('TabLabelText')
                    :attr('style', 'font-weight: bold; margin-right: 3px')
                    :wikitext('[[File:imas_gakuen_icon_plan_' .. planIcon .. '.png|18px|link=]]' ..
                              '[[File:imas_gakuen_icon_effect_' .. effectIcon .. '.png|22px|link=]]' ..
                              cardName)
                    :done()
                
                -- 添加卡片内容
                local cardContent = cardTab:tag('div'):addClass('TabContentText')
                
                -- 桌面端视图:悬停切换
                local desktopView = cardContent:tag('div'):addClass('nomobile hover-change')
                desktopView
                    :tag('div')
                    :addClass('hover-change-before')
                    :wikitext('[[File:imas_gakuen_cidol-' .. charaAbbr .. '-' .. rarityToggle .. '-' .. cardId .. '_0-full.png|300px|alt=' .. cardName .. '|link=]]')
                    :done()
                
                -- 根据是否需要特殊处理决定是否显示不同的图片
                local afterDiv = desktopView:tag('div'):addClass('hover-change-after')
                if specialImage then
                    -- 满足特殊条件时使用觉醒前图片
                    afterDiv:wikitext('[[File:imas_gakuen_cidol-' .. charaAbbr .. '-' .. rarityToggle .. '-' .. cardId .. '_0-full.png|300px|alt=' .. cardName .. '|link=]]')
                else
                    -- 正常情况使用觉醒后图片
                    afterDiv:wikitext('[[File:imas_gakuen_cidol-' .. charaAbbr .. '-' .. rarityToggle .. '-' .. cardId .. '_1-full.png|300px|alt=' .. cardName .. '|link=]]')
                end
                
                -- 移动端视图:标签页切换
                local mobileView = cardContent:tag('div'):addClass('mobileonly Tabs')
                for k, v in pairs(sharedStyle) do
                    mobileView:attr(k, v)
                end
                
                local mobileTab = mobileView:tag('div'):addClass('Tab')
                mobileTab
                    :tag('div')
                    :addClass('TabLabelText')
                    :wikitext('觉醒前')
                    :done()
                    :tag('div')
                    :addClass('TabContentText')
                    :wikitext('[[File:imas_gakuen_cidol-' .. charaAbbr .. '-' .. rarityToggle .. '-' .. cardId .. '_0-full.png|center|300px|alt=' .. cardName .. '|link=]]')
                    :done()
                    :tag('div')
                    :addClass('TabLabelText')
                    :wikitext('觉醒后')
                    :done()
                
                    local afterContent = mobileTab:tag('div'):addClass('TabContentText')
                    if specialImage then
                        -- 满足特殊条件时使用觉醒前图片
                        afterContent:wikitext('[[File:imas_gakuen_cidol-' .. charaAbbr .. '-' .. rarityToggle .. '-' .. cardId .. '_0-full.png|center|300px|alt=' .. cardName .. '|link=]]')
                    else
                        -- 正常情况使用觉醒后图片
                        afterContent:wikitext('[[File:imas_gakuen_cidol-' .. charaAbbr .. '-' .. rarityToggle .. '-' .. cardId .. '_1-full.png|center|300px|alt=' .. cardName .. '|link=]]')
                    end
            end
        end
    end
    
    return tostring(container)
end

return p