模块:DeviceSearch2
此模块的文档可以在模块:DeviceSearch2/doc创建
local p = {}
local getArgs = require("Module:Arguments").getArgs
local sep = " · "
--[[
获取指定装置的全部关卡列表,额外查询其id与分类用于关卡归类
levelTable:
[1]:关卡名
[2]:关卡id
[3]:关卡页面分类
]]
function smw(device)
local levelTable = {}
local raw = mw.getCurrentFrame():callParserFunction("#ask","[[关卡装置::" .. device .. "]]", "?", "?关卡id", "?分类", "format=template", "template=装置属性/search/data", "link=none", "valuesep=,", "limit=100")
for s in mw.ustring.gmatch(raw, "%b{}") do
table.insert(levelTable, {mw.ustring.sub(mw.ustring.match(s, "level=.-;"), 7, -2), mw.ustring.sub(mw.ustring.match(s, "id=.-;"), 4, -2), mw.ustring.sub(mw.ustring.match(s, "cat=.-}"), 5, -2)})
end
return levelTable
end
--从分类条件表中选择合适的一个序号
function choose(level, condTable)
for i=1, #(condTable) do
for condi, cond in ipairs(condTable[i]) do
if mw.ustring.find(level[cond[1]] or "", cond[2]) then
return i
end
end
end
return nil
end
--[[
泛用匹配,传入condTable定义匹配条件
关卡按照condTable的顺序匹配1次,已匹配的关卡即使后续满足条件也不会被匹配
condTable:
[1]: cond 分类条件,若一个分类有多个条件,满足其中一个即可
[1]: condpos 指示筛选源下标
[2]: cond 条件匹配式
]]
function get(levelTable, condTable)
local result = {}
for i=1, #(condTable) do
result[i] = ""
end
for key,level in ipairs(levelTable) do
cat = choose(level, condTable)
if cat then
result[cat] = result[cat] .. "[[" .. level[1] .. "]]" .. sep
end
end
for i=1, #(result) do
if result[i] == "" then
result[i] = "无"
else
result[i] = mw.ustring.sub(result[i], 1, -1*mw.ustring.len(sep)-1)
end
end
return result
end
function p.main(frame)
local args = getArgs(frame)
local device = mw.ustring.gsub(args[1], """, "\"") --将系统变量中未被转义的"替换为",此处再将其替换为转义的\"
local isCat = args['分类']
local levelTable = smw(device)
if isCat ~= "1" then
return get(levelTable, {{{3, "关卡"}}})[1]
else
local result = get(levelTable, {
{{2, "^main.+"}, {2, "^tough.+"}}, --主线
{{2, "^sub.+"}, {2, "^tr.+"}}, --支线
{{2, "^hard.+"}}, --绝境
{{3, "剿灭关卡"}},
{{3, "集成战略关卡"}},
{{3, "活动关卡"}},
{{3, "悖论模拟关卡"}},
{{3, "保全派驻关卡"}},
{{3, "生息演算关卡"}}
})
mw.getCurrentFrame():callParserFunction("#arraydefine", "levels", table.concat(result, ";"), ";")
--mw.logObject(result)
end
end
return p