模块:Test:修订间差异

跳到导航 跳到搜索
删除3,844字节 、​ 2024年6月9日 (星期日)
无编辑摘要
无编辑摘要
无编辑摘要
第1行: 第1行:
--理论上能调整所有的style,并可新增class
--|(css)  整個storage container的css
--|stab(css)  选择栏的css。曾经为select(css)
--|sitem(css)  选择栏中每个物件的css
--|ctab(css)  内容栏的css。曾经为text(css)
--|citem(css)  内容栏中每个物件的css
--[[ 非css的参数设定
splitCount      = 5:    决定每行有几个物件
initialTab      = nil:  决定页面加载出来时,收纳表预设显示的tab。
                        nil的话就是一开始都不显示东西
textDisplay    = down: 内容相对于选择栏的位置,可输入
                        top(内容在选择栏上)
                        down(内容在选择栏下)
                        left(内容在选择栏左)
                        right(内容在选择栏右)
--]]
local p = {}
local p = {}
local notCSS = { --非CSS的参数
    splitCount  = true,
    initialTab  = true,
    textDisplay = true,
}


local params = {}
--用于处理编号非连续的情况与css优先度的问题
params["prefix"                ] = {'a', 'i', 'e'}
--优先度问题如:直接塞:css(table),margin-left被margin盖掉
params["tab_prefix"            ] = 'tab_header'
--前者范围较小,因此(应该是)希望前者优先
params["display_title"          ] = {'false'}
local ordering = {
params["title"                  ] = "表格默认标题"
    tabIndices = {},
params["item_per_tab"          ] = "50"
    stgt = {},
params["max_width"              ] = "fit-content"
    stab = {},
params["max_height"              ] = "fit-content"
    sitm = {},
params["margin"                ] = ""
     ctab = {},
params["shadow"                ] = "0px 0px 0px #878787"
     citm = {},
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 = {
local CSSvalue = {
     "title",
     stgt = {},
     "display_title",
     stab = {},
     "item_per_tab",
     sitm = {},
     "max_width",
     ctab = {},
     "max_height",
     citm = {},
    "shadow",
    "margin",
    "tab_color",
    "tab_bg_color"
}
}


local col_param_list = {
local initialTab = nil
    "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')
local function replaceArgsName(str)
     for i=1,3 do
     str = str:gsub('^select', 'stab')
        if params["display"][i] == "true" then
     str = str:gsub('^text', 'ctab')
            local header_th = row:tag('th')
    str = str:gsub('^sitem', 'sitm')
            header_th
    str = str:gsub('^citem', 'citm')
                :wikitext(params["header"][i])
    --[[str = str:gsub('^selecttab', 'stab')
                :css('padding'             ,'10px')
    str = str:gsub('^selectitem', 'sitem')
                :css('width'               , params["col_width"            ][i])
    str = str:gsub('^contenttab', 'ctab')
                :css('height'               , params["col_height"            ][i])
    str = str:gsub('^contentitem', 'citem')]]--
                :css('color'               , params["header_color"        ][i])
    return str:gsub("^%u", string.lower) --第一个字小写
                :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
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])


--空的数值填入预设值
local function fillWithDefaultCSS(contents, horizontal)
    local defaults = {
        stgt = {class = 'width','800px'},
        stab = {class = '',},
        sitm = {class = '',},
        ctab = {class = '',},
        citm = {class = '',},
    }
    if horizontal then
        contents['splitCount'] = contents['splitCount'] or '1'
    end
    contents['splitCount'] = contents['splitCount'] or '5'
    local elements = {'stgt', 'stab', 'sitm', 'ctab', 'citm'}
    for _, elem in ipairs(elements) do
        local resizeFlowDir = {height='y', width='x'}
        for size, dir in pairs(resizeFlowDir) do
            if CSSvalue[elem][size] then
                defaults[elem]['overflow-'..dir] = 'auto'
             end
             end
        end
        for CSS, defaultValue in pairs(defaults[elem]) do
            CSSvalue[elem][CSS] = CSSvalue[elem][CSS] or defaultValue
         end
         end
     end
     end
end
end


--处理表格
 
function renderTable(args, row_ids)
 
     local tbl = mw.html.create('table')
--处理选择栏
         :addClass('wikitable')
local function renderSelect(contents)
        :addClass('mw-collapsible')
     local tabs_pages = mw.html.create('div')
        :addClass('plainrowheaders')
         :addClass('tabs_pages stab ' .. CSSvalue['stab']['class'])
         :css('overflow-x', 'auto')
         :css('grid-template-columns',
        :css('width', "fit-content")
            string.rep('1fr ', tonumber(contents['splitCount'])))
        :css('min-width', "800px")
 
        :css('height', "fit-content")
     for _, CSS in ipairs(ordering['stab']) do
       
         tabs_pages:css(CSS, CSSvalue['stab'][CSS])
     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
     end


     renderHeader(tbl)
     for originalIndex, tabIndex in ipairs(ordering['tabIndices']) do
   
        local sitm = tabs_pages:tag('div')
    for _, a in ipairs(row_ids) do  
            :addClass('tab sitm ' .. CSSvalue['sitm']['class'])
        renderRow(a, args, tbl)
            :wikitext(contents['tab' .. tabIndex])
        if originalIndex == initialTab then sitm:addClass('active') end
        for _, CSS in ipairs(ordering['sitm']) do
            sitm:css(CSS, CSSvalue['sitm'][CSS])
        end
     end
     end


     return tbl
     return tostring(tabs_pages)
