缺氧 wiki 编辑团队提示:注册账号并登录后体验更佳,且可通过参数设置定制优化您的浏览体验!

该站点为镜像站点,如果你想帮助这个由玩家志愿编辑的 wiki 站点,请前往原站点参与编辑,
同时欢迎加入编辑讨论群 851803695 与其他编辑者一起参与建设!

全站通知:

模块:物品导航

来自缺氧WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
local p = {}
local fstr = mw.ustring.format -- shortcut for string formatting
local getArgs = require('Module:Dev/Arguments').getArgs
local utils = require("Module:Utils")
local i18ndc = require([[Module:I18n]]).loadMessages([[Module:I18n/Creatures]])
local i18ndi = require([[Module:I18n]]).loadMessages([[Module:I18n/Items]])
local _c = function(...) return i18ndc:msg(...) end
local _i = function(...) return i18ndi:msg(...) end

--[[
判断 i18n:msg(key) 方法返回的消息是否为缺省值。
此方法可用于判断指定词条是否存在对应的翻译。如果输入键值 "key" 的返回消息为缺省值 "<key>",则对应翻译不存在。
[参数]
	key (string): 输入 i18n:msg(key) 的查询键值。
	msg (string): i18n:msg 方法返回的消息。
[返回]
	(bool): 若对应键值的返回消息为缺省值,返回值为 true;否则为 false。
]]--
function p.isDefaultMsg(key, msg) return ("&#60;" .. key .. "&#62;") == msg end

--[[
在 I18n/Items 和 I18n/Creatures 模块中查找指定物品 ID 对应的译名字符串。
[参数]
	id (string): 要查找的的物品 ID。
[返回]
	localization_string (string): 物品的译名字符串。若没有找到匹配记录,返回 nil。
]]--
function p.getItemString(id)
	local i18ndi_msg = _i(id)
	local localization_string = ""
	if p.isDefaultMsg(id, i18ndi_msg) then
		-- if the item is not in I18n/Items, search in I18n/Creatures
		local i18ndc_msg = _c(id)
		if p.isDefaultMsg(id, i18ndc_msg) then
			localization_string = nil
		else
			localization_string = i18ndc_msg
		end
	else
		localization_string = i18ndi_msg
	end
	return localization_string
end

--[[
查找指定的物品类别所包含的全部物品项,并返回由这些物品对应的"{{物品|item}}"字符串构成的数组。
[参数]
	type_name (string): 要筛选出的物品类别。类别名称必须是 Data/Items 中 "tagFilter" 域已有的一种键值。
	to_exclude (table): 要从返回值中排除的物品列表,列表必须为"物品ID = true"键对构成的字典。物品 ID 必须是 Data/Items 中已有的物品键名。
[返回]
	output_text_table (table): 包含指定物品类别的所有物品名称的数组。返回的所有物品名都由 "{{物品|item}}" 格式化。
]]--
function p.getCategoryTable(type_name, to_exclude)
    local output_text_table = {}
	local id_table = {}
	local datablock = mw.loadData("Module:Data/Items")
	local item_strings = mw.loadData("Module:I18n/Items")
	for key, data in pairs(datablock) do
		if data.tagFilter == type_name and not to_exclude[key] then
			id_table[key] = data.msgctxt
		end
	end
	for key, id in pairs(id_table) do
		local item_string = p.getItemString(id)
		if item_string ~= nil then
			table.insert(output_text_table, fstr("{{物品|%s}}", item_string))
		end
    end
    return output_text_table
end

--[[
返回由指定的物品分类所对应的全部物品所构成的格式化字符串。该字符串用于生成导航框模板。此方法应由 wiki 页面调用。
[用法]
	{{#invoke:物品导航|getItemList|ITEM_TYPE|exclude=EXCLUDE_LIST(optional)}}
[参数]
	frame (table): 调用此方法的页面发送的信息。由页面传入的参数含义如下:
	首个匿名参数 ITEM_TYPE 指定要返回的物品类别。类别名称必须是 Data/Items 中 "tagFilter" 域已有的一种键值。要查询哪些类别名称是合法的,请使用 p.getCategoryNames() 方法。
	命名参数 exclude 用于指定要从输出中排除的物品 ID。物品 ID 必须是 Data/Items 中已有的物品键名。要排除多个物品,请用逗号分隔。
[返回]
	output_string (string): 属于 ITEM_TYPE 类别的全部物品构成的格式化字符串。
[测试]
	要测试此方法,请在调试控制台输入"= p.getItemList({args={"Egg"}})"。
	返回结果应为所有小动物蛋构成的格式化字符串。
]]--
function p.getItemList(frame)
	local output_table = {}
	local exclude_set = {}
	local output_string = ""
	local exclude_list = frame.args.exclude
	if exclude_list ~= nil then
		for entry in string.gmatch(exclude_list, "([^,%s]+)") do
			exclude_set[entry] = true
		end
	end
	output_table = p.getCategoryTable(frame.args[1], exclude_set)
	output_string = table.concat(output_table, "&nbsp;{{*}}&nbsp;<wbr>")
	return output_string
end

--[[
返回指定物品类别所对应的中文译名。可用于生成导航框模板左侧的分类标题。此方法应由 wiki 页面调用。
[用法]
	{{#invoke:物品导航|getCategoryString|ITEM_TYPE}}
[参数]
	frame (table): 调用此方法的页面发送的信息。由页面传入的参数含义如下:
	首个匿名参数 ITEM_TYPE 指定待查询译名的物品类别名称。要查询哪些类别名称是合法的,请使用 p.getCategoryNames() 方法。
[返回]
	output_string (string): 输入物品类别的译名。
[测试]
	要测试此方法,请在调试控制台输入"= p.getCategoryString({args={"Egg"}})"。
	返回结果应为"小动物蛋"。
]]--
function p.getCategoryString(frame)
	local output_string = ""
	local type_name = frame.args[1]
	output_string = utils.getEntry(type_name) or name
	return output_string
end

--[[
以字符串形式罗列 Data/Items 中包含的所有物品类别。仅用于调试/编辑参考目的。本方法不使用参数。
[返回]
	(string): 游戏中物品类别 ID 构成的字符串,以逗号分隔。
[测试]
	要测试此方法,请在调试控制台输入"= p.getCategoryNames()"。
	返回结果应为物品类别 ID 构成的字符串。
]]--
function p.getCategoryNames()
	local category_table = {}
	local captured = {}
	local datablock = mw.loadData("Module:Data/Items")
	for _, data in pairs(datablock) do
		local tag = data.tagFilter
		if not captured[tag] then
			table.insert(category_table, tag)
			captured[tag] = true
		end
	end
	return table.concat(category_table, ", ")
end

return p