事件:修订间差异
来自卡厄思梦境WIKI
无编辑摘要 |
无编辑摘要 |
||
| 第61行: | 第61行: | ||
:wikitext(event.option[i]) | :wikitext(event.option[i]) | ||
-- | -- 效果文本容器(默认隐藏) | ||
local effectDiv = optionWrapper:tag('div') | local effectDiv = optionWrapper:tag('div') | ||
:addClass('option-effect-container') | :addClass('option-effect-container') | ||
| 第68行: | 第68行: | ||
:addClass('option-effect') | :addClass('option-effect') | ||
:wikitext(frame:preprocess(event.effect[i])) | :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, list, table | |||
local sortBy = args.sort or "name" -- name, area, rarity | |||
local filterArea = args.area -- 可选:筛选特定区域 | |||
local filterRarity = args.rarity -- 可选:筛选特定稀有度 | |||
-- 收集并排序事件 | |||
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 == "table" then | |||
return p._generateTable(frame, events) | |||
elseif displayMode == "list" then | |||
return p._generateList(frame, events) | |||
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') | |||
-- 缩略图 | |||
local imageFile = 'cc_' .. event.data.id .. '.png' | |||
card:tag('div') | |||
:addClass('event-card-image') | |||
:wikitext('[[File:' .. imageFile .. '|200px|link=' .. event.name .. ']]') | |||
-- 信息 | |||
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 | |||
end | |||
return tostring(html) | |||
end | |||
-- 生成列表视图 | |||
function p._generateList(frame, events) | |||
local html = mw.html.create('div') | |||
:addClass('event-list') | |||
local currentArea = nil | |||
for _, event in ipairs(events) do | |||
-- 如果按区域排序,添加区域标题 | |||
if event.data.area and event.data.area ~= currentArea then | |||
currentArea = event.data.area | |||
html:tag('h3') | |||
:addClass('event-list-header') | |||
:wikitext(currentArea) | |||
end | |||
local item = html:tag('div') | |||
:addClass('event-list-item') | |||
-- 左侧:缩略图 | |||
local imageFile = 'cc_' .. event.data.id .. '.png' | |||
item:tag('div') | |||
:addClass('event-list-image') | |||
:wikitext('[[File:' .. imageFile .. '|80px|link=' .. event.name .. ']]') | |||
-- 中间:信息 | |||
local info = item:tag('div') | |||
:addClass('event-list-info') | |||
info:tag('div') | |||
:addClass('event-list-title') | |||
:wikitext('[[' .. event.name .. ']]') | |||
-- 选项预览 | |||
local options = info:tag('div') | |||
:addClass('event-list-options') | |||
for i = 1, 3 do | |||
if event.data.option[i] then | |||
options:tag('span') | |||
:addClass('event-list-option') | |||
:wikitext(event.data.option[i]) | |||
if i < 3 and event.data.option[i+1] then | |||
options:wikitext(' • ') | |||
end | |||
end | |||
end | |||
-- 右侧:标签 | |||
local tags = item:tag('div') | |||
:addClass('event-list-tags') | |||
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 | |||
end | |||
return tostring(html) | |||
end | |||
-- 生成表格视图 | |||
function p._generateTable(frame, events) | |||
local html = mw.html.create('table') | |||
:addClass('wikitable event-table sortable') | |||
-- 表头 | |||
local header = html:tag('tr') | |||
header:tag('th'):wikitext('图片') | |||
header:tag('th'):wikitext('名称') | |||
header:tag('th'):wikitext('区域') | |||
header:tag('th'):wikitext('稀有度') | |||
header:tag('th'):wikitext('选项') | |||
-- 表格内容 | |||
for _, event in ipairs(events) do | |||
local row = html:tag('tr') | |||
-- 图片 | |||
local imageFile = 'cc_' .. event.data.id .. '.png' | |||
row:tag('td') | |||
:addClass('event-table-image') | |||
:wikitext('[[File:' .. imageFile .. '|100px|link=' .. event.name .. ']]') | |||
-- 名称 | |||
row:tag('td') | |||
:wikitext('[[' .. event.name .. ']]') | |||
-- 区域 | |||
row:tag('td') | |||
:wikitext(event.data.area or '-') | |||
-- 稀有度 | |||
local rarityCell = row:tag('td') | |||
if event.data.rarity then | |||
rarityCell:tag('span') | |||
:addClass('event-tag event-tag-rarity') | |||
:addClass('event-tag-' .. event.data.rarity) | |||
:wikitext(event.data.rarity) | |||
else | |||
rarityCell:wikitext('-') | |||
end | |||
-- 选项 | |||
local optionsCell = row:tag('td') | |||
:addClass('event-table-options') | |||
local optionsList = optionsCell:tag('ol') | |||
for i = 1, 3 do | |||
if event.data.option[i] then | |||
optionsList:tag('li') | |||
:wikitext(event.data.option[i]) | |||
end | |||
end | end | ||
end | end | ||
2025年10月18日 (六) 11:31的版本
此模块的文档可以在模块:事件/doc创建
local p = {}
local eventData = mw.loadData('模块:事件/data')
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
-- 构建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, list, table
local sortBy = args.sort or "name" -- name, area, rarity
local filterArea = args.area -- 可选:筛选特定区域
local filterRarity = args.rarity -- 可选:筛选特定稀有度
-- 收集并排序事件
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 == "table" then
return p._generateTable(frame, events)
elseif displayMode == "list" then
return p._generateList(frame, events)
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')
-- 缩略图
local imageFile = 'cc_' .. event.data.id .. '.png'
card:tag('div')
:addClass('event-card-image')
:wikitext('[[File:' .. imageFile .. '|200px|link=' .. event.name .. ']]')
-- 信息
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
end
return tostring(html)
end
-- 生成列表视图
function p._generateList(frame, events)
local html = mw.html.create('div')
:addClass('event-list')
local currentArea = nil
for _, event in ipairs(events) do
-- 如果按区域排序,添加区域标题
if event.data.area and event.data.area ~= currentArea then
currentArea = event.data.area
html:tag('h3')
:addClass('event-list-header')
:wikitext(currentArea)
end
local item = html:tag('div')
:addClass('event-list-item')
-- 左侧:缩略图
local imageFile = 'cc_' .. event.data.id .. '.png'
item:tag('div')
:addClass('event-list-image')
:wikitext('[[File:' .. imageFile .. '|80px|link=' .. event.name .. ']]')
-- 中间:信息
local info = item:tag('div')
:addClass('event-list-info')
info:tag('div')
:addClass('event-list-title')
:wikitext('[[' .. event.name .. ']]')
-- 选项预览
local options = info:tag('div')
:addClass('event-list-options')
for i = 1, 3 do
if event.data.option[i] then
options:tag('span')
:addClass('event-list-option')
:wikitext(event.data.option[i])
if i < 3 and event.data.option[i+1] then
options:wikitext(' • ')
end
end
end
-- 右侧:标签
local tags = item:tag('div')
:addClass('event-list-tags')
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
end
return tostring(html)
end
-- 生成表格视图
function p._generateTable(frame, events)
local html = mw.html.create('table')
:addClass('wikitable event-table sortable')
-- 表头
local header = html:tag('tr')
header:tag('th'):wikitext('图片')
header:tag('th'):wikitext('名称')
header:tag('th'):wikitext('区域')
header:tag('th'):wikitext('稀有度')
header:tag('th'):wikitext('选项')
-- 表格内容
for _, event in ipairs(events) do
local row = html:tag('tr')
-- 图片
local imageFile = 'cc_' .. event.data.id .. '.png'
row:tag('td')
:addClass('event-table-image')
:wikitext('[[File:' .. imageFile .. '|100px|link=' .. event.name .. ']]')
-- 名称
row:tag('td')
:wikitext('[[' .. event.name .. ']]')
-- 区域
row:tag('td')
:wikitext(event.data.area or '-')
-- 稀有度
local rarityCell = row:tag('td')
if event.data.rarity then
rarityCell:tag('span')
:addClass('event-tag event-tag-rarity')
:addClass('event-tag-' .. event.data.rarity)
:wikitext(event.data.rarity)
else
rarityCell:wikitext('-')
end
-- 选项
local optionsCell = row:tag('td')
:addClass('event-table-options')
local optionsList = optionsCell:tag('ol')
for i = 1, 3 do
if event.data.option[i] then
optionsList:tag('li')
:wikitext(event.data.option[i])
end
end
end
return tostring(html)
end
return p