WIKI公告栏
欢迎各位引航者访问卡拉彼丘WIKI,由于游客访问页面会有一定的页面旧版缓存,建议你登陆B站账号进行浏览,如果您觉得本WIKI有帮助到你,欢迎推荐给身边的引航者。
欢迎各位引航者访问卡拉彼丘WIKI,由于游客访问页面会有一定的页面旧版缓存,建议你登陆B站账号进行浏览,如果您觉得本WIKI有帮助到你,欢迎推荐给身边的引航者。
全站通知:
模块:Roles
刷
历
编
跳到导航
跳到搜索
此模块用于输出角色数据,一般用于角色页的角色模板和角色筛选表。
local p = {}
local format = string.format
local data = mw.loadData("Module:Roles/Data")
local a = require("Module:ACandy")
local tr, th, td = a.tr, a.th, a.td
local Raw = a.Raw
local function getPageTitle()
return mw.title.getCurrentTitle().text
end
-------角色页角色模板角色信息部分-------
p["角色信息"] = function()
local roleName = getPageTitle()
local RoleInfo = data[roleName]
assert(RoleInfo, "角色数据不存在")
local Th = th[{ colspan = 2, style = "text-align:center;border-radius: 0;" }]
local Td = td[{ style = "border-radius: 0;" }]
--- 定位图标链接
local function ProfessionIconLink(profession)
return a.span { class = "badge rounded-pill bg-primary", style = "padding: 5px; border-radius: 5px; background-color: #DDD",
Raw(format(
'[[File:角色定位-%s.png|20px|link=角色定位#%s|alt=]] [[角色定位#%s|<span style="color: #000;">%s</span>]]',
profession, profession, profession, profession
))
}
end
--- 阵营图标链接
local function CampIconLink(camp)
return Raw(format(
'[[File:%s阵营小图标.png|30px|link=角色阵营#%s|alt=]] [[角色阵营#%s|<span style="color: #000;">%s</span>]]',
camp, camp, camp, camp
))
end
local Roletable = a.table { class = "klbqtable", style = "text-align: center; width: 100%; font-weight: bold;",
tr {
td { rowspan = 3, colspan = 2, style = "border-bottom-left-radius: 0;", "[[文件:", roleName, "头像.png|80px|class=radius50]]" },
td { style = "border-bottom-right-radius: 0;", roleName },
},
tr {
Td { RoleInfo.NameEn },
},
tr {
Td / a.span { lang = "ja", RoleInfo.NameJp }
},
tr {
Th "性别",
Td { RoleInfo.Sex },
},
tr {
Th "身份",
Td / a.span { class = "badge rounded-pill bg-primary", style = "color: #fff;padding: 5px;border-radius: 5px;background-color: #C02A35",
RoleInfo.Title,
},
},
tr {
Th "定位",
Td { ProfessionIconLink(RoleInfo.Profession) },
},
tr {
Th "阵营",
Td { CampIconLink(RoleInfo.Camp) },
},
tr {
th { colspan = 2, style = "text-align:center;border-top-left-radius: 0;", "简介" },
td { style = "border-top-right-radius: 0;", RoleInfo.Desc },
},
}
return a.h2 "角色信息", Roletable, a.br
end
-------角色页角色模板角色设定部分-------
p["角色设定"] = function()
local roleName = getPageTitle()
local RoleInfo = data[roleName]
assert(RoleInfo, "角色数据不存在")
local function Row(tableHeader, tableData)
return tr {
th[{ style = "width: 25%;" }](tableHeader),
td(tableData),
}
end
local zhcn = mw.language.new("zh-cn")
local Roletable = a.table { class = "klbqtable", style = "font-size: 14px; width: 100%; text-align: center;",
Row("声优", { "中文:", RoleInfo.CvCn, a.br, "日文:", RoleInfo.Cv }),
Row("画师", "卡丘画师协会"),
Row("生日", zhcn:formatDate("Mj日", RoleInfo.Birthday)),
Row("星座", RoleInfo.Constellation),
Row("年龄", RoleInfo.Age),
Row("身高", RoleInfo.Height),
Row("体重", RoleInfo.Weight),
Row("活动区域", RoleInfo.Apartment),
}
return a.h2 "角色设定", Roletable
end
-------角色页角色模板角色技能部分-------
p["角色技能"] = function(frame)
local args = frame:getParent().args
local role = getPageTitle()
local skillTypeToNum = {
["主动"] = 1,
["被动"] = 2,
["终极"] = 3,
}
local skills = {} -- 1、2、3分别为主动、被动、终极技能
for i = 1, 3 do
local prefix = "技能" .. i
skills[i] = {
name = args[prefix],
desc = args[prefix .. "描述"],
video = args[prefix .. "视频演示"],
analysis = args[prefix .. "解析"],
}
end
local div, span = a.div, a.span
local divtabs1 = div[{ class = "resp-tab-content", style = "display: block; text-align: left; height: 240px;" }]
local divtabs2 = div[{ class = "resp-tab-content", style = "text-align: left; height: 240px;" }]
local function SkillDetail(skillType)
local num = skillTypeToNum[skillType]
local skill = skills[num]
return {
tr / th { colspan = 2, style = "text-align:center;font-size: 18px", skillType, "技能" },
tr {
td { style = "width:20%;font-weight:bold;font-size: 20px;",
"[[文件:", role, "技能", num, ".png]]", a.br, Raw(skill.name),
},
td[{ style = "height: 307px;" }] / div["main-line-wrap"] / div["resp-tabs"] {
a.ul { class = "resp-tabs-list clearfix",
a.li["active bili-list-style"] / span { class = "tab-panel", "技能描述" },
a.li["bili-list-style"] / span { class = "tab-panel", "视频演示" },
a.li["bili-list-style"] / span { class = "tab-panel", "技能解析" },
},
div { class = "resp-tabs-container", style = "padding:10px;font-size: 16px",
divtabs1 { Raw(skill.desc) },
divtabs2 { Raw(skill.video) },
divtabs2 { Raw(skill.analysis) },
},
},
},
}
end
local Roleskilltable = a.table { class = "klbqtable", style = "width: 100%;text-align: center",
SkillDetail("主动"),
SkillDetail("被动"),
SkillDetail("终极"),
}
return a.h2 "角色技能", Roleskilltable
end
-------角色页角色模板角色武器部分-------
p["角色武器"] = function()
local RoleInfo = data[getPageTitle()]
assert(RoleInfo, "角色数据不存在")
local head = a.li "武器详情、原型资料等请前往武器页查看。"
local RoleWeapontable = a.table { class = "klbqtable", style = "text-align:center;width:100%",
tr {
td { style = "font-weight: bold; font-size: 18px;", "[[", RoleInfo.Weapon, "]]" },
td { style = "font-weight: bold;", RoleInfo.Weapontype },
},
tr / td { colspan = 2, RoleInfo.Weapondesc },
tr / td { colspan = 2, "[[File:", getPageTitle(), "-weapon.png|300px]]" },
}
return a.h2 "角色武器", head, RoleWeapontable
end
--- 角色筛选表页面模块
p["角色筛选"] = function()
local html = mw.html.create()
local resultList = {} -- 创建一个空表用于存储结果
for value, role in pairs(data) do
local roleHTML = html
:tag('tr'):addClass('divsort'):attr('data-param1', role.Camp):attr('data-param2', role.Profession):attr(
'data-param3', role.Weapontype)
:tag('td'):tag('div'):cssText(
'width: 80px; border-radius: 50%; margin: 0 auto; font-size: 15px; font-weight: bold; padding: 2px')
:wikitext('[[File:' .. role.Iconfile .. '|class=profilepicture|link=' .. value .. ']]<br>[[' .. value .. ']]')
:done():done()
:tag('td'):wikitext('[[文件:' .. role.Camp .. '阵营小图标.png|30px]]' .. role.Camp):done()
:tag('td'):wikitext('中文:' .. role.CvCn .. '<br>日文:' .. role.Cv):done()
:tag('td'):tag('span'):addClass('badge rounded-pill bg-primary')
:cssText('width: 60px; padding: 5px; border-radius: 5px; background-color: #DDD')
:wikitext('[[File:角色定位-' ..
role.Profession ..
'.png|20px|link=角色定位#' ..
role.Profession ..
'|alt=]] [[角色定位#' .. role.Profession .. '|<span style="color: #000">' .. role.Profession .. '</span>]]')
:done():done()
:tag('td'):wikitext(role.Weapontype):done()
:tag('td'):addClass('hidden-xs'):wikitext(role.Speed):done()
:tag('td'):addClass('hidden-xs'):wikitext(role.Armor):done()
table.insert(resultList, tostring(roleHTML)) -- 将生成的HTML代码添加到结果表中
end
local result = table.concat(resultList) -- 将结果表中的所有HTML代码连接在一起
return result -- 返回连接后的结果
end
-------角色单项信息拉取模块-------
function p.getInfo(frame)
local attr = frame.args[1]
assert(attr and attr ~= "", "缺少参数1")
attr = mw.text.trim(attr)
local name = mw.text.trim(frame.args[2] or "null")
local info = data[name]
if not (info and info[attr]) then
return mw.text.trim(frame.args[3] or "")
end
return info[attr]
end
p["角色设定卡"] = function(frame)
local rolename = frame.args[1]
local zhcn = mw.language.new("zh-cn")
local allrows = ""
local RoleInfo = data[rolename]
assert(RoleInfo, "角色数据不存在")
allrows = frame:expandTemplate {
title = '角色设定卡/core',
args = {
['中文名'] = rolename,
['中文全名'] = frame.args['中文全名'],
['相关人士'] = frame.args['相关人士'],
['角色介绍'] = frame.args['角色介绍'],
['萌点'] = frame.args['萌点'],
['英文名'] = RoleInfo.NameEn,
['日文名'] = RoleInfo.NameJp,
['阵营'] = RoleInfo.Camp,
['中文声优'] = RoleInfo.CvCn,
['日文声优'] = RoleInfo.Cv,
['年龄'] = RoleInfo.Age,
['星座'] = RoleInfo.Constellation,
['生日'] = zhcn:formatDate("Mj日", RoleInfo.Birthday),
['身高'] = RoleInfo.Height,
['体重'] = RoleInfo.Weight,
['活动区域'] = RoleInfo.Apartment,
['Color'] = frame.args['Color']
}
}
return allrows
end
return p