来自碧蓝航线海事局

这个模块提供显示舰娘头像和上色文字。

通用参数

#1 =
	舰娘	--要显示的舰娘的名字
替代文字 =
	文本	--要显示的文字
文字上色 = 
	nil,	--不上色
	1,		--按舰娘稀有度上色
	2,		--按改造稀有度上色
	3,		--按舰娘稀有度、改造稀有度分别上色
显示改造 = 
	nil, 	--舰娘
	1,		--舰娘^改
	2,		--舰娘.改
	3,		--舰娘改

函数示例

小图标

默认值。

不对文字上色,不显示改造。

{{#invoke: 舰娘图标
  | 小图标
  | 标枪
}}

标枪头像.jpg标枪

根据舰娘稀有度对文字上色。

不显示改造。

{{#invoke: 舰娘图标
  | 小图标
  | 标枪
  | 文字上色 = 1
}}

标枪头像.jpg标枪

根据舰娘稀有度对文字上色。

显示改造(舰娘^改)。

{{#invoke: 舰娘图标
  | 小图标
  | 标枪
  | 文字上色 = 1
  | 显示改造 = 1
}}

标枪改头像.jpg标枪

根据舰娘稀有度、改造稀有度分别上色。

显示改造(舰娘^改)。

{{#invoke: 舰娘图标
  | 小图标
  | 标枪
  | 文字上色 = 3
  | 显示改造 = 1
}}

标枪改头像.jpg标枪

根据舰娘稀有度、改造稀有度分别上色。

显示改造(舰娘.改)。

{{#invoke: 舰娘图标
  | 小图标
  | 标枪
  | 文字上色 = 3
  | 显示改造 = 2
}}

标枪改头像.jpg标枪.

根据改造稀有度上色。

显示改造(舰娘改)。

{{#invoke: 舰娘图标
  | 小图标
  | 标枪
  | 文字上色 = 2
  | 显示改造 = 3
}}

标枪改头像.jpg标枪改

没有改造的舰船。

不会显示改造,也不会用改造稀有度上色。

{{#invoke: 舰娘图标
  | 小图标
  | 独角兽
  | 文字上色 = 2
  | 显示改造 = 2
}}

独角兽头像.jpg独角兽

设置了替代文字,会不显示的“改”字。

但仍需要参数“显示改造”来标记图标为原始舰船还是改造舰船。

{{#invoke: 舰娘图标
  | 小图标
  | 标枪
  | 替代文字 = J级驱逐舰F61
  | 文字上色 = 2
  | 显示改造 = 2
}}

标枪改头像.jpgJ级驱逐舰F61

不存在的舰娘,

会直接忽略文字上色和显示改造。

{{#invoke: 舰娘图标
  | 小图标
  | 五月雨
  | 文字上色 = 2
  | 显示改造 = 2
}}

未实装的舰娘五月雨

小图标改

默认值。

根据舰娘稀有度上色。 不显示改造。

{{#invoke: 舰娘图标
  | 小图标改
  | 标枪
}}

标枪头像.jpg标枪

XX改

根据改造稀有度染色。 显示改造(舰娘改)。

{{#invoke: 舰娘图标
  | 小图标改
  | 标枪改
}}

标枪改头像.jpg标枪改

根据舰船稀有度染色。

显示替代文字。

{{#invoke: 舰娘图标
  | 小图标改
  | 标枪
  | J级驱逐舰F61
}}
或
{{#invoke: 舰娘图标
  | 小图标改
  | 标枪
  | 替代文字 = J级驱逐舰F61
}}

标枪头像.jpgJ级驱逐舰F61

XX改

根据改造稀有度染色。 显示替代文字。

{{#invoke: 舰娘图标
  | 小图标改
  | 标枪改
  | J级驱逐舰F61
}}
或
{{#invoke: 舰娘图标
  | 小图标改
  | 标枪改
  | 替代文字 = J级驱逐舰F61
}}

标枪改头像.jpgJ级驱逐舰F61

