GemSMW:修订间差异
来自蒙纳多研究本部
创建页面,内容为“-- 模块:GemSMW —— 宝珠 SMW 注解层 -- 职责:把 xbdb 取到的宝珠数据写成 Semantic MediaWiki 行内注解(#set),供 #ask 查询。 -- 设计原则: -- 1. 注解值全部来自 GemData 取数,不手写; -- 2. 由列表/infobox 渲染时顺带调用(同一页面只注解一次,防重复 set); -- 3. 属性名带 Gem 前缀,避免与站内其他系统的同名属性冲突。 local p = {} local gemData = require("Mod…” |
无编辑摘要 |
||
| 第11行: | 第11行: | ||
-- ====== SMW 属性表(需在 wiki 上同步创建 Property: 页面) ====== | -- ====== SMW 属性表(需在 wiki 上同步创建 Property: 页面) ====== | ||
-- | -- 属性:Gem技能ID Number — BTL_skilllist row_id(主键锚点) | ||
-- | -- 属性:Gem归属 Text — 共用 / 武器 / 防具 | ||
-- | -- 属性:Gem名称 Text — skilllist.name(中文短名) | ||
-- | -- 属性:Gem颜色 Text — atr_type 映射:红/深蓝/黄/浅蓝/绿/橙 | ||
-- | -- 属性:Gem类型 Text — category 映射:能力/攻击/防御/支援/场景 | ||
-- | -- 属性:Gem效果值I Number — Ⅰ 级区间下限 | ||
-- 属性:Gem效果值VI Number — Ⅵ 级(S 档)上限 | |||
-- 属性:Gem最大值 Number — max 字段 | |||
-- 属性:Gem效果描述 Text — rvs_caption(去前缀、$1 置空) | |||
-- 属性:Gem发动类型 Text — 永续型 / 发动型 | |||
local ATTACH_LABEL = { [0] = "共用", [1] = "武器", [2] = "防具" } | local ATTACH_LABEL = { [0] = "共用", [1] = "武器", [2] = "防具" } | ||
local ATR_COLOR = { [4] = "红", [5] = "深蓝", [6] = "黄", [7] = "浅蓝", [8] = "绿", [9] = "橙" } | |||
local CATEGORY_TYPE = { [1] = "能力", [2] = "攻击", [3] = "防御", [4] = "支援", [5] = "场景", [6] = "能力" } | |||
local RVS_LABEL = { [1] = "永续型", [3] = "永续型", [0] = "发动型", [2] = "发动型" } | |||
local seen = {} -- 每次页面解析内防止同一宝珠重复注解 | local seen = {} -- 每次页面解析内防止同一宝珠重复注解 | ||
local function num(v) | |||
if v == nil then return 0 end | |||
return tonumber(v) or 0 | |||
end | |||
function p.annotate(gemId, data) | function p.annotate(gemId, data) | ||
| 第27行: | 第39行: | ||
seen[gemId] = true | seen[gemId] = true | ||
local attach = num(data.attach) | |||
local cap = (data.rvs_caption or ""):gsub("^【[^】]*】", ""):gsub("%$1", "") | |||
local attach = | |||
local | |||
-- mw.smw 已由 SemanticScribunto 提供;若不可用(扩展关闭)静默跳过,页面照常渲染 | -- mw.smw 已由 SemanticScribunto 提供;若不可用(扩展关闭)静默跳过,页面照常渲染 | ||
| 第39行: | 第49行: | ||
["Gem技能ID"] = gemId, | ["Gem技能ID"] = gemId, | ||
["Gem归属"] = ATTACH_LABEL[attach] or "未知", | ["Gem归属"] = ATTACH_LABEL[attach] or "未知", | ||
["Gem效果值I"] = | ["Gem名称"] = data.name or ("宝珠#" .. gemId), | ||
[" | ["Gem颜色"] = ATR_COLOR[num(data.atr_type)] or "未知", | ||
[" | ["Gem类型"] = CATEGORY_TYPE[num(data.category)] or "未知", | ||
["Gem效果描述"] = | ["Gem发动类型"] = RVS_LABEL[num(data.rvs_type)] or "未知", | ||
["Gem效果值I"] = num(data.lower_E), | |||
["Gem效果值VI"] = num(data.upper_S), | |||
["Gem最大值"] = num(data.max), | |||
["Gem效果描述"] = mw.text.trim(cap), | |||
} | } | ||
return "" | return "" | ||
| 第64行: | 第78行: | ||
local query = { | local query = { | ||
"[[Gem归属:" .. label .. "]]", | "[[Gem归属:" .. label .. "]]", | ||
"? | "?Gem效果值VI", | ||
"? | "?Gem最大值", | ||
sort = " | sort = "Gem最大值", | ||
order = "desc", | order = "desc", | ||
} | } | ||
| 第72行: | 第86行: | ||
if not result or #result == 0 then return "无查询结果" end | if not result or #result == 0 then return "无查询结果" end | ||
local out = { '| class="wikitable"', '! 宝珠 !! | local out = { '| class="wikitable"', '! 宝珠 !! Ⅵ级 !! 最大值' } | ||
for _, row in ipairs(result) do | for _, row in ipairs(result) do | ||
out[#out + 1] = '|-' | out[#out + 1] = '|-' | ||
2026年10月13日 (二) 21:42的版本
此模块的文档可以在模块:GemSMW/doc创建
-- 模块:GemSMW —— 宝珠 SMW 注解层
-- 职责:把 xbdb 取到的宝珠数据写成 Semantic MediaWiki 行内注解(#set),供 #ask 查询。
-- 设计原则:
-- 1. 注解值全部来自 GemData 取数,不手写;
-- 2. 由列表/infobox 渲染时顺带调用(同一页面只注解一次,防重复 set);
-- 3. 属性名带 Gem 前缀,避免与站内其他系统的同名属性冲突。
local p = {}
local gemData = require("Module:GemData")
-- ====== SMW 属性表(需在 wiki 上同步创建 Property: 页面) ======
-- 属性:Gem技能ID Number — BTL_skilllist row_id(主键锚点)
-- 属性:Gem归属 Text — 共用 / 武器 / 防具
-- 属性:Gem名称 Text — skilllist.name(中文短名)
-- 属性:Gem颜色 Text — atr_type 映射:红/深蓝/黄/浅蓝/绿/橙
-- 属性:Gem类型 Text — category 映射:能力/攻击/防御/支援/场景
-- 属性:Gem效果值I Number — Ⅰ 级区间下限
-- 属性:Gem效果值VI Number — Ⅵ 级(S 档)上限
-- 属性:Gem最大值 Number — max 字段
-- 属性:Gem效果描述 Text — rvs_caption(去前缀、$1 置空)
-- 属性:Gem发动类型 Text — 永续型 / 发动型
local ATTACH_LABEL = { [0] = "共用", [1] = "武器", [2] = "防具" }
local ATR_COLOR = { [4] = "红", [5] = "深蓝", [6] = "黄", [7] = "浅蓝", [8] = "绿", [9] = "橙" }
local CATEGORY_TYPE = { [1] = "能力", [2] = "攻击", [3] = "防御", [4] = "支援", [5] = "场景", [6] = "能力" }
local RVS_LABEL = { [1] = "永续型", [3] = "永续型", [0] = "发动型", [2] = "发动型" }
local seen = {} -- 每次页面解析内防止同一宝珠重复注解
local function num(v)
if v == nil then return 0 end
return tonumber(v) or 0
end
function p.annotate(gemId, data)
gemId = tonumber(gemId)
if not gemId or seen[gemId] then return "" end
seen[gemId] = true
local attach = num(data.attach)
local cap = (data.rvs_caption or ""):gsub("^【[^】]*】", ""):gsub("%$1", "")
-- mw.smw 已由 SemanticScribunto 提供;若不可用(扩展关闭)静默跳过,页面照常渲染
local smw = mw.smw
if smw == nil then return "" end
smw.set {
["Gem技能ID"] = gemId,
["Gem归属"] = ATTACH_LABEL[attach] or "未知",
["Gem名称"] = data.name or ("宝珠#" .. gemId),
["Gem颜色"] = ATR_COLOR[num(data.atr_type)] or "未知",
["Gem类型"] = CATEGORY_TYPE[num(data.category)] or "未知",
["Gem发动类型"] = RVS_LABEL[num(data.rvs_type)] or "未知",
["Gem效果值I"] = num(data.lower_E),
["Gem效果值VI"] = num(data.upper_S),
["Gem最大值"] = num(data.max),
["Gem效果描述"] = mw.text.trim(cap),
}
return ""
end
-- 批量注解:给 list 渲染入口顺带调用
function p.annotateAll(gems)
for _, gem in ipairs(gems) do
p.annotate(gem.id, gem.data)
end
return ""
end
-- ====== 反向查询示例(不直接上页面,只做演示/测试) ======
-- 用法:{{#invoke:GemSMW|queryByAttach|共用}}
function p.queryByAttach(frame)
local label = frame.args[1] or "共用"
local smw = mw.smw
if smw == nil then return "(SMW 不可用)" end
local query = {
"[[Gem归属:" .. label .. "]]",
"?Gem效果值VI",
"?Gem最大值",
sort = "Gem最大值",
order = "desc",
}
local result = smw.ask(query)
if not result or #result == 0 then return "无查询结果" end
local out = { '| class="wikitable"', '! 宝珠 !! Ⅵ级 !! 最大值' }
for _, row in ipairs(result) do
out[#out + 1] = '|-'
out[#out + 1] = '| ' .. tostring(row[1] or "?")
.. ' || ' .. tostring(row[2] or "?")
.. ' || ' .. tostring(row[3] or "?")
end
return table.concat(out, "\n")
end
return p