全站通知:
模块:版本
刷
历
编
跳到导航
跳到搜索
本模块仅应该被{{版本}}模板所调用,其他页面通过这个模板间接使用本模块的功能。
-- 初始化
-- 注意Data是数据的意思(这里只出现过versionData),Date是日期的意思
local p = {}
local versionData = mw.text.jsonDecode(
mw.title.new([[Mediawiki:数据/版本.json]]):getContent() or '{}'
)
local last = {
version = "0.0.0.0",
versionDate = 19700101,
editVersion = "0.0.0.0",
editDate = 19700101,
}
local relatedVersions = {}
local importantVersions = {}
local days = 0
-- 主函数
-- 求解各变量的值
-- 同时返回一个数字,数字越大代表页面越陈旧
function p.main(frame)
-- 求last中各键的值
if (frame.args[1] == nil or frame.args[1] == '') then
last.editDate = math.floor(
frame:preprocess('{{REVISIONTIMESTAMP}}') / 1000000
)
elseif string.match(frame.args[1], "^%d+%.%d+%.%d+%.%d+$") then
if versionData[frame.args[1]] then
last.editDate = versionData[frame.args[1]]["日期"]
last.editVersion = frame.args[1]
else
error("找不到版本号,请检查拼写或更新[[MediaWiki:数据/版本.json]]页面")
end
else
error("版本号应当是类似“0.0.0.0”格式的字符串",0)
end
local vDate = 19700101
for v, vTab in pairs(versionData) do
if (vTab["日期"] <= last.editDate) and (vTab["日期"] > vDate) and (frame.args[1] == nil or frame.args[1] == '') then
last.editVersion = v
vDate = vTab["日期"]
end
if (vTab["日期"] > last.versionDate) then
last.version = v
last.versionDate = vTab["日期"]
end
end
-- 寻找页面更新后有对本词条进行过改动的版本
local name = mw.title.getCurrentTitle().rootText
if last.editDate >= last.versionDate then
return 0
else
for v,vTab in pairs(versionData) do
if vTab["日期"] > last.editDate then
for i,n in pairs(vTab["变化"]) do
if name == n then
table.insert(relatedVersions, v)
end
end
elseif vTab["重要更新"] then
table.insert(importantVersions, v)
end
end
end
-- 计算更新至今的时间
local now = os.time()
local editTime = os.time({
year = math.floor(last.editDate / 10000),
month = math.floor(last.editDate % 10000 / 100),
day = last.editDate % 100
})
days = math.floor((now - editTime) / (60 * 60 * 24))
-- 返回提示等级
if next(relatedVersions) then
return 3
elseif next(importantVersions) then
return 2
else
return 1
end
end
-- 返回带超链接的版本号
function vLink(v)
return "[["..versionData[v]["新闻"].."|".."V"..v.."]]"
end
-- 拼接最终的维基文本
p["提示"] = function(frame)
local level = p.main(frame)
local result = ""
if level == 0 then
result = frame:expandTemplate{title = '提示', args = {
'成功',
'自本页更新已有'..days..'天,期间没有更新'
}}
elseif level == 1 then
result = frame:expandTemplate{title = '提示', args = {
'自本页更新已有'..days..'天,期间没有相关更新',
'截止当前稳定版本('..vLink(last.version)..'),本词条没有出现在更新日志当中,但页面中的其他信息可能会受到影响。本页面反映的游戏版本是'..vLink(last.editVersion)..'。'
}}
elseif level == 2 then
local showVersion = function ()
local list = ""
for i, v in ipairs(importantVersions) do
list = list..vLink(v)..","
end
local listLength = mw.ustring.len(list)
return mw.ustring.sub(list, 1, listLength - 1)
end
result = frame:expandTemplate{title = '提示', args = {
'警告',
'自本页更新已有'..days..'天,期间发生了大型更新('..showVersion()..'),请注意甄别',
'截止当前稳定版本('..vLink(last.version)..'),本词条没有出现在更新日志当中,但页面中的其他信息可能会受到影响。本页面反映的游戏版本是'..vLink(last.editVersion)..'。'
}}
elseif level == 3 then
local showVersion = function ()
local list = ""
for i, v in ipairs(relatedVersions) do
list = list.."*"..vLink(v).."\n"
end
end
result = frame:expandTemplate{title = '提示', args = {
'危险',
'本页提供的信息可能已经过时。',
'本页可能含有相对于当前版本('..vLink(last.version)..')过时的信息。自本页面反映的游戏版本('..vLink(last.editVersion)..')以来,已知以下更新中包含与本词条相关的变更:\n'..showVersion()
}}
end
return result
end
return p