缺氧 wiki 编辑团队提示:注册账号并登录后体验更佳,且可通过参数设置定制优化您的浏览体验!

该站点为镜像站点,如果你想帮助这个由玩家志愿编辑的 wiki 站点,请前往原站点参与编辑,
同时欢迎加入编辑讨论群 851803695 与其他编辑者一起参与建设!

全站通知:

模块:信息框

来自缺氧WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

文档

程序包函数

p.genNode(t, args)函数
参数
t 标签模板(
t.tag 标签名称,比如 data、image 等(
t.attr 标签属性键值对(;可选)
t.source 从 args 中获取信息时所用的键(;可选)
t.header header 文本,用于 group 标签(;可选)
t.label label 文本,用于 section 标签(;可选)
t.children 内部的元素(;可选)
t.children[i] 内部的一个元素,格式与 t 一致(递归)(;可选)
args 填入标签的信息,为键值对(
p.genNode.collapsible(args)函数
生成可折叠块
参数
args 参数(
args.collapsed 初始折叠,默认为否(布尔;可选)
args.expandText 展开按钮的文本(字符串;可选)
args.collapseText 收起按钮的文本(字符串;可选)
args.showText 始终显示的文本(字符串;可选)
args.node 可以被折叠的文本(字符串
p.genNode.panel(data)函数
生成多个 pannel
参数
data 数据(
data[i].label 对应 panel 的标签(
data[i].content 对应 panel 的内容(
data[i].content[i] 对应 panel 的内容的各个元素(
返回:mw.html 构造器(
p.genNode.infobox(title, content, raw)函数
生成一个信息框形式的table
参数
title 信息框标题(字符串
content 信息框内容(
content[i] 信息框内容中的某一个元素(
raw 是否输出原始 mw.html 构造器。如否则输出预处理后的结果(布尔;可选)
返回:生成的信息框(

子页面模块



-- Module:信息框
local p = {}
local fstr = mw.ustring.format -- shortcut for formattig a string

--  生成group中children的内容

function p.genchlidNode(t, args)
    local node = mw.html.create('div'):css('min-height',"30px"):css('border-bottom','1px solid rgb(101,60,92)')
	if t.label ~= nil then
		node:css('display', 'grid')
    	node:css('grid-template-columns', '90px auto')
        local label = node:tag('div'):css('text-align','right'):css('background',"rgb(67,46,73)"):wikitext(t.label)
        if t.source ~= nil then
        	if args[t.source] == nil then return nil end
        	local data = node:tag("div"):css('text-align','left'):css("padding-left",'10px'):wikitext(args[t.source])
        end
	elseif t.source ~= nil then
    	if args[t.source] ~= nil then
        	local source = node:tag('div'):css("padding-left",'10px'):css("padding-right",'10px')
        	if t.source == "描述" then source:css('text-align','center')
        	else source:css('text-align','left') end
        	source:wikitext(args[t.source])
        else return nil
        end
    end
    return node
end


--  生成table中一行(即<tr>标签)的内容
--
--  @function p.genNode
--  @param      {table} t 标签模板
--  @param      {table} t.tag 标签名称,比如 data、image 等
--  @param[opt]  {table} t.attr 标签属性键值对
--  @param[opt] {table} t.source 从 args 中获取信息时所用的键
--  @param[opt] {table} t.header header 文本,用于 group 标签
--  @param[opt] {table} t.label label 文本,用于 section 标签
--  @param[opt] {table} t.children 内部的元素
--  @param[opt] {table} t.children[i] 内部的一个元素,格式与 t 一致(递归)
--  @param      {table} args 填入标签的信息,为键值对
function p.genNode(t, args)
	local node = mw.html.create('tr'):css('background',"rgb(47,36,62)"):css('height',"30px"):css('border-bottom','1px solid rgb(101,60,92)')
	if t.tag == 'image' then
		local img = node:tag('td'):attr('colspan', 2):css('text-align','center')
        if t.source ~= nil then
        	if args[t.source] == nil then return nil end
        	img:wikitext('[[file:'..args[t.source]..'|150px]]')
        end
		if t.children ~= nil then
			local child = img:tag('div'):css('font-size','75%'):css('padding','4px')
        	if t.children[1].source ~= nil then
        		if args[t.children[1].source] == nil then return nil end
        		child:wikitext(args[t.children[1].source])
        	end
        end
	elseif t.tag == 'group' and t.children ~= nil then
		local nodechild = {}
		for _, c in ipairs(t.children) do table.insert(nodechild,p.genchlidNode(c, args)) end
		if #nodechild ~= 0 then
        	local group = node:tag('td'):attr('colspan', 2):css('text-align','center'):tag('div')
        	group:css('text-align','center'):css('background','none')
			group:addClass("mw-collapsible bg-primary mw-made-collapsible")
        	if t.attr ~= nil and t.attr.collapse == 'open' then 
        		group:node('<span class="mw-collapsible-toggle mw-collapsible-toggle-default mw-collapsible-toggle-expanded" role="button" tabindex="0" aria-expanded="true"><a class="mw-collapsible-text">折叠</a></span>')
        	else 
        		group:addClass("mw-collapsed")
        		group:node('<span class="mw-collapsible-toggle mw-collapsible-toggle-default mw-collapsible-toggle-collapsed" role="button" tabindex="0" aria-expanded="false"><a class="mw-collapsible-text">展开</a></span>')
        	end
			local title = group:tag('p'):css('background',"rgb(123,70,103)"):wikitext(t.header)
        	local data = group:tag('div'):addClass("mw-collapsible-content"):css('text-align','left')
        	if t.attr ~= nil and t.attr.collapse == 'open' then --do nothing
        	else data:css('display','none') end
			for _, c in ipairs(nodechild) do 
				data:wikitext(tostring(c)) end
		else return nil end
    elseif t.label ~= nil then
        local label = node:tag("th"):attr('scope', "row"):css('width','90px')
        label:css('width','100px'):css('background',"rgb(67,46,73)"):css('text-align',"right")
        label:wikitext(t.label)
        if t.source ~= nil then
        	if args[t.source] == nil then return nil end
    		local data = node:tag("td"):css('text-align',"left"):css("padding-left",'10px'):wikitext(args[t.source])
        end
    elseif t.source ~= nil then
    	if args[t.source] ~= nil then
        local source = node:tag('th'):attr('colspan', 2)
        	if t.source == "描述" then source:css('text-align','center')
        	else source:css('text-align','left') end
        	source:wikitext(args[t.source])
    	end
    else return nil end
    return node
end

--- 生成可折叠块
--
--  @function p.collapsible
--  @param      {table}  args 参数
--  @param[opt] {bool}   args.collapsed 初始折叠,默认为否
--  @param[opt] {string} args.expandText 展开按钮的文本
--  @param[opt] {string} args.collapseText 收起按钮的文本
--  @param[opt] {string} args.showText 始终显示的文本
--  @param      {string} args.node 可以被折叠的文本
function p.collapsible(args)
    local node = mw.html.create('div')
    node:addClass('mw-collapsible')
    if args.collapsed then node:addClass('mw-collapsed') end
    node:css('width', '100%')

    if args.expandText ~= nil then
        node:attr('data-expandtext', args.expandText)
    end
    if args.collapseText ~= nil then
        node:attr('data-collapsetext', args.collapseText)
    end

    if args.showText ~= nil then node:wikitext(args.showText) end

    local inner = node:tag('div'):addClass('mw-collapsible-content')
    inner:tag('small'):css({
        ['display'] = 'grid',
        ['grid-template-columns'] = 'repeat(5, auto)',
        ['justify-content'] = 'start'
    }):wikitext(args.hideText)
    mw.log(node)
    return node
end

--- 生成多个 pannel
--  
--  @function p.panel
--  @param  {table} data 数据
--  @param  {table} data[i].label 对应 panel 的标签
--  @param  {table} data[i].content 对应 panel 的内容
--  @param  {table} data[i].content[i] 对应 panel 的内容的各个元素
--  @return {table} mw.html 构造器
function p.panel(data)
    local a = 1
    local b = 1
    local panel = mw.html.create('div'):addClass('main-line-wrap'):css('float',"right"):css('width',"350px")
    local labeldiv = panel:tag('div'):addClass("resp-tabs"):css('background',"rgb(47,36,62)")
    local ul = labeldiv:tag('ul'):addClass('resp-tabs-list clearfix')
    for _, pData in ipairs(data) do
    	local li = ul:tag('li')
    	if a ~= nil then li:addClass("active bili-list-style") a = nil
    	else li:addClass("bili-list-style") end
    	local span = li:tag('span'):addClass("tab-panel"):css('width','80px'):css('color','white'):css('font-size','90%')
        span:wikitext(pData.label)
    end
    local condiv = labeldiv:tag('div'):addClass("resp-tabs-container")
    for _, pData in ipairs(data) do
    	local datadiv = condiv:tag('div'):addClass("resp-tab-content")
    	if b ~= nil then datadiv:css("display",'block') b = nil end
    	datadiv:node(p.infobox(pData.label, pData.content))
    end
    return panel
end

--- 生成一个信息框形式的table
--
--  @function p.infobox
--  @param      {string} title 信息框标题
--  @param      {table} content 信息框内容
--  @param      {table} content[i] 信息框内容中的某一个元素
--  @param[opt] {bool} raw 是否输出原始 mw.html 构造器。如否则输出预处理后的结果
--  @return     {table} 生成的信息框
function p.infobox(title, content, raw, theme,style)
	if #content == 1 then return content[1] end
    local infobox = mw.html.create('table'):attr('cellspacing',"3")
    infobox:css('text-align',"center"):css('width',"350px"):css('float',"right")
    if theme ~= nil then infobox:attr{theme = theme} end
    if style ~= nil then infobox:css(style) end
    if title ~= nil then
        local titleth = infobox:tag('tr'):tag('th')
        titleth:attr('colspan', 2):css('text-align','center'):css('background',"rgb(123,70,103)"):css('font-size',"200%"):wikitext(title)
    	end
    for _, n in ipairs(content or {}) do 
    	infobox:node(n) 
    	end
    if not raw then
        infobox = mw.getCurrentFrame():preprocess(tostring(infobox))
    end
    return infobox..'<div class="visible-xs">'..mw.getCurrentFrame():expandTemplate({title="clear"})..'</div>'
end

return p