模块

事件:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第1行: 第1行:
local p = {}
local p = {}
local eventData = mw.loadData('模块:事件/data')
local eventData = require("Module:事件/data")


-- 原有的main函数保持不变
function p.main(frame)
function p.main(frame)
    -- 直接从frame.args获取参数(用于#invoke调用)
     local html = mw.html.create()
     local eventName = frame.args[1] or frame.args.name
      
      
     -- 如果没有找到,尝试从父frame获取(用于模板调用)
     for eventName, eventInfo in pairs(eventData) do
    if not eventName and frame:getParent() then
         html:node(p.createEventCard(eventName, eventInfo))
         local parentArgs = frame:getParent().args
        eventName = parentArgs[1] or parentArgs.name
     end
     end
      
      
     if not eventName or eventName == '' then
     return tostring(html)
        return "错误:未指定事件名称"
    end
   
    local event = eventData[eventName]
    if not event then
        return "错误:找不到事件 '" .. eventName .. "'"
    end
   
    return p._renderEvent(frame, eventName, event)
end
end


-- 抽取渲染单个事件的函数
function p.createEventCard(eventName, eventInfo)
function p._renderEvent(frame, eventName, event)
     local card = mw.html.create('div')
    -- 构建HTML
    card:addClass('event-card')
     local html = mw.html.create('div')
        :addClass('event-container')
        :attr('data-event-id', event.id)
      
      
     -- 图片容器
     -- 容器
     local imageContainer = html:tag('div')
     local container = mw.html.create('div')
        :addClass('event-image-container')
    container:addClass('event-container')
      
      
     -- 图片
     -- 图片
     local imageFile = 'cc_' .. event.id .. '.png'
     local imageDiv = mw.html.create('div')
     imageContainer:wikitext('[[File:' .. imageFile .. '|375px|link=]]')
    imageDiv:addClass('event-image')
     imageDiv:node(string.format('[[File:cc_%s.png|link=]]', eventInfo.id))
    container:node(imageDiv)
      
      
     -- 标题条
     -- 标题背景
     imageContainer:tag('div')
     local titleBg = mw.html.create('div')
        :addClass('event-title-bar')
    titleBg:addClass('event-title-bg')
        :tag('div')
    container:node(titleBg)
            :addClass('event-title')
   
            :wikitext(eventName)
    -- 标题
    local titleDiv = mw.html.create('div')
    titleDiv:addClass('event-title')
    titleDiv:wikitext(eventName)
    container:node(titleDiv)
      
      
     -- 选项容器
     -- 选项容器
     local optionsContainer = html:tag('div')
     local optionsDiv = mw.html.create('div')
        :addClass('event-options-container')
    optionsDiv:addClass('event-options')
      
      
    -- 选项
     for i, option in ipairs(eventInfo.option) do
     for i = 1, 3 do
        local optionDiv = mw.html.create('div')
        if event.option[i] then
        optionDiv:addClass('event-option')
            local optionWrapper = optionsContainer:tag('div')
        optionDiv:attr('data-option-index', i)
                :addClass('event-option-wrapper')
        optionDiv:attr('data-event-id', eventInfo.id)
           
        optionDiv:wikitext(option)
            local optionDiv = optionWrapper:tag('div')
        optionsDiv:node(optionDiv)
                :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
     end
      
      
     return tostring(html)
     container:node(optionsDiv)
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 = {}
     local effectDiv = mw.html.create('div')
     for name, data in pairs(eventData) do
     effectDiv:addClass('event-effect')
        -- 应用筛选
    effectDiv:attr('id', 'effect-' .. eventInfo.id)
        local include = true
     container:node(effectDiv)
        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)
     local dataDiv = mw.html.create('div')
        if sortBy == "area" then
    dataDiv:addClass('event-data')
            if a.data.area ~= b.data.area then
     dataDiv:attr('style', 'display:none;')
                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
     for i, effect in ipairs(eventInfo.effect) do
    if displayMode == "full" then
        local effectData = mw.html.create('div')
         return p._generateFullLayout(frame, events, columns)
        effectData:addClass('effect-data')
    else
         effectData:attr('data-index', i)
         return p._generateGrid(frame, events)
        effectData:wikitext(effect)
         dataDiv:node(effectData)
     end
     end
end
-- 生成网格视图
function p._generateGrid(frame, events)
    local html = mw.html.create('div')
        :addClass('event-grid')
      
      
     for _, event in ipairs(events) do
     container:node(dataDiv)
        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
      
      
     -- 添加模态框容器
     card:node(container)
    html:tag('div')
     return card
        :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
end


return p
return p

2025年10月18日 (六) 12:22的版本

此模块的文档可以在模块:事件/doc创建

local p = {}
local eventData = require("Module:事件/data")

function p.main(frame)
    local html = mw.html.create()
    
    for eventName, eventInfo in pairs(eventData) do
        html:node(p.createEventCard(eventName, eventInfo))
    end
    
    return tostring(html)
end

function p.createEventCard(eventName, eventInfo)
    local card = mw.html.create('div')
    card:addClass('event-card')
    
    -- 容器
    local container = mw.html.create('div')
    container:addClass('event-container')
    
    -- 图片
    local imageDiv = mw.html.create('div')
    imageDiv:addClass('event-image')
    imageDiv:node(string.format('[[File:cc_%s.png|link=]]', eventInfo.id))
    container:node(imageDiv)
    
    -- 标题背景
    local titleBg = mw.html.create('div')
    titleBg:addClass('event-title-bg')
    container:node(titleBg)
    
    -- 标题
    local titleDiv = mw.html.create('div')
    titleDiv:addClass('event-title')
    titleDiv:wikitext(eventName)
    container:node(titleDiv)
    
    -- 选项容器
    local optionsDiv = mw.html.create('div')
    optionsDiv:addClass('event-options')
    
    for i, option in ipairs(eventInfo.option) do
        local optionDiv = mw.html.create('div')
        optionDiv:addClass('event-option')
        optionDiv:attr('data-option-index', i)
        optionDiv:attr('data-event-id', eventInfo.id)
        optionDiv:wikitext(option)
        optionsDiv:node(optionDiv)
    end
    
    container:node(optionsDiv)
    
    -- 效果显示区域
    local effectDiv = mw.html.create('div')
    effectDiv:addClass('event-effect')
    effectDiv:attr('id', 'effect-' .. eventInfo.id)
    container:node(effectDiv)
    
    -- 隐藏的效果数据
    local dataDiv = mw.html.create('div')
    dataDiv:addClass('event-data')
    dataDiv:attr('style', 'display:none;')
    
    for i, effect in ipairs(eventInfo.effect) do
        local effectData = mw.html.create('div')
        effectData:addClass('effect-data')
        effectData:attr('data-index', i)
        effectData:wikitext(effect)
        dataDiv:node(effectData)
    end
    
    container:node(dataDiv)
    
    card:node(container)
    return card
end

return p