模块:事件
来自卡厄思梦境WIKI
此模块的文档可以在模块:事件/doc创建
local p = {}
local eventData = mw.loadData('模块:事件/data')
-- 原有的main函数保持不变
function p.main(frame)
-- 直接从frame.args获取参数(用于#invoke调用)
local eventName = frame.args[1] or frame.args.name
-- 如果没有找到,尝试从父frame获取(用于模板调用)
if not eventName and frame:getParent() then
local parentArgs = frame:getParent().args
eventName = parentArgs[1] or parentArgs.name
end
if not eventName or eventName == '' then
return "错误:未指定事件名称"
end
local event = eventData[eventName]
if not event then
return "错误:找不到事件 '" .. eventName .. "'"
end
return p._renderEvent(frame, eventName, event)
end
-- 抽取渲染单个事件的函数
function p._renderEvent(frame, eventName, event)
-- 构建HTML
local html = mw.html.create('div')
:addClass('event-container')
:attr('data-event-id', event.id)
-- 图片容器
local imageContainer = html:tag('div')
:addClass('event-image-container')
-- 图片
local imageFile = 'cc_' .. event.id .. '.png'
imageContainer:wikitext('[[File:' .. imageFile .. '|375px|link=]]')
-- 标题条
imageContainer:tag('div')
:addClass('event-title-bar')
:tag('div')
:addClass('event-title')
:wikitext(eventName)
-- 选项容器
local optionsContainer = html:tag('div')
:addClass('event-options-container')
-- 选项
for i = 1, 3 do
if event.option[i] then
local optionWrapper = optionsContainer:tag('div')
:addClass('event-option-wrapper')
local optionDiv = optionWrapper:tag('div')
:addClass('event-option')
:attr('data-option-id', tostring(i))
:attr('data-event-name', eventName)
-- 选项文本
optionDiv:tag('div')
:addClass('option-text')
:wikitext(event.option[i])
-- 效果文本容器(默认隐藏)
local effectDiv = optionWrapper:tag('div')
:addClass('option-effect-container')
:css('display', 'none')
:tag('div')
:addClass('option-effect')
:wikitext(frame:preprocess(event.effect[i]))
end
end
return tostring(html)
end
-- 显示所有事件列表
function p.list(frame)
local args = frame.args
local displayMode = args.mode or "grid" -- grid 或 full
local sortBy = args.sort or "name" -- name, area, rarity
local filterArea = args.area -- 可选:筛选特定区域
local filterRarity = args.rarity -- 可选:筛选特定稀有度
local columns = tonumber(args.columns) or 2 -- 完整布局时的列数
-- 收集并排序事件
local events = {}
for name, data in pairs(eventData) do
-- 应用筛选
local include = true
if filterArea and filterArea ~= '' and data.area ~= filterArea then
include = false
end
if filterRarity and filterRarity ~= '' and data.rarity ~= filterRarity then
include = false
end
if include then
table.insert(events, {name = name, data = data})
end
end
-- 排序
table.sort(events, function(a, b)
if sortBy == "area" then
if a.data.area ~= b.data.area then
return a.data.area < b.data.area
end
return a.name < b.name
elseif sortBy == "rarity" then
if a.data.rarity ~= b.data.rarity then
return a.data.rarity < b.data.rarity
end
return a.name < b.name
else
return a.name < b.name
end
end)
-- 根据显示模式生成HTML
if displayMode == "full" then
return p._generateFullLayout(frame, events, columns)
else
return p._generateGrid(frame, events)
end
end
-- 生成网格视图
function p._generateGrid(frame, events)
local html = mw.html.create('div')
:addClass('event-grid')
for _, event in ipairs(events) do
local card = html:tag('div')
:addClass('event-card')
:attr('data-event-name', event.name)
-- 缩略图
local imageFile = 'cc_' .. event.data.id .. '.png'
card:tag('div')
:addClass('event-card-image')
:wikitext('[[File:' .. imageFile .. '|200px|link=]]')
-- 信息
local info = card:tag('div')
:addClass('event-card-info')
-- 标题
info:tag('div')
:addClass('event-card-title')
:wikitext(event.name)
-- 标签
local tags = info:tag('div')
:addClass('event-card-tags')
if event.data.area then
tags:tag('span')
:addClass('event-tag event-tag-area')
:wikitext(event.data.area)
end
if event.data.rarity then
tags:tag('span')
:addClass('event-tag event-tag-rarity')
:addClass('event-tag-' .. event.data.rarity)
:wikitext(event.data.rarity)
end
-- 查看详情按钮
info:tag('div')
:addClass('event-card-button')
:tag('button')
:addClass('event-view-detail')
:attr('data-event-name', event.name)
:wikitext('查看详情')
end
-- 添加模态框容器
html:tag('div')
:addClass('event-modal')
:attr('id', 'event-modal')
:css('display', 'none')
:tag('div')
:addClass('event-modal-content')
:attr('id', 'event-modal-content')
return tostring(html)
end
-- 生成布局视图
function p._generateFullLayout(frame, events, columns)
local html = mw.html.create('div')
:addClass('event-full-layout')
-- 添加筛选信息
if #events > 0 then
local infoBar = html:tag('div')
:addClass('event-info-bar')
:wikitext('共找到 ' .. #events .. ' 个事件')
end
-- 创建网格容器
local gridContainer = html:tag('div')
:addClass('event-full-grid')
:css('display', 'grid')
:css('grid-template-columns', 'repeat(' .. columns .. ', 1fr)')
:css('gap', '20px')
:css('padding', '20px')
-- 按区域分组(可选)
local currentArea = nil
for _, event in ipairs(events) do
-- 如果按区域排序且区域改变,可以添加分隔
if sortBy == "area" and event.data.area ~= currentArea then
currentArea = event.data.area
-- 添加区域标题(占满整行)
gridContainer:tag('div')
:addClass('event-area-header')
:css('grid-column', '1 / -1')
:tag('h3')
:wikitext(currentArea or '其他')
end
-- 添加事件容器
local eventWrapper = gridContainer:tag('div')
:addClass('event-full-item')
-- 渲染事件
eventWrapper:wikitext(p._renderEvent(frame, event.name, event.data))
end
return tostring(html)
end
return p