end
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 function renderContent(contents)
        local constraint_div = mw.html.create('div')
     local tabs_contents = mw.html.create('div')
         constraint_div
         :addClass('tabs-contents ctab ' .. CSSvalue['ctab']['class'])
            :css("max-width", params["max_width"])
 
            :css("max-height", params["max_height"])
    for _, CSS in ipairs(ordering['ctab']) do
            :css("box-shadow", params["shadow"])
        tabs_contents:css(CSS, CSSvalue['ctab'][CSS])
            :css("margin", params["margin"])
        local tbl = renderTable(args, tot_row_ids)
        constraint_div:node(tbl)
        return constraint_div
     end
     end


     -- create tabs-container
     for originalIndex, tabIndex in ipairs(ordering['tabIndices']) do
    local tabs_div = mw.html.create('div')
        local citm = tabs_contents:tag('div')
    tabs_div
            :addClass('tab-c citm ' .. CSSvalue['citm']['class'])
        :addClass("tabs-container")
            :wikitext(contents['content' .. tabIndex])
        :css("max-width", params["max_width"])
        if originalIndex == initialTab then citm:addClass('active') end
        :css("max-height", params["max_height"])
         for _, CSS in ipairs(ordering['citm']) do
        :css("box-shadow", params["shadow"])
             citm:css(CSS, CSSvalue['citm'][CSS])
: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
         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
     end


     -- create actual tables
     return tostring(tabs_contents)
    local tables_list = tabs_div:tag("div")
    tables_list
        :addClass("tabs-contents")
        :css("width", "auto")
        :css("min-width", "800px")
        :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("min-width", "800px")
            :css("height", "auto")
        local inner_content = table_ele:tag("div")
        inner_content
            :addClass("inner-content")
            :css("columns", "1")
            :css("width", "auto")
            :css("min-width", "800px")
            :css("height", "auto")
        local content_tbl = renderTable(args, row_ids)
        inner_content:node(content_tbl)
    end
    return tabs_div
end
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
function p.selectTable(frame)
     for _, key in ipairs(global_param_list) do
    local args = {}
         if args[key] then
 
            params[key] = args[key]
    --获取页面传来的参数,而非模板#invoke時的参数
    local page_args = frame:getParent().args;
 
     --将获取的参数传给args
     for k, v in pairs(page_args) do
    k = '' .. k
         if v ~= 'nil' then
            if notCSS[k] then args[k] = v
            else args[replaceArgsName(k)] = v end
         end
         end
     end
     end
    initialTab = tonumber(args['initialTab'])


     for _, key in ipairs(col_param_list) do
 
         for i=1,3 do
    --处理CSSvalue
             if args[key..tostring(i)] then
    local validArgs = {stgt=true, stab=true, sitm=true, ctab=true, citm=true}
                 params[key][i] = args[key..tostring(i)]
     for k, v in pairs(args) do  
         k = '' .. k; v = '' .. v
        if not (notCSS[k] or k:match('^content%d+')) then
            if k:match('^tab%d+$') then
                table.insert(ordering['tabIndices'], tonumber(k:sub(4)))
             elseif validArgs[k:sub(1, 4)] then
                 local prefix = k:sub(1, 4)
                local CSS = k:sub(5)
                CSSvalue[prefix][CSS] = v
            else
                CSSvalue['stgt'][k] = v
             end
             end
         end
         end
    end
    local horizontal = args['textDisplay']=='left' or args['textDisplay']=='right'
    fillWithDefaultCSS(args, horizontal)
    if horizontal then
    CSSvalue['stgt']['class'] = CSSvalue['stgt']['class'] .. ' hori'
        CSSvalue['stab']['class'] = CSSvalue['stab']['class'] .. ' hori'
        CSSvalue['ctab']['class'] = CSSvalue['stab']['class'] .. ' hori'
     end
     end


    --处理表格
    local tb1 = renderTabs(args)


     local res = mw.html.create()
    --处理ordering
     res:node(tb1)
     local elements = {'stgt', 'stab', 'sitm', 'ctab', 'citm'}
    for _, s in ipairs(elements) do
        for k, _ in pairs(CSSvalue[s]) do
            if k ~= 'class' then table.insert(ordering[s], k) end
        end
        table.sort(ordering[s])
     end
    table.sort(ordering['tabIndices'])


     return tostring(res)
     local mainDiv = mw.html.create('div')
end
    mainDiv:addClass('tabs-container stgt ' .. CSSvalue['stgt']['class'])
    for _, divCSS in ipairs(ordering['stgt']) do
        mainDiv:css(divCSS, CSSvalue['stgt'][divCSS])
    end


function p.historicalActivity(frame)
     if args['textDisplay'] == 'top' or args['textDisplay'] == 'left' then
     local args = {}
        mainDiv:node(renderContent(args))
    local parent_args = frame:getParent().args;--获取页面传来得参数,而不是模板的参数
        mainDiv:node(renderSelect(args))
      
     else
    --将获取的参数传给args
        mainDiv:node(renderSelect(args))
    for k, v in pairs(parent_args) do
         mainDiv:node(renderContent(args))
         if v ~= '' then
            args[k] = v
        end
     end
     end
     return p._historicalActivity(args)
 
     return tostring(mainDiv)
end
end


return p
return p
15,450

个编辑

导航菜单