带框头像文字

默认值。

不对文字上色,不显示改造。

{{#invoke: 舰娘图标
  | 带框头像文字
  | 绫波
}}
根据改造稀有度上色。

显示改造(舰娘.改)。

{{#invoke: 舰娘图标
  | 带框头像文字
  | 绫波
  | 文字上色 = 2
  | 显示改造 = 2
}}
没有改造的舰船。

不会显示改造,也不会用改造稀有度上色。

{{#invoke: 舰娘图标
  | 带框头像文字
  | 独角兽
  | 文字上色 = 2
  | 显示改造 = 2
}}
不存在的舰娘,

会直接忽略文字上色和显示改造。

{{#invoke: 舰娘图标
  | 带框头像文字
  | 五月雨
  | 文字上色 = 2
  | 显示改造 = 2
}}

仅文字

只显示文字和链接。

根据舰娘稀有度、改造稀有度分别上色。 显示改造(舰娘^改)。

{{#invoke: 舰娘图标
  | 仅文字
  | 标枪
  | 文字上色 = 3
  | 显示改造 = 1
}}

标枪

仅小图标/仅带框头像

只显示小头像。
{{#invoke: 舰娘图标
  | 仅小图标
  | 标枪
}}
{{#invoke: 舰娘图标
  | 仅小图标
  | 标枪改
}}

标枪头像.jpg 标枪改头像.jpg

只显示带框头像。
{{#invoke: 舰娘图标
  | 仅带框头像
  | 标枪
}}
{{#invoke: 舰娘图标
  | 仅带框头像
  | 标枪改
}}
标枪头像.jpg
舰娘头像外框紫色.png
标枪改头像.jpg
舰娘头像外框金色.png

--模块:舰娘图标

--------------------------------------------------
--	调用模块:舰娘数据
--------------------------------------------------
local p = require('模块:舰娘数据')
Text = mw.text


--[[
替代文字 =
文字上色 = 
	nil,		--不上色
	1,		--按舰娘等级上色
	2,		--按改造等级上色
	3,		--按舰娘等级、改造等级分别上色
显示改造 = 
	nil,		--舰娘
	1,		--舰娘^改
	2,		--舰娘.改
	3,		--舰娘改
]]

--------------------------------------------------
--	公开函数
--------------------------------------------------
p['小图标'] = function(frame)
	local data = {}
	local args = parseArgument(frame)
	data.ship = p.NormalizeShipName(args[1] or '未知舰娘')
	data.dye = args['文字上色']
	data.text = args['替代文字']
	data.transform = args['显示改造']
	
	return parseShipInStyle1(data)
end

p['仅小图标'] = function(frame)
	local data = {}
	local args = parseArgument(frame)
	data.ship = p.NormalizeShipName(args[1] or '未知舰娘')
	if '改' == mw.ustring.sub(data.ship, -1) then
		data.ship = mw.ustring.sub(data.ship, 1, -2)
		data.transform = args['显示改造'] or 3
	else
		data.transform = args['显示改造']
	end
	
	return parseShipAvatorOnlyInStyle1(data)
end

p['小图标改'] = function(frame)
	local data = {}
	local args = parseArgument(frame)
	data.ship = p.NormalizeShipName(args[1] or '未知舰娘')
	data.text = args['替代文字'] or args[2]
	
	if '改' == mw.ustring.sub(data.ship, -1) then
		data.ship = mw.ustring.sub(data.ship, 1, -2)
		data.dye = args['文字上色'] or 2
		data.transform = args['显示改造'] or 3
	else
		data.dye = args['文字上色'] or 1
		data.transform = args['显示改造']
	end
	
	return parseShipInStyle1(data)
end

p['带框头像文字'] = function(frame)
	local data = {}
	local args = parseArgument(frame)
	data.ship = p.NormalizeShipName(args[1] or '未知舰娘')
	data.dye = args['文字上色']
	data.text = args['替代文字']
	data.transform = args['显示改造']

	return parseShipInStyle3(data)
