缺氧 wiki 编辑团队提示:注册账号并登录后体验更佳,且可通过参数设置定制优化您的浏览体验!
该站点为镜像站点,如果你想帮助这个由玩家志愿编辑的 wiki 站点,请前往原站点参与编辑,
同时欢迎加入编辑讨论群 851803695 与其他编辑者一起参与建设!
全站通知:
模块:物品导航
刷
历
编
跳到导航
跳到搜索
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 ("<" .. key .. ">") == 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, " {{*}} <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