全站通知:

模块:版本

来自戴森球计划WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

本模块仅应该被{{版本}}模板所调用,其他页面通过这个模板间接使用本模块的功能。


-- 初始化
-- 注意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