end

p['仅带框头像'] = function(frame)
	local data = {}
	local args = parseArgument(frame)
	data.ship = p.NormalizeShipName(args[1] or '未知舰娘')
	if '改' == mw.ustring.sub(data.ship, -1) then
		data.ship = mw.ustring.sub(data.ship, 1, -2)
		data.transform = args['显示改造'] or 3
	else
		data.transform = args['显示改造']
	end
	
	return parseShipAvatorOnlyInStyle3(data)
end


p['仅文字'] = function(frame)
	local data = {}
	local args = parseArgument(frame)
	data.ship = p.NormalizeShipName(args[1] or '未知舰娘')
	data.dye = args['文字上色']
	data.text = args['替代文字']
	data.transform = args['显示改造']

	return parseShipTextOnly(data)
end

p['无工具提示'] = function(frame)
	local args = parseArgument(frame)
	local foo = args[1] and p[args[1]]
	
	if not foo then
		mw.log('未能找到函数:'..tostring(args[1]))
		mw.logObject(args,'frame.args')
		return ('<large style="alert alert-red"> LUA 错误!</large>')
	end
	
	table.remove(args, 1)
	local html = foo( {args=args} )
	return  removeToolTip(html)
end

p['立绘预览'] = function(frame) 
	local args = parseArgument(frame)
	local foo = args[1] and p[args[1]]
	
	if not foo then
		mw.log('未能找到函数:'..tostring(args[1]))
		mw.logObject(args,'frame.args')
		return ('<large style="alert alert-red"> LUA 错误!</large>')
	end
	
	table.remove(args, 1)
	local ship = p.NormalizeShipName(args[1] or '未知舰娘')
	
	if not p.ship_data[ship] then
		mw.log('未能找到舰娘!')
		mw.logObject(args,'frame.args')
		error (([[<div style="alert alert-red">
LUA警告:未找到舰娘(%s)的数据。
</div>]]):format(ship));
	end
	
	
	local template = [==[
<div class="itemhover" style="position:relative;
 display:inline-block;">
{HTML}
<div class="iteminfo panel panel-primary"
 style="position:absolute;
 top:0;
 left:calc(100% + 80px);
 width:200px;
 box-shadow: 0 6px 12px rgba(0,0,0,.175);
 z-index:1000;">
[[文件:{FILE}|200px|link=]]
</div>
</div>
]==]
	local img = getShipPortraitFile(ship, args['显示改造'])
	local html = foo( {args=args} )
	html = template:gsub('\{(%w+)\}', {
				HTML = html,
				FILE = img,
			});
	
	return  removeToolTip(html:gsub('[\r\n]',''))
	
end

--测试函数
p.test = function()

	return p['立绘预览'] {
			args = {
				[1] = '带框头像文字',
				[2] = '绫波',
				['显示改造'] = 2,
				}
		}
end

--------------------------------------------------
--	主要过程
--------------------------------------------------
--移除当前LUA生成的HTML代码中的工具提示
function removeToolTip(html)
	html = html:gsub('(%[%[文件[^%]]-link=)([^|%]]*)([^%]]-%]%])', function(pre, link, post)
			if Text.trim(link) == '' then
				return pre..']]'
			end
			href = tostring(mw.uri.fullUrl(link))
			return ('<a href="%s">%s</a>'):format(href, pre..']]')
		end)
	html = html:gsub('%stitle=%b""', '')
	return html
end


--参考{{模板:小图标}}
--行内小头像和文本
function parseShipInStyle1(data)
	local sd = p.ship_data[data.ship]
	
	local img = getShipAvatarFile(data.ship, data.transform)
	local link = sd and data.ship or '|未实装的舰娘'
	local html = parseShipTextOnly(data)
	
	return ('<span class="xtb-image">[[文件:%s|30px|link=%s]]%s</span>'):format(
			img, link, html)
end
p.ParseShipInStyle1 = parseShipInStyle1

