模块

事件:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
 
(未显示同一用户的7个中间版本)
第3行: 第3行:


function p.main(frame)
function p.main(frame)
    -- 直接从frame.args获取参数(用于#invoke调用)
     local output = {}
     local eventName = frame.args[1] or frame.args.name
      
      
     -- 如果没有找到,尝试从父frame获取(用于模板调用)
     -- 遍历所有事件
     if not eventName and frame:getParent() then
     for eventName, eventInfo in pairs(eventData) do
         local parentArgs = frame:getParent().args
         table.insert(output, p.renderEvent(frame, eventName, eventInfo))
        eventName = parentArgs[1] or parentArgs.name
     end
     end
      
      
     if not eventName or eventName == '' then
     return table.concat(output, '\n')
        return "错误:未指定事件名称"
end
    end
 
   
function p.renderEvent(frame, eventName, eventInfo)
    local event = eventData[eventName]
    if not event then
        return "错误:找不到事件 '" .. eventName .. "'"
    end
   
    -- 构建HTML
     local html = mw.html.create('div')
     local html = mw.html.create('div')
         :addClass('event-container')
         :addClass('event-container')
         :attr('data-event-id', event.id)
         :attr('data-event-id', eventInfo.id)
      
      
     -- 图片容器
     -- 背景层
     local imageContainer = html:tag('div')
     html:tag('div'):addClass('event-background')
        :addClass('event-image-container')
      
      
     -- 图片
     -- 图片
     local imageFile = 'cc_' .. event.id .. '.png'
     local imageLink = eventName
    imageContainer:wikitext('[[File:' .. imageFile .. '|375px|link=]]')
    html:tag('div')
        :addClass('event-image')
        :wikitext(string.format('[[File:cc_%s.png|link=%s]]', eventInfo.id, imageLink))
   
    -- 标题背景
    html:tag('div'):addClass('event-title-bg')
      
      
     -- 标题条
     -- 标题
     imageContainer:tag('div')
     html:tag('div')
         :addClass('event-title-bar')
         :addClass('event-title')
         :tag('div')
         :wikitext(eventName)
            :addClass('event-title')
            :wikitext(eventName)
      
      
     -- 选项容器
     -- 选项容器
     local optionsContainer = html:tag('div')
     local optionsContainer = html:tag('div'):addClass('event-options')
        :addClass('event-options-container')
      
      
     -- 选项
     -- 渲染选项
     for i = 1, 3 do
     for i, optionText in ipairs(eventInfo.option) do
        if event.option[i] then
        -- 选项
            local optionWrapper = optionsContainer:tag('div')
        optionsContainer:tag('div')
                :addClass('event-option-wrapper')
            :addClass('event-option')
           
            :attr('data-option-index', i)
            local optionDiv = optionWrapper:tag('div')
             :wikitext(optionText)
                :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})
         local effectDiv = optionsContainer:tag('div')
        end
             :addClass('event-effect')
    end
             :attr('data-effect-index', i)
   
    -- 排序
    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')
         local effectText = eventInfo.effect[i]
                :addClass('event-tag event-tag-area')
         if effectText then
                :wikitext(event.data.area)
             if frame then
        end
                 effectText = frame:preprocess(effectText)
       
        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
        end
             effectDiv:wikitext(effectText)
       
        -- 右侧:标签
        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
     end
     end
第235行: 第64行:
end
end


-- 生成表格视图
-- 单独显示某个事件
function p._generateTable(frame, events)
function p.show(frame)
     local html = mw.html.create('table')
     local eventName = frame.args[1]
        :addClass('wikitable event-table sortable')
    if not eventName or not eventData[eventName] then
   
         return '错误:未找到指定的事件'
    -- 表头
    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
      
      
     return tostring(html)
     return p.renderEvent(frame, eventName, eventData[eventName])
end
end


return p
return p

2025年10月18日 (六) 13:38的最新版本

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

local p = {}
local eventData = mw.loadData('模块:事件/data')

function p.main(frame)
    local output = {}
    
    -- 遍历所有事件
    for eventName, eventInfo in pairs(eventData) do
        table.insert(output, p.renderEvent(frame, eventName, eventInfo))
    end
    
    return table.concat(output, '\n')
end

function p.renderEvent(frame, eventName, eventInfo)
    local html = mw.html.create('div')
        :addClass('event-container')
        :attr('data-event-id', eventInfo.id)
    
    -- 背景层
    html:tag('div'):addClass('event-background')
    
    -- 图片
    local imageLink = eventName
    html:tag('div')
        :addClass('event-image')
        :wikitext(string.format('[[File:cc_%s.png|link=%s]]', eventInfo.id, imageLink))
    
    -- 标题背景
    html:tag('div'):addClass('event-title-bg')
    
    -- 标题
    html:tag('div')
        :addClass('event-title')
        :wikitext(eventName)
    
    -- 选项容器
    local optionsContainer = html:tag('div'):addClass('event-options')
    
    -- 渲染选项
    for i, optionText in ipairs(eventInfo.option) do
        -- 选项
        optionsContainer:tag('div')
            :addClass('event-option')
            :attr('data-option-index', i)
            :wikitext(optionText)
        
        -- 结果显示区域
        local effectDiv = optionsContainer:tag('div')
            :addClass('event-effect')
            :attr('data-effect-index', i)
        
        -- 处理结果文本
        local effectText = eventInfo.effect[i]
        if effectText then
            if frame then
                effectText = frame:preprocess(effectText)
            end
            effectDiv:wikitext(effectText)
        end
    end
    
    return tostring(html)
end

-- 单独显示某个事件
function p.show(frame)
    local eventName = frame.args[1]
    if not eventName or not eventData[eventName] then
        return '错误:未找到指定的事件'
    end
    
    return p.renderEvent(frame, eventName, eventData[eventName])
end

return p