如果你看到本段文字,说明该页面未正常加载全局JS,部分功能将无法使用,请点击 刷新 重新加载页面。
如果打开页面显示缩略图创建出错,请点击刷新或页面右上WIKI功能中的刷新按钮清除页面缓存并刷新,如果还有问题,请多尝试几次。
全站通知:

模块:舰娘定位筛选

来自碧蓝航线WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:舰娘定位筛选/doc创建

local p = {}

--------------------------------------------------
--	公开函数
--------------------------------------------------

p['查询舰娘数据'] = function(frame)

	local data = callAskQuery('[[分类:舰娘||方案舰娘||META舰娘||联动舰娘]]', {
'?分组',
'?特殊分组',
'?和谐名',
'?编号',
'?类型',
'?改造后类型',
'?稀有度',
'?改造后稀有度',
'?阵营',
'?装甲类型',
'?满级耐久',
'?改造满级耐久',
'?满级装填',
'?改造满级装填',
'?满级炮击',
'?改造满级炮击',
'?满级雷击',
'?改造满级雷击',
'?满级机动',
'?改造满级机动',
'?满级防空',
'?改造满级防空',
'?满级航空',
'?改造满级航空',
'?满级命中',
'?改造满级命中',
'?满级反潜',
'?改造满级反潜',
'?幸运',
'?满级消耗',
'?航速',
'?改造航速',
'?初始氧气',
'?改造满级氧气',
'?技能1名',
'?技能1',
'?技能2名',
'?技能2',
'?技能3名',
'?技能3',
'?技能4名',
'?技能4',
'?特性标签',
link = 'none',
sort = '编号',
headers = 'hide',
format = 'table',
named_args = 1,
limit = 1000
	})
	
	local result = {}
	for _, item in ipairs(data) do
		result[#result + 1] = parseToTableRow(item, frame.args['popup'], frame.args['info'])
	end

	return table.concat(result, '')
end

--------------------------------------------------
--	主要过程
--------------------------------------------------

--将每一行的数据解析为表格的行
local skill_keys = {'技能1名', '技能1', '技能2名', '技能2', '技能3名', '技能3', '技能4名', '技能4'}
function parseToTableRow(args, hasPopup, hasInfo)
	--参考[[模板:舰娘数据列表15/行]]
	
	--用于匹配替换的参数列表
	local repl_args = {}
	for k, v in pairs(args) do
		repl_args[tostring(k)] = v	--将数字转换为字符串
	end
	
	--改造舰娘参数处理
	if not isNil(args['改造后类型']) then
		repl_args['类型'] = args['改造后类型']
	end
	if not isNil(args['改造后稀有度']) then
		repl_args['稀有度'] = args['改造后稀有度']
	end
	if not isNil(args['改造满级耐久']) then
		repl_args['满级耐久'] = args['改造满级耐久']
	end
	if not isNil(args['改造满级装填']) then
		repl_args['满级装填'] = args['改造满级装填']
	end
	if not isNil(args['改造满级炮击']) then
		repl_args['满级炮击'] = args['改造满级炮击']
	end
	if not isNil(args['改造满级雷击']) then
		repl_args['满级雷击'] = args['改造满级雷击']
	end
	if not isNil(args['改造满级机动']) then
		repl_args['满级机动'] = args['改造满级机动']
	end
	if not isNil(args['改造满级防空']) then
		repl_args['满级防空'] = args['改造满级防空']
	end
	if not isNil(args['改造满级航空']) then
		repl_args['满级航空'] = args['改造满级航空']
	end
	if not isNil(args['改造满级命中']) then
		repl_args['满级命中'] = args['改造满级命中']
	end
	if not isNil(args['改造满级反潜']) then
		repl_args['满级反潜'] = args['改造满级反潜']
	end
	if not isNil(args['改造航速']) then
		repl_args['航速'] = args['改造航速']
	end
	if not isNil(args['改造满级氧气']) then
		repl_args['满级氧气'] = args['改造满级氧气']
	end
	
	if not isNil(args['改造后稀有度']) then
		repl_args.fenzu = case(args['改造后稀有度'], '稀有','精锐','超稀有','海上传奇') 
					and '改造'
		repl_args['改'] = '.改'
		repl_args.gaizaobianhao = '3'
	else
		repl_args.fenzu = args['分组']
	end
	
	--类型分类处理
	repl_args.leixing = (case(args['改造后类型'], '驱逐', '轻巡', '重巡', '超巡', '运输', '风帆V') and args['改造后类型'] .. ',前排先锋')
	or (case(args['改造后类型'], '潜艇', '潜母', '风帆S') and args['改造后类型'] .. ',潜艇')
	or (args['改造后类型'] .. ',后排主力')
	
	--稀有度颜色处理
	if repl_args['稀有度'] == '普通'  then
		repl_args.raritycolor = '#808080'
	elseif repl_args['稀有度'] == '稀有' then
		repl_args.raritycolor = '#3b8bff'
	elseif repl_args['稀有度'] == '精锐' then
		repl_args.raritycolor = '#8000ff'
	elseif repl_args['稀有度'] == '超稀有' then
		repl_args.raritycolor = '#c90'
	elseif repl_args['稀有度'] == '海上传奇' then
		repl_args.raritycolor = '#ee494c'
	elseif repl_args['稀有度'] == '最高方案' then
		repl_args.raritycolor = '#a0522d'
	elseif repl_args['稀有度'] == '决战方案' then
		repl_args.raritycolor = '#c06'
	else
		repl_args.raritycolor = 'red'
	end
	--和谐名处理
	if not isNil(args['和谐名']) then
		if not isNil(args['改造后稀有度']) then
			repl_args['页面链接'] = '<span class="xtb-image" style="display:none;">[[file:'..args[1]..'改头像.jpg|25px|link='..args[1]..']]</span>[['..args[1]..'|<span style="color:'..repl_args.raritycolor..';">'..args[1]..'('..args['和谐名']..').改</span>]]'
		else
			repl_args['页面链接'] = '<span class="xtb-image" style="display:none;">[[file:'..args[1]..'头像.jpg|25px|link='..args[1]..']]</span>[['..args[1]..'|<span style="color:'..repl_args.raritycolor..';">'..args[1]..'('..args['和谐名']..')</span>]]'
		end
	else
		if not isNil(args['改造后稀有度']) then
			repl_args['页面链接'] = '<span class="xtb-image" style="display:none;">[[file:'..args[1]..'改头像.jpg|25px|link='..args[1]..']]</span>[['..args[1]..'|<span style="color:'..repl_args.raritycolor..';">'..args[1]..'.改</span>]]'
		else
			repl_args['页面链接'] = '<span class="xtb-image" style="display:none;">[[file:'..args[1]..'头像.jpg|25px|link='..args[1]..']]</span>[['..args[1]..'|<span style="color:'..repl_args.raritycolor..';">'..args[1]..'</span>]]'
		end
	end
	
	repl_args.texingbiaoqian = args['特性标签']:gsub('<br>',', ')
	repl_args['特性标签'] = args['特性标签']:gsub('<br>','、')
	repl_args['航速'] = math.floor(tonumber(args['航速']) or 0)


	--技能
	local popover = [[

]]

	local skill_info = ''

	local skill_table = '<table class="wikitable skilltable" style="width:100%;border:none;margin:0;"'
	
	for i, key in ipairs(skill_keys) do
		if not isNil(args[key]) then
			if i % 2 == 1 then
				skill_table = skill_table .. ([[
<tr style="font-weight:bold"><td>%s</td></tr>
]]):format(args[key])

				skill_info = skill_info .. ([[
<p><span style="font-weight:bold">%s</span><br>
]]):format(args[key])
			else
				skill_table = skill_table .. ([[
<tr style="text-align:left"><td>%s</td></tr>
]]):format(args[key])

				skill_info = skill_info .. ([[
%s</p>
]]):format(args[key])
			
			end
		end
	end
	
	repl_args.POPOVER = ''
	if hasPopup then 
		repl_args.POPOVER = '<div style="display:none;"><div style="width:300px;max-width:100%;">\n' .. skill_table .. '</table>' .. '</div></div>'
	end 
	
	repl_args.INFO = ''
	if hasInfo then 
		repl_args.SKILL_INFO = skill_info
		repl_args.INFO = ([[<span data-id="info_{{{1}}}{{{改}}}" style="display:none">{{{页面链接}}}<p>
<span>类型:</span>{{{类型}}}<br>
<span>装甲类型:</span>{{{装甲类型}}}
</p><hr><p>
<span>耐久:</span>{{{满级耐久}}}<br>
<span>装填:</span>{{{满级装填}}}<br>
<span>炮击:</span>{{{满级炮击}}}<br>
<span>雷击:</span>{{{满级雷击}}}<br>
<span>机动:</span>{{{满级机动}}}<br>
<span>防空:</span>{{{满级防空}}}<br>
<span>航空:</span>{{{满级航空}}}<br>
<span>命中:</span>{{{满级命中}}}<br>
<span>反潜:</span>{{{满级反潜}}}<br>
<span>幸运:</span>{{{幸运}}}<br>
<span>消耗:</span>{{{满级消耗}}}<br>
<span>航速:</span>{{{航速}}}<br>
<span>氧气:</span>{{{初始氧气}}}<br>
</p><hr>
<span>特性标签:</span>{{{特性标签}}}<br>
<hr>{{{SKILL_INFO}}}</span>
]]):gsub('%{%{%{(.-)%}%}%}', function(key)
			return repl_args[key] or ''
		end
	)
	end 
	
	repl_args.COMPARESEL = mw.getCurrentFrame():preprocess('<div class="compare-label"><span class="" onclick="card_sel(this);">对比</span></div>')
	
	return ([[
|-class="divsort" data-param0="0" data-param1="{{{leixing}}}" data-param2="{{{稀有度}}}" data-param3="{{{阵营}}}" data-param4="{{{装甲类型}}}" data-param5="{{{满级消耗}}}" data-param6="{{{texingbiaoqian}}}" data-param7="{{{fenzu}}},{{{特殊分组}}}"
| class="mwiki_hide" | {{{gaizaobianhao}}}{{{编号}}}
|<span data-cardurl="{{{1}}}{{{改}}}">
<div class="popup"><div style="position:relative;">{{{页面链接}}}</div>{{{POPOVER}}}</div>
{{{INFO}}}
</span>
| class="mwiki_hide" | {{{类型}}}
| class="mwiki_hide" | {{{特性标签}}}
| class="mwiki_hide" | {{{装甲类型}}}
|{{{满级耐久}}}
|{{{满级装填}}}
|{{{满级炮击}}}
|{{{满级雷击}}}
|{{{满级机动}}}
|{{{满级防空}}}
|{{{满级航空}}}
|{{{满级命中}}}
|{{{满级反潜}}}
|{{{幸运}}}
|{{{满级消耗}}}
|{{{航速}}}
|{{{初始氧气}}}
|<div class="cpr_btn1"  data-card="{{{1}}}{{{改}}}" data-id="box_{{{1}}}{{{改}}}" data-cardinfo="info_{{{1}}}{{{改}}}"><span class="compare-label";>对比</span></div>
]]):gsub('%{%{%{(.-)%}%}%}', function(key)
			return repl_args[key] or ''
		end
	)
end

--------------------------------------------------
--	私有函数
--------------------------------------------------

--检查字符串是否为空
function isNil(s)
	return not s or s == ''
end

--检查table中是否含有某项
function case(value, ...)
	for _, v in ipairs({...}) do
		if value == v then return true end
	end
	return false
end


--调用#ask语义查询,并将结果解析为table
function callAskQuery(title, args)
	local frame = mw.getCurrentFrame()
	args.format = 'table'
	local html = frame:callParserFunction('#ask:'..title, args)
	
	--返回解析结果的key
	local keys = {}
	keys[1] = ''		--#ask的参数#1是title
	for i, v in ipairs(args) do
		keys[i+1] = mw.text.trim(v:sub(2))
	end
	
	local data = {}
	for tr in html:gmatch('<tr .-</tr>') do
		if tr:match('smwfooter') then break end
		
		local item = {}
		local i = 1		--#1单元格是页面名称
		
		for td in tr:gmatch('<td.->(.-)</td>') do
			td = mw.text.trim(td)
			
			item[i] = td
			if keys[i] then item[ keys[i] ] = td end
			i = i + 1
		end
		
		table.insert(data, item)
	end
	
	return data
end


return p