米斯特利亚Wiki正在建设中,本WIKI编辑权限开放!

全站通知:

模块:Museum wings

来自米斯特利亚WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:Museum wings/doc创建

local Items = require('模块:Items')
local data = require('模块:Museum_wings/Data')

local p = {}

-- 缓存:构建 itemId -> set 对象的索引,便于快速查找
local setByItem = {}
-- 缓存:构建套装名称 -> set 对象的索引,便于快速查找
local setByName = {}
local initialized = false

-- 初始化映射表
local function initMaps()
    if initialized then
        return
    end -- 已初始化则直接返回

    for _, wing in pairs(data or {}) do
        local sets = wing.sets
        for _, setObj in pairs(sets) do
            -- 构建套装名到套装对象的索引
            if setObj.name then
                setByName[setObj.name] = setObj
            end

            -- 构建物品到套装的索引
            local itemList = setObj.items
            for _, itemId in pairs(itemList) do
                setByItem[itemId] = setObj
            end
        end
    end
    
    initialized = true
end

function p.test()
    initMaps()
    mw.log("setByItem:")
    mw.logObject(setByItem)
    mw.log("setByName:")
    mw.logObject(setByName)
end

function p._renderSet(setTable, mainTitleName, subTitleName)
    local tmpMainTitle = mainTitleName or "文物系列"
    local tmpSubTitle = subTitleName or "物品"
    local itemsRender = p._renderMuseumItemList(setTable.items, tmpSubTitle)
    local tmpArgs = {}
    tmpArgs.sets = itemsRender
    tmpArgs.name = setTable.name
    tmpArgs.desc = setTable.description

    local frame = mw.getCurrentFrame()
    return frame:expandTemplate{
        title = tmpMainTitle,
        args = tmpArgs
    }
end

function p._renderMuseumItem(itemId,tmpName)
    local args = {}
    args.name = Items._name(itemId)
    args.icon = Items._icon(itemId)
    args.desc = Items._desc(itemId)
    args.source = Items._source(itemId)
    args.name_en = Items._name_en(itemId)
    
    local moduleName = tmpName or "物品"
    local frame = mw.getCurrentFrame()
    return frame:expandTemplate{
        title = moduleName,
        args = args
    }
end

function p._renderMuseumItemList(itemList,tmpName)
    local moduleName = tmpName or "物品"
    local itemRender = ""
    for _, itemId in pairs(itemList) do
        itemRender = itemRender .. p._renderMuseumItem(itemId,moduleName)
    end
    return itemRender
end

-- 根据传入的 item(内部ID或中文名)返回其所属的捐献系列表
function p._findMuseumSetByItem(itemId)
    initMaps() -- 确保映射表已初始化
    
    local resolvedId = Items._id(itemId)
    if not resolvedId or resolvedId == '' then
        return nil
    end

    return setByItem[resolvedId] or nil
end

-- 根据传入的 item(内部ID或中文名)查找其所属的捐献系列表,最终渲染使用模板:文物系列
function p.findMuseumSetByItem(frame)
    local item = frame and frame.args and frame.args[1]
    if not item or item == '' then
        return nil
    end

    local set = p._findMuseumSetByItem(item)
    if not set or set == '' then
        return nil
    end

    local mainTitleName = frame.args[2] or "文物系列"
    local subTitleName = frame.args[3] or "物品"
    local render = p._renderSet(set, mainTitleName, subTitleName)
    
    return render
end

function p._findMuseumSetByName(setName)
    initMaps() -- 确保映射表已初始化
    
    if not setName or setName == '' then
        return nil
    end
    return setByName[setName] or nil
end

function p.findMuseumSetByName(frame)
    local setName = frame.args[1]
    if not setName or setName == '' then
        return nil
    end

    local set = p._findMuseumSetByName(setName)
    if not set or set == '' then
        return nil
    end
    
    local mainTitleName = frame.args[2] or "文物系列"
    local subTitleName = frame.args[3] or "物品"
    local render = p._renderSet(set, mainTitleName, subTitleName)
    return render
end

--[[
local frame = mw.getCurrentFrame()
frame.args = {
    "卡尔多西亚文物系列",
    "博物馆/表",
    "博物馆/行"
}
local r = p.findMuseumSetByName(frame)
mw.logObject(r)
]]--

return p