七日内新公告:全站维护公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

Module:ImasCard/Gakuen

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

-- 从数据模块加载预定义数据表
local data = mw.loadData('Module:ImasCard/Gakuen/Data')
local charaAbbrList = data.charaAbbrList  -- 提供角色名称与缩写转换功能
local rarities = data.rarities  -- 卡片稀有度标识
local planIconMap = data.planIconMap  -- 计划类型
local effectIconMap = data.effectIconMap  -- 效果类型

-- 缓存常用字符串
local FILE_FORMAT = "[[File:%s|%s|link=]]"
local CARD_IMAGE_FORMAT = "imas_gakuen_cidol-%s-%d-%s%s-full.png"

-- 获取角色缩写,支持直接从页面名称获取角色名称并转换为角色缩写
local function getCharaAbbr(args, frame)
    local pageTitle = frame:preprocess('{{FULLPAGENAME}}')
    return charaAbbrList[pageTitle] or args['角色缩写'] or 'fktn'
end

-- 自动检测卡片数量
local function getCardCount(args, rarity)
    local count = 0
    while true do
        count = count + 1
        if not args[rarity .. '卡名' .. count] then
            return count - 1
        end
    end
end

-- 解析用户传入的卡面参数:ID,计划,效果
local function parseCardInfo(cardInfo)
    if not cardInfo then return {id = '', plan = '', effect = ''} end
    
    local first, second, third = cardInfo:match('^%s*([^,]+)%s*,%s*([^,]+)%s*,%s*([^,]+)%s*$')
    if first then
        return {id = first, plan = second, effect = third}
    end
    
    -- 回退方法
    local parts = {}
    for part in cardInfo:gmatch('[^,]+') do
        parts[#parts + 1] = part:match('^%s*(.-)%s*$')
    end
    return {
        id = parts[1] or '',
        plan = parts[2] or '',
        effect = parts[3] or ''
    }
end

-- 检测卡图是否需要特殊处理:包含“ '”(例如“ '24夏”“ '25バレンタイン”)名称的卡图觉前觉后一致
local function needsSpecialImage(cardName)
    return cardName and cardName:find(" '") ~= nil
end

-- 生成卡图链接
local function getCardImage(charaAbbr, rarityIndex, cardId, isSpecial)
    local suffix = isSpecial and "_0" or "_1"
    return FILE_FORMAT:format(
        CARD_IMAGE_FORMAT:format(charaAbbr, rarityIndex, cardId, suffix),
        "300px"
    )
end

-- 主函数
function p.main(frame)
    local args = getArgs(frame)
    return p._main(args, frame)
end

function p._main(args, frame)
    -- 定义共通样式
    local sharedStyle = {
        ['data-label-color'] = (args['LabelColor'] and mw.text.decode(args['LabelColor'])) or '#F39800',  -- 如果颜色码由其他模板或模块传入,其中的#会以HTML实体呈现,需要进行解码
        ['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')
        :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')
    
    -- 循环处理稀有度
    for _, rarity in ipairs(rarities) do
        local cardCount = getCardCount(args, rarity.name)
        
        if cardCount > 0 then
            -- 添加稀有度标签
            mainTab:tag('div')
                :addClass('TabLabelText')
                :attr('style', 'margin-right: 3px')
                :wikitext(FILE_FORMAT:format(
                    "imas_gakuen_icon_rarity_" .. rarity.icon .. ".png", 
                    "35px"
                ))
                :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 cardName = args[rarity.name .. '卡名' .. cardIndex] or ''
                local cardInfo = parseCardInfo(args[rarity.name .. '卡片信息' .. cardIndex])
                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_FORMAT:format(
                            "imas_gakuen_icon_plan_" .. (planIconMap[cardInfo.plan] or 'logic') .. ".png",
                            "18px"
                        ) ..
                        FILE_FORMAT:format(
                            "imas_gakuen_icon_effect_" .. (effectIconMap[cardInfo.effect] or '1') .. ".png",
                            "22px"
                        ) ..
                        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(getCardImage(charaAbbr, rarity.index, cardInfo.id, true))
                    :done()
                desktopView:tag('div')
                    :addClass('hover-change-after')
                    :wikitext(getCardImage(charaAbbr, rarity.index, cardInfo.id, specialImage))
                
                -- 移动视图:标签页切换
                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(getCardImage(charaAbbr, rarity.index, cardInfo.id, true))
                    :done()
                    :tag('div'):addClass('TabLabelText'):wikitext('觉醒后'):done()
                    :tag('div'):addClass('TabContentText')
                        :wikitext(getCardImage(charaAbbr, rarity.index, cardInfo.id, specialImage))
            end
        end
    end
    
    return tostring(container)
end

return p