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