模块: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], "&#34", "\"")  --将系统变量中未被转义的"替换为&#34,此处再将其替换为转义的\"
	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