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