--仅行内小头像
function parseShipAvatorOnlyInStyle1(data)
	local sd = p.ship_data[data.ship]
	
	local img = getShipAvatarFile(data.ship, data.transform)
	local link = sd and data.ship or '|未实装的舰娘'
	
	return ('<span class="xtb-image">[[文件:%s|30px|link=%s]]</span>'):format(
			img, link)
end
p.ParseShipAvatorOnlyInStyle1 = parseShipAvatorOnlyInStyle1

--参考{{模板:舰体切换列表/行}}
--带框大头像和文本
function parseShipInStyle3(data)
	local template = [==[
<div style="display:inline-block;
 margin:3px;
 text-align:center;
 width:85px;">
<div style="display:inline-block;
 position:relative;
 overflow:hidden;
 height:80px;
 border-radius:7px;">
[[文件:%s|80px|link=%s]]
<div style="position:absolute;
 width:80px;
 top:0px;
 !important;">
[[文件:%s|80px|link=%s]]
</div>
</div>
<div style="height:38px">
%s
</div>
</div>
]==]
	local sd = p.ship_data[data.ship]
	local kai = sd and sd.transform and data.transform
	local avator = getShipAvatarFile(data.ship, kai)
	local frame = getAvatarFrameFile((kai and sd.rarity+1) 
			or (sd and sd.rarity))
	local link = sd and data.ship or '|未实装的舰娘'
	local html = parseShipTextOnly(data)
	
	local ret = template:format(avator, link, frame, link, html)
	return (ret:gsub('[\r\n]',''))
end
p.ParseShipInStyle3 = parseShipInStyle3

--仅带框大头像
function parseShipAvatorOnlyInStyle3(data)
	local template = [==[
<div style="display:inline-block;
 margin:3px;
 text-align:center;
 width:85px;">
<div style="display:inline-block;
 position:relative;
 overflow:hidden;
 height:80px;
 border-radius:7px;">
[[文件:%s|80px|link=%s]]
<div style="position:absolute;
 width:80px;
 top:0px;
 !important;">
[[文件:%s|80px|link=%s]]
</div>
</div>
</div>
]==]
	local sd = p.ship_data[data.ship]
	local kai = sd and sd.transform and data.transform
	local avator = getShipAvatarFile(data.ship, kai)
	local frame = getAvatarFrameFile((kai and sd.rarity+1) 
			or (sd and sd.rarity))
	local link = sd and data.ship or '|未实装的舰娘'
	
	local ret = template:format(avator, link, frame, link)
	return (ret:gsub('[\r\n]',''))
end
p.ParseShipAvatorOnlyInStyle3 = parseShipAvatorOnlyInStyle3

