模块:更新索引
用途
本模块用于维护 **更新日志页面 ↔ 专题页面** 的双向索引。
- 在 更新日志页面 调用:可显示该次更新涉及哪些专题。 - 在 专题页面 调用:可显示该专题涉及的所有更新日志,并标注完成状态。 - 在 其它页面 调用时,可以通过参数传入专题名称进行查询。
数据存放在 Module:更新索引/数据,由维护人员手动更新。
用法
在更新日志页面
显示该更新涉及的专题(不带完成状态):
{{#invoke:更新索引|log}}
在专题页面
显示所有涉及该专题的更新日志,并标注完成状态:
{{#invoke:更新索引|topic}}
在其它页面查询指定专题
{{#invoke:更新索引|topic|topic=JUUs动态}}
数据维护
所有数据维护在 Module:更新索引/数据,格式示例:
return { ["2025年9月5日10:00港区改建"] = { { name = "宿舍计划", status = "已完成" }, { name = "JUUs动态", status = "未完成" }, }, ["2025年9月25日10:00港区改建"] = { { name = "宿舍计划", status = "未完成" }, { name = "JUUs动态", status = "未完成" }, }, }
说明:
name
:专题页面名称(必须与页面标题完全一致)status
:完成状态,可填“已完成”或“未完成”
示例
假设数据中有以下条目:
["2025年9月5日10:00港区改建"] = { { name = "宿舍计划", status = "已完成" }, { name = "JUUs动态", status = "未完成" }, },
在“2025年9月5日10:00港区改建”页面
{{#invoke:更新索引|log}}
输出:
== 本次更新涉及 == * [[宿舍计划]] * [[JUUs动态]]
在“宿舍计划”页面
{{#invoke:更新索引|topic}}
输出:
== 涉及本专题的更新 == * [[2025年9月5日10:00港区改建]] (已完成)
参见
-- Module:更新索引
local p = {}
local data = require("Module:更新索引/数据")
-- ===============================
-- 在更新日志页面调用
-- 用法:{{#invoke:更新索引|log}}
-- ===============================
function p.log(frame)
local page = mw.title.getCurrentTitle().text
local entries = data[page]
if not entries then return "(暂无记录)" end
local res = {"=== 本次更新涉及 === \n [[Module:更新索引/数据|修改备注]]"}
for _, item in ipairs(entries) do
table.insert(res, "* [[" .. item.name .. "]]:" .. frame:preprocess(item.status))
end
return table.concat(res, "\n")
end
-- ===============================
-- 辅助函数:把“2025年9月19日10:00港区改建”转为可比较的数字
-- ===============================
local function parseDate(logname)
-- 匹配:2025年9月19日10:00港区改建
local y, m, d, H, M = logname:match("(%d+)年(%d+)月(%d+)日(%d+):(%d+)")
if not y then return 0 end
return os.time{year=tonumber(y), month=tonumber(m), day=tonumber(d), hour=tonumber(H), min=tonumber(M)}
end
-- ===============================
-- 在专题页面调用
-- 用法:
-- {{#invoke:更新索引|topic}}
-- {{#invoke:更新索引|topic|topic=JUUs动态}}
-- ===============================
function p.topic(frame)
local topic = frame.args.topic or mw.title.getCurrentTitle().text
local res = {"=== 涉及本专题的更新 === \n [[Module:更新索引/数据|修改备注]]"}
local found = false
local matches = {}
-- 收集所有涉及该专题的更新日志
for log, entries in pairs(data) do
for _, item in ipairs(entries) do
if item.name == topic then
table.insert(matches, {
log = log,
status = frame:preprocess(item.status),
ts = parseDate(log)
})
found = true
end
end
end
-- 按时间戳倒序排序
table.sort(matches, function(a, b) return a.ts > b.ts end)
-- 输出
for _, m in ipairs(matches) do
table.insert(res, "* [[" .. m.log .. "]] " .. m.status)
end
if not found then
table.insert(res, "* (暂无相关更新)")
end
return table.concat(res, "\n")
end
return p