模块:收纳表:修订间差异
外观
	
	
小 新增:调整页面加载时,最初显示的tab,的参数  | 
				小无编辑摘要  | 
				||
| (未显示同一用户的2个中间版本) | |||
| 第1行: | 第1行: | ||
--理论上能调整所有的style,并可新增class  | --理论上能调整所有的style,并可新增class  | ||
--|(css)   整個storage container的css  | |||
--|stab(css)   选择栏的css。曾经为select(css)  | --|stab(css)   选择栏的css。曾经为select(css)  | ||
--|sitem(css)  选择栏中每个物件的css  | --|sitem(css)  选择栏中每个物件的css  | ||
| 第10行: | 第11行: | ||
initialTab      = nil:  决定页面加载出来时,收纳表预设显示的tab。  | initialTab      = nil:  决定页面加载出来时,收纳表预设显示的tab。  | ||
                         nil的话就是一开始都不显示东西  |                          nil的话就是一开始都不显示东西  | ||
textDisplay     = down: 内容相对于选择栏的位置,可输入  | textDisplay     = down: 内容相对于选择栏的位置,可输入  | ||
                         top(内容在选择栏上)  |                          top(内容在选择栏上)  | ||
| 第20行: | 第20行: | ||
local p = {}  | local p = {}  | ||
local notCSS = { --非CSS的参数  | local notCSS = { --非CSS的参数  | ||
     splitCount  = true,  |      splitCount  = true,  | ||
     initialTab  = true,  |      initialTab  = true,  | ||
    textDisplay = true,  | |||
}  | }  | ||
| 第30行: | 第30行: | ||
local ordering = {  | local ordering = {  | ||
     tabIndices = {},  |      tabIndices = {},  | ||
     stgt = {},  | |||
     stab = {},  |      stab = {},  | ||
     sitm = {},  |      sitm = {},  | ||
| 第38行: | 第38行: | ||
local CSSvalue = {  | local CSSvalue = {  | ||
     stgt = {},  | |||
     stab = {},  |      stab = {},  | ||
     sitm = {},  |      sitm = {},  | ||
| 第51行: | 第51行: | ||
     str = str:gsub('^select', 'stab')  |      str = str:gsub('^select', 'stab')  | ||
     str = str:gsub('^text', 'ctab')  |      str = str:gsub('^text', 'ctab')  | ||
     str = str:gsub('^sitem', '  |      str = str:gsub('^sitem', 'sitm')  | ||
     str = str:gsub('^citem', '  |      str = str:gsub('^citem', 'citm')  | ||
     --[[str = str:gsub('^selecttab', 'stab')  |      --[[str = str:gsub('^selecttab', 'stab')  | ||
     str = str:gsub('^selectitem', 'sitem')  |      str = str:gsub('^selectitem', 'sitem')  | ||
| 第65行: | 第65行: | ||
local function fillWithDefaultCSS(contents, horizontal)  | local function fillWithDefaultCSS(contents, horizontal)  | ||
     local defaults = {  |      local defaults = {  | ||
         stgt = {class = '',},  | |||
         stab = {class = '',},  | |||
         sitm = {class = '',},  | |||
         ctab = {class = '',},  | |||
         stab = {  |          citm = {class = '',},  | ||
         sitm = {  | |||
         ctab = {  | |||
         citm = {class='',},  | |||
     }  |      }  | ||
     if horizontal then  |      if horizontal then  | ||
         contents['splitCount'] = contents['splitCount'] or '1'  |          contents['splitCount'] = contents['splitCount'] or '1'  | ||
     end  |      end  | ||
     contents['splitCount'] = contents['splitCount'] or '5'  |      contents['splitCount'] = contents['splitCount'] or '5'  | ||
     local elements = {'  |      local elements = {'stgt', 'stab', 'sitm', 'ctab', 'citm'}  | ||
     for _,   |      for _, elem in ipairs(elements) do  | ||
         local resizeFlowDir = {height='y', width='x'}  |          local resizeFlowDir = {height='y', width='x'}  | ||
         for size, dir in pairs(resizeFlowDir) do  |          for size, dir in pairs(resizeFlowDir) do  | ||
             if CSSvalue[  |              if CSSvalue[elem][size] then  | ||
                 defaults[  |                  defaults[elem]['overflow-'..dir] = 'auto'  | ||
             end  |              end  | ||
         end  |          end  | ||
         for CSS, defaultValue in pairs(defaults[  |          for CSS, defaultValue in pairs(defaults[elem]) do  | ||
             CSSvalue[  |              CSSvalue[elem][CSS] = CSSvalue[elem][CSS] or defaultValue  | ||
         end  |          end  | ||
     end  |      end  | ||
| 第128行: | 第95行: | ||
local function renderSelect(contents)  | local function renderSelect(contents)  | ||
     local tabs_pages = mw.html.create('div')  |      local tabs_pages = mw.html.create('div')  | ||
         :addClass('tabs_pages ' .. CSSvalue['stab']['class'])  |          :addClass('tabs_pages stab ' .. CSSvalue['stab']['class'])  | ||
         :css('grid-template-columns',  |          :css('grid-template-columns',  | ||
              string.rep('1fr ', tonumber(contents['splitCount'])))  |               string.rep('1fr ', tonumber(contents['splitCount'])))  | ||
| 第138行: | 第105行: | ||
     for originalIndex, tabIndex in ipairs(ordering['tabIndices']) do  |      for originalIndex, tabIndex in ipairs(ordering['tabIndices']) do  | ||
         local sitm = tabs_pages:tag('div')  |          local sitm = tabs_pages:tag('div')  | ||
             :addClass('tab ' .. CSSvalue['sitm']['class'])  |              :addClass('tab sitm ' .. CSSvalue['sitm']['class'])  | ||
             :wikitext(contents['tab' .. tabIndex])  |              :wikitext(contents['tab' .. tabIndex])  | ||
         if originalIndex == initialTab then sitm:addClass('active') end  |          if originalIndex == initialTab then sitm:addClass('active') end  | ||
| 第154行: | 第121行: | ||
local function renderContent(contents)  | local function renderContent(contents)  | ||
     local tabs_contents = mw.html.create('div')  |      local tabs_contents = mw.html.create('div')  | ||
         :addClass('tabs-contents ' .. CSSvalue['ctab']['class'])  |          :addClass('tabs-contents ctab ' .. CSSvalue['ctab']['class'])  | ||
     for _, CSS in ipairs(ordering['ctab']) do  |      for _, CSS in ipairs(ordering['ctab']) do  | ||
| 第162行: | 第129行: | ||
     for originalIndex, tabIndex in ipairs(ordering['tabIndices']) do  |      for originalIndex, tabIndex in ipairs(ordering['tabIndices']) do  | ||
         local citm = tabs_contents:tag('div')  |          local citm = tabs_contents:tag('div')  | ||
             :addClass('tab-c ' .. CSSvalue['citm']['class'])  |              :addClass('tab-c citm ' .. CSSvalue['citm']['class'])  | ||
             :wikitext(contents['content' .. tabIndex])  |              :wikitext(contents['content' .. tabIndex])  | ||
         if originalIndex == initialTab then citm:addClass('active') end  |          if originalIndex == initialTab then citm:addClass('active') end  | ||
| 第189行: | 第156行: | ||
         end  |          end  | ||
     end  |      end  | ||
     initialTab = args['initialTab']  |      initialTab = tonumber(args['initialTab'])  | ||
     --处理CSSvalue  |      --处理CSSvalue  | ||
     local validArgs = {stab=true, sitm=true, ctab=true, citm=true}  |      local validArgs = {stgt=true, stab=true, sitm=true, ctab=true, citm=true}  | ||
     for k, v in pairs(args) do    |      for k, v in pairs(args) do    | ||
         k = '' .. k; v = '' .. v  |          k = '' .. k; v = '' .. v  | ||
| 第203行: | 第171行: | ||
                 CSSvalue[prefix][CSS] = v  |                  CSSvalue[prefix][CSS] = v  | ||
             else  |              else  | ||
                 CSSvalue['  |                  CSSvalue['stgt'][k] = v  | ||
             end  |              end  | ||
         end  |          end  | ||
| 第209行: | 第177行: | ||
     local horizontal = args['textDisplay']=='left' or args['textDisplay']=='right'  |      local horizontal = args['textDisplay']=='left' or args['textDisplay']=='right'  | ||
     fillWithDefaultCSS(args, horizontal)  |      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  | |||
     --处理ordering  |      --处理ordering  | ||
     local elements = {'  |      local elements = {'stgt', 'stab', 'sitm', 'ctab', 'citm'}  | ||
     for _, s in ipairs(elements) do  |      for _, s in ipairs(elements) do  | ||
         for k, _ in pairs(CSSvalue[s]) do  |          for k, _ in pairs(CSSvalue[s]) do  | ||
| 第221行: | 第195行: | ||
     local mainDiv = mw.html.create('div')  |      local mainDiv = mw.html.create('div')  | ||
     mainDiv:addClass('tabs-container ' .. CSSvalue['  |      mainDiv:addClass('tabs-container stgt ' .. CSSvalue['stgt']['class'])  | ||
     for _, divCSS in ipairs(ordering['  |      for _, divCSS in ipairs(ordering['stgt']) do  | ||
         mainDiv:css(divCSS, CSSvalue['  |          mainDiv:css(divCSS, CSSvalue['stgt'][divCSS])  | ||
     end  |      end  | ||
2022年9月11日 (日) 13:06的最新版本
此模块的文档可以在模块:收纳表/doc创建
--理论上能调整所有的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 notCSS = { --非CSS的参数
    splitCount  = true,
    initialTab  = true,
    textDisplay = true,
}
--用于处理编号非连续的情况与css优先度的问题
--优先度问题如:直接塞:css(table),margin-left被margin盖掉
--前者范围较小,因此(应该是)希望前者优先
local ordering = {
    tabIndices = {},
    stgt = {},
    stab = {},
    sitm = {},
    ctab = {},
    citm = {},
}
local CSSvalue = {
    stgt = {},
    stab = {},
    sitm = {},
    ctab = {},
    citm = {},
}
local initialTab = nil
--处理旧参数名与别名
local function replaceArgsName(str)
    str = str:gsub('^select', 'stab')
    str = str:gsub('^text', 'ctab')
    str = str:gsub('^sitem', 'sitm')
    str = str:gsub('^citem', 'citm')
    --[[str = str:gsub('^selecttab', 'stab')
    str = str:gsub('^selectitem', 'sitem')
    str = str:gsub('^contenttab', 'ctab')
    str = str:gsub('^contentitem', 'citem')]]--
    return str:gsub("^%u", string.lower) --第一个字小写
end
--空的数值填入预设值
local function fillWithDefaultCSS(contents, horizontal)
    local defaults = {
        stgt = {class = '',},
        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
        for CSS, defaultValue in pairs(defaults[elem]) do
            CSSvalue[elem][CSS] = CSSvalue[elem][CSS] or defaultValue
        end
    end
end
--处理选择栏
local function renderSelect(contents)
    local tabs_pages = mw.html.create('div')
        :addClass('tabs_pages stab ' .. CSSvalue['stab']['class'])
        :css('grid-template-columns',
             string.rep('1fr ', tonumber(contents['splitCount'])))
    for _, CSS in ipairs(ordering['stab']) do
        tabs_pages:css(CSS, CSSvalue['stab'][CSS])
    end
    for originalIndex, tabIndex in ipairs(ordering['tabIndices']) do
        local sitm = tabs_pages:tag('div')
            :addClass('tab sitm ' .. CSSvalue['sitm']['class'])
            :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
    return tostring(tabs_pages)
end
--处理内容栏
local function renderContent(contents)
    local tabs_contents = mw.html.create('div')
        :addClass('tabs-contents ctab ' .. CSSvalue['ctab']['class'])
    for _, CSS in ipairs(ordering['ctab']) do
        tabs_contents:css(CSS, CSSvalue['ctab'][CSS])
    end
    for originalIndex, tabIndex in ipairs(ordering['tabIndices']) do
        local citm = tabs_contents:tag('div')
            :addClass('tab-c citm ' .. CSSvalue['citm']['class'])
            :wikitext(contents['content' .. tabIndex])
        if originalIndex == initialTab then citm:addClass('active') end
        for _, CSS in ipairs(ordering['citm']) do
            citm:css(CSS, CSSvalue['citm'][CSS])
        end
    end
    return tostring(tabs_contents)
end
function p.selectTable(frame)
    local args = {}
    --获取页面传来的参数,而非模板#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
    initialTab = tonumber(args['initialTab'])
    --处理CSSvalue
    local validArgs = {stgt=true, stab=true, sitm=true, ctab=true, citm=true}
    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
    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
    --处理ordering
    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'])
    local mainDiv = mw.html.create('div')
    mainDiv:addClass('tabs-container stgt ' .. CSSvalue['stgt']['class'])
    for _, divCSS in ipairs(ordering['stgt']) do
        mainDiv:css(divCSS, CSSvalue['stgt'][divCSS])
    end
    if args['textDisplay'] == 'top' or args['textDisplay'] == 'left' then
        mainDiv:node(renderContent(args))
        mainDiv:node(renderSelect(args))
    else
        mainDiv:node(renderSelect(args))
        mainDiv:node(renderContent(args))
    end
    return tostring(mainDiv)
end
return p