本WIKI由逆熵战略研究所申请于2020年03月03日创建,编辑权限开放,如遇Chrome浏览器登陆后无法编辑点这里 BWIKI反馈留言板 BWIKI收藏到桌面的方法说明
我们的WIKI还有许多不足之处,欢迎大家积极补充
因系统升级,本站评论区暂时关闭
本站为非官方攻略站,若对官方有任何意见请到官方评论区留言,否则本攻略站有权按照《崩坏3WIKI社区规则》和《崩坏3WIKI免责声明》进行处理。

一路顺风,琪亚娜。我们会等你回家。

全站通知:

模块:女武神图标

来自崩坏3WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:女武神图标/doc创建

--模块:女武神图标

--------------------------------------------------
--  调用模块:女武神数据
--------------------------------------------------
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('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