通过 Sulfur.wiki 可快速访问本维基!
本WIKI编辑权限开放,欢迎收藏起来防止迷路,也希望有爱的小伙伴和我们一起编辑哟~

全站通知:

模块:JSONFetcher/沙盒2

来自火湖WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:JSONFetcher/沙盒2/doc创建

local p = {}
local dataCache = nil  -- 缓存数据
local flatData = nil  -- 扁平化数据缓存

-- 获取 Lua 表数据,并缓存
function p.getData(frame)
    if dataCache then
        return dataCache  -- 如果缓存中有数据,直接返回
    end

    local luaPage = '模块:JSONFetcher/data' -- 数据页面路径
    local content = mw.title.new(luaPage):getContent()

    if not content then
        return "无法获取数据"
    end

    -- 使用 mw.loadData 来加载 Lua 表
    local data, err = mw.loadData(content)
    if not data then
        return "数据格式错误: " .. err
    end

    -- 缓存数据
    dataCache = data

    -- 扁平化数据
    flatData = {}
    local function flattenTable(data, prefix)
        for k, v in pairs(data) do
            local newKey = prefix .. (type(k) == "number" and "[" .. k .. "]" or "." .. k)
            if type(v) == "table" then
                flattenTable(v, newKey)  -- 递归扁平化
            else
                flatData[newKey] = v
            end
        end
    end

    flattenTable(data, "")  -- 扁平化数据
    return data
end

-- 获取嵌套值,支持 ! 分隔符和数组索引
function p.fetch(frame)
    -- 获取调用参数
    local key = frame.args[1]

    local data = p.getData(frame)
    if type(data) == "string" then
        return data -- 如果出错,直接返回错误信息
    end

    if not key then
        return "未指定参数"
    end

    -- 生成扁平化后的键
    local flatKey = key:gsub("!", ".")

    -- 查找扁平化后的数据
    local value = flatData[flatKey]

    if value == nil then
        return nil
    end

    -- 生成返回值
    local result
    if type(value) == "table" then
        local keys = {}
        for k, _ in pairs(value) do
            if not tostring(k):match("^%?_") then
                table.insert(keys, k)
            end
        end
        result = table.concat(keys, ", ")
    else
        result = tostring(value)
    end

    return result
end

return p