模块:AutoTabTable:修订间差异
外观
Willson-v-(留言 | 贡献) 建立内容为“local p = {} local params = {} params["prefix" ] = {'a', 'i', 'e'} params["tab_prefix" ] = 'tab_header' params["display_title"…”的新页面 |
小 追加参数 |
||
(未显示3个用户的66个中间版本) | |||
第7行: | 第7行: | ||
params["title" ] = "表格默认标题" | params["title" ] = "表格默认标题" | ||
params["item_per_tab" ] = "50" | params["item_per_tab" ] = "50" | ||
params["max_width" ] = " | params["min_width" ] = "80%" | ||
params["max_width" ] = "fit-content" | |||
params["max_height" ] = "fit-content" | |||
params["margin" ] = "" | |||
params["shadow" ] = "0px 0px 0px #878787" | |||
params["tab_color" ] = "#004B97" | params["tab_color" ] = "#004B97" | ||
params["tab_bg_color" ] = "# | params["tab_bg_color" ] = "#ffffff" | ||
params["header" ] = {'作者', '主题', '简介'} | params["header" ] = {'作者', '主题', '简介'} | ||
params["color" ] = {'# | params["color" ] = {'#000000', '#000000', '#000000'} | ||
params["bg_color" ] = {'# | params["bg_color" ] = {'#f8f9fa', '#f8f9fa', '#f8f9fa'} | ||
params["color_alt" ] = {'# | params["text" ] = {'center', 'center', 'left'} | ||
params["bg_color_alt" ] = {'# | params["color_alt" ] = {'#202122', '#202122', '#202122'} | ||
params["header_color" ] = {'# | params["bg_color_alt" ] = {'#f8f9fa', '#f8f9fa', '#f8f9fa'} | ||
params["header_bg_color" ] = {'# | params["header_color" ] = {'#000000', '#000000', '#000000'} | ||
params["header_bg_color" ] = {'#d2d3d4', '#d2d3d4', '#d2d3d4'} | |||
params["display" ] = {'true', 'true', 'true'} | params["display" ] = {'true', 'true', 'true'} | ||
params["col_width" ] = {' | params["col_width" ] = {'50px', '350px', '350px'} | ||
params["col_height" ] = {'fit-content', 'fit-content', 'fit-content'} | |||
params["border_color" ] = { | params["border_color" ] = { | ||
'# | '#878787 #878787 #878787 #878787', | ||
'# | '#878787 #878787 #878787 #878787', | ||
'# | '#878787 #878787 #878787 #878787', | ||
} | } | ||
params["header_border_color" ] = { | params["header_border_color" ] = { | ||
'# | '#878787 #878787 #878787 #878787', | ||
'# | '#878787 #878787 #878787 #878787', | ||
'# | '#878787 #878787 #878787 #878787', | ||
} | } | ||
params["border_style" ] = { | params["border_style" ] = { | ||
" | "solid solid solid solid", | ||
" | "solid solid solid solid", | ||
" | "solid solid solid solid", | ||
} | } | ||
params["header_border_style" ] = { | params["header_border_style" ] = { | ||
" | "solid solid solid solid", | ||
" | "solid solid solid solid", | ||
" | "solid solid solid solid", | ||
} | } | ||
params["border_width" ] = { | params["border_width" ] = { | ||
" | "1px 1px 1px 1px", | ||
" | "1px 1px 1px 1px", | ||
" | "1px 1px 1px 1px", | ||
} | } | ||
params["header_border_width" ] = { | params["header_border_width" ] = { | ||
" | "1px 1px 1px 1px", | ||
" | "1px 1px 1px 1px", | ||
" | "1px 1px 1px 1px", | ||
} | } | ||
第54行: | 第60行: | ||
"display_title", | "display_title", | ||
"item_per_tab", | "item_per_tab", | ||
"min_width", | |||
"max_width", | "max_width", | ||
"max_height", | |||
"shadow", | |||
"margin", | |||
"tab_color", | "tab_color", | ||
"tab_bg_color" | "tab_bg_color" | ||
第69行: | 第79行: | ||
"display" , | "display" , | ||
"col_width" , | "col_width" , | ||
"col_height" , | |||
"border_color" , | "border_color" , | ||
"header_border_color" , | "header_border_color" , | ||
第75行: | 第86行: | ||
"border_width" , | "border_width" , | ||
"header_border_width" , | "header_border_width" , | ||
"text" , | |||
} | } | ||
第86行: | 第98行: | ||
:css('padding' ,'10px') | :css('padding' ,'10px') | ||
:css('width' , params["col_width" ][i]) | :css('width' , params["col_width" ][i]) | ||
:css('height' , params["col_height" ][i]) | |||
:css('color' , params["header_color" ][i]) | :css('color' , params["header_color" ][i]) | ||
:css('background-color' , params["header_bg_color" ][i]) | :css('background-color' , params["header_bg_color" ][i]) | ||
第91行: | 第104行: | ||
:css('border-color' , params["header_border_color" ][i]) | :css('border-color' , params["header_border_color" ][i]) | ||
:css('border-style' , params["header_border_style" ][i]) | :css('border-style' , params["header_border_style" ][i]) | ||
:css('text-align' , params["text" ][i]) | |||
end | end | ||
end | end | ||
第105行: | 第119行: | ||
:css('padding' ,'10px') | :css('padding' ,'10px') | ||
:css('width' , params["col_width" ][i]) | :css('width' , params["col_width" ][i]) | ||
:css('height' , params["col_height" ][i]) | |||
:css('border-width' , params["border_width" ][i]) | :css('border-width' , params["border_width" ][i]) | ||
:css('border-color' , params["border_color" ][i]) | :css('border-color' , params["border_color" ][i]) | ||
:css('border-style' , params["border_style" ][i]) | :css('border-style' , params["border_style" ][i]) | ||
:css('text-align' , params["text" ][i]) | |||
if row_id % 2 == 0 then | if row_id % 2 == 0 then | ||
info | info | ||
第116行: | 第132行: | ||
:css('color' , params["color_alt" ][i]) | :css('color' , params["color_alt" ][i]) | ||
:css('background-color' , params["bg_color_alt" ][i]) | :css('background-color' , params["bg_color_alt" ][i]) | ||
end | end | ||
end | end | ||
第126行: | 第143行: | ||
:addClass('wikitable') | :addClass('wikitable') | ||
:addClass('mw-collapsible') | :addClass('mw-collapsible') | ||
:addClass('plainrowheaders') | :addClass('plainrowheaders') | ||
:css('overflow-x', 'auto') | :css('overflow-x', 'auto') | ||
:css('width', " | :css('width', "fit-content") | ||
:css('height', "fit-content") | |||
if args['collapsed'] then tbl:addClass('mw-collapsed') end | |||
if params["display_title"] == "true" then | if params["display_title"] == "true" then | ||
第151行: | 第171行: | ||
-- i hate lua why array subscribtion starts at 1 | -- i hate lua why array subscribtion starts at 1 | ||
local tot_row_ids = {} | local tot_row_ids = {} | ||
for k, _ in pairs(args) do | for k, _ in pairs(args) do | ||
local anum = ('' .. k):match('^a(%d+)$') | local anum = ('' .. k):match('^a(%d+)$') | ||
第160行: | 第179行: | ||
table.sort(tot_row_ids) | table.sort(tot_row_ids) | ||
local tab_count = | local tab_count = 0 | ||
local current_item_count = 0 | |||
local current_max_item = tonumber(params["item_per_tab"]) | |||
local tabs_row_ids = {} | local tabs_row_ids = {} | ||
for i, a in ipairs(tot_row_ids) do | |||
if current_item_count == 0 then | |||
if tab_count ~= 0 then table.sort(tabs_row_ids[tab_count]) end | |||
tab_count = tab_count + 1 | |||
if args["item_in_tab"..tostring(tab_count)] then | |||
current_max_item = tonumber(args["item_in_tab"..tostring(tab_count)]) | |||
else | |||
current_max_item = tonumber(params["item_per_tab"]) | |||
end | |||
tabs_row_ids[tab_count] = {} | |||
end | |||
table.insert(tabs_row_ids[tab_count], a) | |||
current_item_count = current_item_count + 1 | |||
if current_item_count == current_max_item then | |||
current_item_count = 0 | |||
end | |||
end | |||
-- if only one table is needed... | -- if only one table is needed... | ||
第168行: | 第206行: | ||
constraint_div | constraint_div | ||
:css("max-width", params["max_width"]) | :css("max-width", params["max_width"]) | ||
:css("min-width", params["min_width"]) | |||
:css("max-height", params["max_height"]) | |||
:css("box-shadow", params["shadow"]) | |||
:css("margin", params["margin"]) | |||
local tbl = renderTable(args, tot_row_ids) | local tbl = renderTable(args, tot_row_ids) | ||
constraint_div:node(tbl) | constraint_div:node(tbl) | ||
return constraint_div | return constraint_div | ||
end | end | ||
第185行: | 第220行: | ||
:addClass("tabs-container") | :addClass("tabs-container") | ||
:css("max-width", params["max_width"]) | :css("max-width", params["max_width"]) | ||
:css("min-width", params["min_width"]) | |||
:css("max-height", params["max_height"]) | |||
:css("box-shadow", params["shadow"]) | |||
:css("margin", params["margin"]) | |||
-- create tab ui list | -- create tab ui list | ||
local tab_list = tabs_div:tag("ul") | local tab_list = tabs_div:tag("ul") | ||
第193行: | 第231行: | ||
:css("overflow-x", "auto") | :css("overflow-x", "auto") | ||
for i, | local current_count = 1 | ||
for i, row_ids in ipairs(tabs_row_ids) do | |||
local list_ele = tab_list:tag("li") | local list_ele = tab_list:tag("li") | ||
if i == 1 then | if i == 1 then | ||
第201行: | 第240行: | ||
:addClass("tab") | :addClass("tab") | ||
:tag("strong") | :tag("strong") | ||
if args[params['tab_prefix']..tostring(i)] then | |||
ele_title:wikitext(args[params['tab_prefix']..tostring(i)]) | |||
else | |||
ele_title:wikitext(tostring(current_count).."~"..tostring(current_count+tableLength(row_ids)-1)) | |||
end | |||
current_count = current_count + tableLength(row_ids) | |||
end | end | ||
第213行: | 第253行: | ||
:addClass("tabs-contents") | :addClass("tabs-contents") | ||
:css("width", "auto") | :css("width", "auto") | ||
:css("height", "auto") | |||
for i, row_ids in ipairs(tabs_row_ids) do | for i, row_ids in ipairs(tabs_row_ids) do | ||
local table_ele = tables_list:tag("div") | local table_ele = tables_list:tag("div") | ||
第222行: | 第262行: | ||
:addClass("tab-c") | :addClass("tab-c") | ||
:css("width", "auto") | :css("width", "auto") | ||
:css("height", "auto") | |||
local inner_content = table_ele:tag("div") | local inner_content = table_ele:tag("div") | ||
inner_content | inner_content | ||
第227行: | 第268行: | ||
:css("columns", "1") | :css("columns", "1") | ||
:css("width", "auto") | :css("width", "auto") | ||
:css("height", "auto") | |||
local content_tbl = renderTable(args, row_ids) | local content_tbl = renderTable(args, row_ids) | ||
inner_content:node(content_tbl) | inner_content:node(content_tbl) |
2025年5月16日 (五) 03:55的最新版本
这是Template:AutoTabTable的下层Lua模块;
请不要直接使用该模块~
local p = {}
local params = {}
params["prefix" ] = {'a', 'i', 'e'}
params["tab_prefix" ] = 'tab_header'
params["display_title" ] = {'false'}
params["title" ] = "表格默认标题"
params["item_per_tab" ] = "50"
params["min_width" ] = "80%"
params["max_width" ] = "fit-content"
params["max_height" ] = "fit-content"
params["margin" ] = ""
params["shadow" ] = "0px 0px 0px #878787"
params["tab_color" ] = "#004B97"
params["tab_bg_color" ] = "#ffffff"
params["header" ] = {'作者', '主题', '简介'}
params["color" ] = {'#000000', '#000000', '#000000'}
params["bg_color" ] = {'#f8f9fa', '#f8f9fa', '#f8f9fa'}
params["text" ] = {'center', 'center', 'left'}
params["color_alt" ] = {'#202122', '#202122', '#202122'}
params["bg_color_alt" ] = {'#f8f9fa', '#f8f9fa', '#f8f9fa'}
params["header_color" ] = {'#000000', '#000000', '#000000'}
params["header_bg_color" ] = {'#d2d3d4', '#d2d3d4', '#d2d3d4'}
params["display" ] = {'true', 'true', 'true'}
params["col_width" ] = {'50px', '350px', '350px'}
params["col_height" ] = {'fit-content', 'fit-content', 'fit-content'}
params["border_color" ] = {
'#878787 #878787 #878787 #878787',
'#878787 #878787 #878787 #878787',
'#878787 #878787 #878787 #878787',
}
params["header_border_color" ] = {
'#878787 #878787 #878787 #878787',
'#878787 #878787 #878787 #878787',
'#878787 #878787 #878787 #878787',
}
params["border_style" ] = {
"solid solid solid solid",
"solid solid solid solid",
"solid solid solid solid",
}
params["header_border_style" ] = {
"solid solid solid solid",
"solid solid solid solid",
"solid solid solid solid",
}
params["border_width" ] = {
"1px 1px 1px 1px",
"1px 1px 1px 1px",
"1px 1px 1px 1px",
}
params["header_border_width" ] = {
"1px 1px 1px 1px",
"1px 1px 1px 1px",
"1px 1px 1px 1px",
}
local global_param_list = {
"title",
"display_title",
"item_per_tab",
"min_width",
"max_width",
"max_height",
"shadow",
"margin",
"tab_color",
"tab_bg_color"
}
local col_param_list = {
"header" ,
"color" ,
"bg_color" ,
"color_alt" ,
"bg_color_alt" ,
"header_color" ,
"header_bg_color" ,
"display" ,
"col_width" ,
"col_height" ,
"border_color" ,
"header_border_color" ,
"border_style" ,
"header_border_style" ,
"border_width" ,
"header_border_width" ,
"text" ,
}
function renderHeader(tbl)
local row = tbl:tag('tr')
for i=1,3 do
if params["display"][i] == "true" then
local header_th = row:tag('th')
header_th
:wikitext(params["header"][i])
:css('padding' ,'10px')
:css('width' , params["col_width" ][i])
:css('height' , params["col_height" ][i])
:css('color' , params["header_color" ][i])
:css('background-color' , params["header_bg_color" ][i])
:css('border-width' , params["header_border_width" ][i])
:css('border-color' , params["header_border_color" ][i])
:css('border-style' , params["header_border_style" ][i])
:css('text-align' , params["text" ][i])
end
end
end
function renderRow(row_id, args, tbl)
local row = tbl:tag('tr')
for i=1,3 do
if params["display"][i] == "true" then
local info = row:tag('td')
info
:wikitext(args[params["prefix"][i] .. row_id]) --单元格样式
:css('padding' ,'10px')
:css('width' , params["col_width" ][i])
:css('height' , params["col_height" ][i])
:css('border-width' , params["border_width" ][i])
:css('border-color' , params["border_color" ][i])
:css('border-style' , params["border_style" ][i])
:css('text-align' , params["text" ][i])
if row_id % 2 == 0 then
info
:css('color' , params["color" ][i])
:css('background-color' , params["bg_color" ][i])
else
info
:css('color' , params["color_alt" ][i])
:css('background-color' , params["bg_color_alt" ][i])
end
end
end
end
--处理表格
function renderTable(args, row_ids)
local tbl = mw.html.create('table')
:addClass('wikitable')
:addClass('mw-collapsible')
:addClass('plainrowheaders')
:css('overflow-x', 'auto')
:css('width', "fit-content")
:css('height', "fit-content")
if args['collapsed'] then tbl:addClass('mw-collapsed') end
if params["display_title"] == "true" then
local caption = tbl:tag('caption')
caption
:wikitext(title)
:css('white-space', 'nowrap')
end
renderHeader(tbl)
for _, a in ipairs(row_ids) do
renderRow(a, args, tbl)
end
return tbl
end
function renderTabs(args)
-- extract row_ids in each tables
-- i hate lua why array subscribtion starts at 1
local tot_row_ids = {}
for k, _ in pairs(args) do
local anum = ('' .. k):match('^a(%d+)$')
if anum then
table.insert(tot_row_ids, tonumber(anum))
end
end
table.sort(tot_row_ids)
local tab_count = 0
local current_item_count = 0
local current_max_item = tonumber(params["item_per_tab"])
local tabs_row_ids = {}
for i, a in ipairs(tot_row_ids) do
if current_item_count == 0 then
if tab_count ~= 0 then table.sort(tabs_row_ids[tab_count]) end
tab_count = tab_count + 1
if args["item_in_tab"..tostring(tab_count)] then
current_max_item = tonumber(args["item_in_tab"..tostring(tab_count)])
else
current_max_item = tonumber(params["item_per_tab"])
end
tabs_row_ids[tab_count] = {}
end
table.insert(tabs_row_ids[tab_count], a)
current_item_count = current_item_count + 1
if current_item_count == current_max_item then
current_item_count = 0
end
end
-- if only one table is needed...
if tab_count == 1 then
local constraint_div = mw.html.create('div')
constraint_div
:css("max-width", params["max_width"])
:css("min-width", params["min_width"])
:css("max-height", params["max_height"])
:css("box-shadow", params["shadow"])
:css("margin", params["margin"])
local tbl = renderTable(args, tot_row_ids)
constraint_div:node(tbl)
return constraint_div
end
-- create tabs-container
local tabs_div = mw.html.create('div')
tabs_div
:addClass("tabs-container")
:css("max-width", params["max_width"])
:css("min-width", params["min_width"])
:css("max-height", params["max_height"])
:css("box-shadow", params["shadow"])
:css("margin", params["margin"])
-- create tab ui list
local tab_list = tabs_div:tag("ul")
tab_list
:addClass("tabs-pages")
:css("margin", "0")
:css("overflow-x", "auto")
local current_count = 1
for i, row_ids in ipairs(tabs_row_ids) do
local list_ele = tab_list:tag("li")
if i == 1 then
list_ele:addClass("active")
end
local ele_title = list_ele
:addClass("tab")
:tag("strong")
if args[params['tab_prefix']..tostring(i)] then
ele_title:wikitext(args[params['tab_prefix']..tostring(i)])
else
ele_title:wikitext(tostring(current_count).."~"..tostring(current_count+tableLength(row_ids)-1))
end
current_count = current_count + tableLength(row_ids)
end
-- create actual tables
local tables_list = tabs_div:tag("div")
tables_list
:addClass("tabs-contents")
:css("width", "auto")
:css("height", "auto")
for i, row_ids in ipairs(tabs_row_ids) do
local table_ele = tables_list:tag("div")
if i == 1 then
table_ele:addClass("active")
end
table_ele
:addClass("tab-c")
:css("width", "auto")
:css("height", "auto")
local inner_content = table_ele:tag("div")
inner_content
:addClass("inner-content")
:css("columns", "1")
:css("width", "auto")
:css("height", "auto")
local content_tbl = renderTable(args, row_ids)
inner_content:node(content_tbl)
end
return tabs_div
end
function tableLength(t)
local count = 0
for _ in pairs(t) do count = count + 1 end
return count
end
function p._historicalActivity(args)
-- deal with params
for _, key in ipairs(global_param_list) do
if args[key] then
params[key] = args[key]
end
end
for _, key in ipairs(col_param_list) do
for i=1,3 do
if args[key..tostring(i)] then
params[key][i] = args[key..tostring(i)]
end
end
end
--处理表格
local tb1 = renderTabs(args)
local res = mw.html.create()
res:node(tb1)
return tostring(res)
end
function p.historicalActivity(frame)
local args = {}
local parent_args = frame:getParent().args;--获取页面传来得参数,而不是模板的参数
--将获取的参数传给args
for k, v in pairs(parent_args) do
if v ~= '' then
args[k] = v
end
end
return p._historicalActivity(args)
end
return p