模块:AutoTabTable:修订间差异
外观
	
	
小 修改  | 
				小 追加参数  | 
				||
| (未显示2个用户的22个中间版本) | |||
| 第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"           ] = "#ffffff"  | params["tab_bg_color"           ] = "#ffffff"  | ||
| 第13行: | 第17行: | ||
params["color"                  ] = {'#000000', '#000000', '#000000'}  | params["color"                  ] = {'#000000', '#000000', '#000000'}  | ||
params["bg_color"               ] = {'#f8f9fa', '#f8f9fa', '#f8f9fa'}  | params["bg_color"               ] = {'#f8f9fa', '#f8f9fa', '#f8f9fa'}  | ||
params["text"                   ] = {'center', 'center', 'left'}  | |||
params["color_alt"              ] = {'#202122', '#202122', '#202122'}  | params["color_alt"              ] = {'#202122', '#202122', '#202122'}  | ||
params["bg_color_alt"           ] = {'#f8f9fa', '#f8f9fa', '#f8f9fa'}  | params["bg_color_alt"           ] = {'#f8f9fa', '#f8f9fa', '#f8f9fa'}  | ||
| 第18行: | 第23行: | ||
params["header_bg_color"        ] = {'#d2d3d4', '#d2d3d4', '#d2d3d4'}  | 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',  | ||
| 第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  | ||
| 第186行: | 第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)  | ||
| 第196行: | 第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")  | ||
| 第226行: | 第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")  | ||
| 第235行: | 第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  | ||
| 第240行: | 第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