--仅显示带颜色的文本
function parseShipTextOnly(data)
	local sd = p.ship_data[data.ship]
	data.selflink = sd and p.NormalizeShipName(
			Text.trim(
				mw.title.getCurrentTitle().text
		)) == data.ship	
		
	--若当前页面是这个舰娘,则不进行文字上色
	--若查找不到这个舰娘的数据,则不对文字上色
	local dye = not data.selflink and sd and data.dye;
		
	--生成“改”字的样式
	local kai = ""
	local iskai = sd and sd.transform and data.transform

	if not iskai then
		--【模块:舰娘数据】中没有记录改造 => 不显示改字
	elseif data.text then
		--若有【替代文字】=> 不显示改字
	elseif data.transform == 1 then
		--样式1——舰娘^改
		kai = '<sup>改</sup>'
		if dye == 3 then	--按舰娘等级、改造等级,分别对文字染色
			kai = ('<sup style="color:%s">改</sup>'):format(
					rarityToColor(sd.rarity+1)
				)
		end
	elseif data.transform == 2 then
		--样式2——舰娘.改
		kai = '.改'
		if dye == 3 then	--按舰娘等级、改造等级,分别对文字染色
			kai = ('.<span style="color:%s">改</span>'):format(
					rarityToColor(sd.rarity+1)
				)
		end
	elseif data.transform == 3 then
		--样式3——舰娘改
		kai = '改'
		if dye == 3 then	--按舰娘等级、改造等级,分别对文字染色
			kai = ('<span style="color:%s">改</span>'):format(
					rarityToColor(sd.rarity+1)
				)
		end
	else
		mw.log("ParseShipTextOnly> 无效的显示改造参数——"..data.transform..",类型:"..type(data.transform))
	end
	--改字代码生成完毕
	
	--生成整段文本的样式
	local html = ""
	local href = tostring(mw.uri.fullUrl(data.ship))	--超链接地址
	local text = data.text or data.ship:gsub('JP','')	--舰娘名字(修正“新月JP”)
	
	if not sd then
		--当舰娘未记录(页面不存在)时
		href = tostring(mw.uri.fullUrl(data.ship, {action=edit, redlink=1}))
		html = ('<a class="new nowrap" title="%s(未实装的舰娘)" href="%s">%s</a>'):format(
			data.ship, href, text
		)
	elseif data.selflink then
		--当前页面是这个舰娘=> 不设置超链接
		html = ('<strong class="selflink nowrap" style="color:#808080;">%s%s</strong>'):format(
			text, kai
		)
	elseif dye then
		--使用使用舰娘等级(1)或改造等级(2)对文字染色
		local color = dye == 2 and iskai
					and rarityToColor(sd.rarity+1)
					or rarityToColor(sd.rarity)
		html = ('<a class="nowrap" style="color:%s" title="%s" href="%s">%s%s</a>'):format(
				color, data.ship, href, text, kai
			)
	else
		--不对文字上色
		html = ('<a class="nowrap" title="%s" href="%s">%s%s</a>'):format(
				data.ship, href, text, kai
			)
	end
	
	return html
end
p.ParseShipTextOnly = parseShipTextOnly

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

--解析传入参数——去空白符+转换数字
function parseArgument(frame)
	local arg = {}
	for k, v in pairs(frame.args) do
		arg[k] = tonumber(v) or Text.trim(v)
	end
	return arg
end

--将稀有度转换为颜色
function rarityToColor(rare)
	if rare == 2 then
		return '#808080'	--白色
	elseif rare == 3 then
		return '#3b8bff'	--蓝色
	elseif rare == 4 then
		return '#8000ff'	--紫色
	elseif rare == 5 then
		return '#c90'	--金色
	elseif rare == 6 or rare == 7 then
		return '#f37f82'	--彩色
	elseif rare == 15 then
		return '#a0522d'	--特别计划
	elseif rare == 16 then
		return '#c06'	--决战方案
	end
		return 'red'		--不存在
end
p.RarityToColor = rarityToColor

--返回舰娘的头像文件名
function getShipAvatarFile(ship, kai)
	return not p.ship_data[ship] and '未知舰娘头像.png'
		or kai and p.ship_data[ship].transform and ship..'改头像.jpg'
		or ship..'头像.jpg'
end

--返回舰娘
function getShipPortraitFile(ship, kai)
	return not p.ship_data[ship] and '未知舰娘立绘.png'
		or kai and p.ship_data[ship].transform and ship..'改造.jpg'
		or ship..'立绘.jpg'
end

--根据稀有度返回头像外框的文件名
function getAvatarFrameFile(rare)
	if rare == 2 then
		return '舰娘头像外框白色.png'	--白色
	elseif rare == 3 then
		return '舰娘头像外框蓝色.png'	--蓝色
	elseif rare == 4 then
		return '舰娘头像外框紫色.png'	--紫色
	elseif rare == 5 then
		return '舰娘头像外框金色.png'	--金色
	elseif rare == 6 or rare == 7 then
		return '舰娘头像外框彩色.png'	--彩色
	elseif rare == 15 then
		return '舰娘头像外框特别计划.png'	--特别计划
	elseif rare == 16 then
		return '舰娘头像外框决战方案.png'	--决战方案
	end
		return '舰娘头像外框.png'		--不存在
end

return p