模块:舰娘图标
这个模块提供显示舰娘头像和上色文字。
通用参数
#1 = 舰娘 --要显示的舰娘的名字 替代文字 = 文本 --要显示的文字 文字上色 = nil, --不上色 1, --按舰娘稀有度上色 2, --按改造稀有度上色 3, --按舰娘稀有度、改造稀有度分别上色 显示改造 = nil, --舰娘 1, --舰娘^改 2, --舰娘.改 3, --舰娘改
函数示例
小图标
默认值。
不对文字上色,不显示改造。 |
{{#invoke: 舰娘图标 | 小图标 | 标枪 }} |
|
根据舰娘稀有度对文字上色。
不显示改造。 |
{{#invoke: 舰娘图标 | 小图标 | 标枪 | 文字上色 = 1 }} |
|
根据舰娘稀有度对文字上色。
显示改造(舰娘^改)。 |
{{#invoke: 舰娘图标 | 小图标 | 标枪 | 文字上色 = 1 | 显示改造 = 1 }} |
|
根据舰娘稀有度、改造稀有度分别上色。
显示改造(舰娘^改)。 |
{{#invoke: 舰娘图标 | 小图标 | 标枪 | 文字上色 = 3 | 显示改造 = 1 }} |
|
根据舰娘稀有度、改造稀有度分别上色。
显示改造(舰娘.改)。 |
{{#invoke: 舰娘图标 | 小图标 | 标枪 | 文字上色 = 3 | 显示改造 = 2 }} |
|
根据改造稀有度上色。
显示改造(舰娘改)。 |
{{#invoke: 舰娘图标 | 小图标 | 标枪 | 文字上色 = 2 | 显示改造 = 3 }} |
|
没有改造的舰船。
不会显示改造,也不会用改造稀有度上色。 |
{{#invoke: 舰娘图标 | 小图标 | 独角兽 | 文字上色 = 2 | 显示改造 = 2 }} |
|
设置了替代文字,会不显示的“改”字。
但仍需要参数“显示改造”来标记图标为原始舰船还是改造舰船。 |
{{#invoke: 舰娘图标 | 小图标 | 标枪 | 替代文字 = J级驱逐舰F61 | 文字上色 = 2 | 显示改造 = 2 }} |
|
不存在的舰娘,
会直接忽略文字上色和显示改造。 |
{{#invoke: 舰娘图标 | 小图标 | 五月雨 | 文字上色 = 2 | 显示改造 = 2 }} |
五月雨 |
小图标改
默认值。
根据舰娘稀有度上色。 不显示改造。 |
{{#invoke: 舰娘图标 | 小图标改 | 标枪 }} |
|
XX改
根据改造稀有度染色。 显示改造(舰娘改)。 |
{{#invoke: 舰娘图标 | 小图标改 | 标枪改 }} |
|
根据舰船稀有度染色。
显示替代文字。 |
{{#invoke: 舰娘图标 | 小图标改 | 标枪 | J级驱逐舰F61 }} 或 {{#invoke: 舰娘图标 | 小图标改 | 标枪 | 替代文字 = J级驱逐舰F61 }} |
|
XX改
根据改造稀有度染色。 显示替代文字。 |
{{#invoke: 舰娘图标 | 小图标改 | 标枪改 | J级驱逐舰F61 }} 或 {{#invoke: 舰娘图标 | 小图标改 | 标枪改 | 替代文字 = J级驱逐舰F61 }} |
带框头像文字
默认值。
不对文字上色,不显示改造。 |
{{#invoke: 舰娘图标 | 带框头像文字 | 绫波 }} |
|
根据改造稀有度上色。
显示改造(舰娘.改)。 |
{{#invoke: 舰娘图标 | 带框头像文字 | 绫波 | 文字上色 = 2 | 显示改造 = 2 }} |
|
没有改造的舰船。
不会显示改造,也不会用改造稀有度上色。 |
{{#invoke: 舰娘图标 | 带框头像文字 | 独角兽 | 文字上色 = 2 | 显示改造 = 2 }} |
|
不存在的舰娘,
会直接忽略文字上色和显示改造。 |
{{#invoke: 舰娘图标 | 带框头像文字 | 五月雨 | 文字上色 = 2 | 显示改造 = 2 }} |
五月雨
|
仅文字
只显示文字和链接。
根据舰娘稀有度、改造稀有度分别上色。 显示改造(舰娘^改)。 |
{{#invoke: 舰娘图标 | 仅文字 | 标枪 | 文字上色 = 3 | 显示改造 = 1 }} |
仅小图标/仅带框头像
只显示小头像。 | {{#invoke: 舰娘图标 | 仅小图标 | 标枪 }} {{#invoke: 舰娘图标 | 仅小图标 | 标枪改 }} |
|
只显示带框头像。 | {{#invoke: 舰娘图标 | 仅带框头像 | 标枪 }} {{#invoke: 舰娘图标 | 仅带框头像 | 标枪改 }} |
|
--模块:舰娘图标
--------------------------------------------------
-- 调用模块:舰娘数据
--------------------------------------------------
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 ('[[%s]]'):format(data.ship)
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>
<span>
%s
</span>
</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.nationality==97 and sd.rarity+20 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.nationality==97 and sd.rarity+20 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',''):gsub('DE',''):gsub('BB',''):gsub('CV',''):gsub('DOA',''):gsub('SSSS','') --舰娘名字(修正“新月JP”)
if not sd then
--当舰娘未记录(页面不存在)时
href = tostring(mw.uri.fullUrl(data.ship, {action=edit, redlink=1}))
html = ('<span class="new nowrap" title="%s(未实装的舰娘)" href="%s">%s</span>'):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
if dye == 2 and iskai then
color = rarityToColor(sd.rarity+1)
elseif sd.nationality == 97 then
color = rarityToColor(sd.rarity)
else
color = rarityToColor(sd.rarity)
end
html = ('[[%s|<span class="nowrap" style="color:%s" title="%s" >%s%s</span>]]'):format(
data.ship, color, data.ship, text, kai
)
else
--不对文字上色
html = ('[[%s|<span class="nowrap" title="%s">%s%s</span>]]'):format(
data.ship, data.ship, 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 '#ee494c' --彩色
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' --决战方案
elseif rare == 24 then
return '舰娘头像外框精锐META.png' --紫色META
elseif rare == 25 then
return '舰娘头像外框超稀有META.png' --金色META
elseif rare == 26 then
return '舰娘头像外框海上传奇META.png' --彩色META
end
return '舰娘头像外框.png' --不存在
end
return p