模块:收纳表:修订间差异

跳到导航 跳到搜索
添加973字节 、​ 2022年9月11日 (星期日)
无编辑摘要
无编辑摘要
无编辑摘要
 
(未显示同一用户的18个中间版本)
第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
第8行: 第9行:
--[[ 非css的参数设定
--[[ 非css的参数设定
splitCount      = 5:    决定每行有几个物件
splitCount      = 5:    决定每行有几个物件
initialTab      = nil:  决定页面加载出来时,收纳表预设显示的tab。
                        nil的话就是一开始都不显示东西
textDisplay    = down: 内容相对于选择栏的位置,可输入
textDisplay    = down: 内容相对于选择栏的位置,可输入
                         top(内容在选择栏上)
                         top(内容在选择栏上)
                         down(内容在选择栏下)
                         down(内容在选择栏下)
                         left(内容在选择栏左,此时若用户无指定,则selectWidth会被预设成20%、textWidth被设成60%、textHeight, selectHeight皆被设成400px)
                         left(内容在选择栏左)
                         right(内容在选择栏右,同上)
                         right(内容在选择栏右)
--]]
--]]


local p = {}
local p = {}
local tabIndices = {} --用于处理编号非连续的情况
local notCSS = { --非CSS的参数
local divCSS = {class=''}
     splitCount = true,
local selectTabCSS = {
     initialTab  = true,
    class      = '',
     textDisplay = true,
     splitCount = '5',
    display    = 'grid',
     margin    = '2.5%',
     gap        = '6px',
}
}
local selectItemCSS = {
 
     class  = '',
--用于处理编号非连续的情况与css优先度的问题
     margin  = '0',
--优先度问题如:直接塞:css(table),margin-left被margin盖掉
     padding = '0',
--前者范围较小,因此(应该是)希望前者优先
     ['font-weight'] = '700',
local ordering = {
    tabIndices = {},
     stgt = {},
     stab = {},
     sitm = {},
     ctab = {},
    citm = {},
}
}
local contentTabCSS = {
 
     class  = '',
local CSSvalue = {
     display = 'inline',
     stgt = {},
     margin  = '2.5%',
     stab = {},
     ['margin-left'] = '0',
     sitm = {},
     height  = '400px',
     ctab = {},
    ['overflow-y']  = 'auto',
     citm = {},
    width  = '60%',
}
}
local contentItemCSS = {}


 
local initialTab = nil
 
local function firstToLower(str)
    return str:gsub("^%u", string.lower)
end


--处理旧参数名与别名
--处理旧参数名与别名
第52行: 第51行:
     str = str:gsub('^select', 'stab')
     str = str:gsub('^select', 'stab')
     str = str:gsub('^text', 'ctab')
     str = str:gsub('^text', 'ctab')
     --[[str = str:gsub('^selecttab', 'st')
    str = str:gsub('^sitem', 'sitm')
     str = str:gsub('^selectitem', 'si')
    str = str:gsub('^citem', 'citm')
     str = str:gsub('^contenttab', 'ct')
     --[[str = str:gsub('^selecttab', 'stab')
     str = str:gsub('^contentitem', 'ci')]]--
     str = str:gsub('^selectitem', 'sitem')
     return str
     str = str:gsub('^contenttab', 'ctab')
     str = str:gsub('^contentitem', 'citem')]]--
     return str:gsub("^%u", string.lower) --第一个字小写
end
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, vertical)
local function renderSelect(contents)
     local tabs_pages = mw.html.create('div')
     local tabs_pages = mw.html.create('div')
         :addClass('tabs_pages ' .. selectTabCSS['class'])
         :addClass('tabs_pages stab ' .. CSSvalue['stab']['class'])
         :css('grid-template-columns',
         :css('grid-template-columns',
             string.rep('1fr ', tonumber(selectTabCSS['splitCount'])))
             string.rep('1fr ', tonumber(contents['splitCount'])))


     if vertical then
     for _, CSS in ipairs(ordering['stab']) do
        tabs_pages
         tabs_pages:css(CSS, CSSvalue['stab'][CSS])
            :css('display', 'inline-grid')
            :css('height', '400px')
            :css('overflow-y', 'auto')
            :css('width', '20%')
    end
    if selectTabCSS['height'] ~= nil then
         tabs_pages:css('overflow-y', 'auto')
    end
    if selectTabCSS['width'] ~= nil then
        tabs_pages:css('overflow-x', 'auto')
     end
     end


    selectTabCSS['class'] = nil
     for originalIndex, tabIndex in ipairs(ordering['tabIndices']) do
    selectTabCSS['splitCount'] = nil
         local sitm = tabs_pages:tag('div')
    tabs_pages:css(selectTabCSS)
             :addClass('tab sitm ' .. CSSvalue['sitm']['class'])
 
    local itemClass = selectItemCSS['class']
    selectItemCSS['class'] = nil
     for _, tabIndex in ipairs(tabIndices) do
         tabs_pages:tag('div')
             :addClass('tab ' .. itemClass)
            :css(selectItemCSS)
             :wikitext(contents['tab' .. tabIndex])
             :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


第99行: 第119行:


--处理内容栏
--处理内容栏
local function renderContent(contents, vertical)
local function renderContent(contents)
     local tabs_contents = mw.html.create('div')
     local tabs_contents = mw.html.create('div')
         :addClass('tabs-contents ' .. contentTabCSS['class'])
         :addClass('tabs-contents ctab ' .. CSSvalue['ctab']['class'])


     if vertical then
     for _, CSS in ipairs(ordering['ctab']) do
        tabs_contents
        tabs_contents:css(CSS, CSSvalue['ctab'][CSS])
            :css('display', 'inline')
            :css('margin', '2.5%')
            :css('margin-left', '0')
            :css('height', '400px')
            :css('overflow-y', 'auto')
            :css('width', '60%')
     end
     end
    if contentTabCSS['textHeight'] ~= nil then
        tabs_contents:css('overflow-y', 'auto')
    end
    if contentTabCSS['textWidth'] ~= nil then
        tabs_contents:css('overflow-x', 'auto')
    end
    contentTabCSS['class'] = nil
    tabs_contents:css(contentTabCSS)


    local itemClass = contentItemCSS['class']
     for originalIndex, tabIndex in ipairs(ordering['tabIndices']) do
    contentItemCSS['class'] = nil
         local citm = tabs_contents:tag('div')
     for _, tabIndex in ipairs(tabIndices) do
             :addClass('tab-c citm ' .. CSSvalue['citm']['class'])
         tabs_contents:tag('div')
             :addClass('tab-c ' .. itemClass)
            :css(contentItemCSS)
             :wikitext(contents['content' .. tabIndex])
             :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
     end


第144行: 第150行:
     --将获取的参数传给args
     --将获取的参数传给args
     for k, v in pairs(page_args) do
     for k, v in pairs(page_args) do
         if v ~= 'nil' then args[replaceArgsName(k)] = v end --避免空的参数
    k = '' .. k
         if v ~= 'nil' then
            if notCSS[k] then args[k] = v
            else args[replaceArgsName(k)] = v end
        end
     end
     end
    initialTab = tonumber(args['initialTab'])


     for k, v in pairs(args) do
 
         k = '' .. k
    --处理CSSvalue
         if not k:match('^content%d+') then
    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
             if k:match('^tab%d+$') then
                 table.insert(tabIndices, tonumber(k:sub(4)))
                 table.insert(ordering['tabIndices'], tonumber(k:sub(4)))
             elseif k:match('^stab') then
             elseif validArgs[k:sub(1, 4)] then
                selectTabCSS[firstToLower(k:sub(5))] = v
                 local prefix = k:sub(1, 4)
            elseif k:match('^sitem') then
                 local CSS = k:sub(5)
                 selectItemCSS[firstToLower(k:sub(6))] = v
                 CSSvalue[prefix][CSS] = v
            elseif k:match('^ctab') then
                 contentTabCSS[firstToLower(k:sub(5))] = v
            elseif k:match('^citem') then
                 contentItemCSS[firstToLower(k:sub(6))] = v
             else
             else
                 divCSS[firstToLower(k)] = v
                 CSSvalue['stgt'][k] = v
             end
             end
         end
         end
     end
     end
     table.sort(tabIndices)
    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')
     local mainDiv = mw.html.create('div')
     local vertical = args['textDisplay'] == 'left' or args['textDisplay'] == 'right'
     mainDiv:addClass('tabs-container stgt ' .. CSSvalue['stgt']['class'])
    if vertical then mainDiv:css('display', 'flex') end
     for _, divCSS in ipairs(ordering['stgt']) do
 
        mainDiv:css(divCSS, CSSvalue['stgt'][divCSS])
    local divClass = divCSS['class']
    end
     divCSS['class'] = nil
    mainDiv
        :addClass('tabs-container ' .. divClass)
        :css(divCSS)


     if args['textDisplay'] == 'top' or args['textDisplay'] == 'left' then
     if args['textDisplay'] == 'top' or args['textDisplay'] == 'left' then
         mainDiv:node(renderContent(args, vertical))
         mainDiv:node(renderContent(args))
         mainDiv:node(renderSelect(args, vertical))
         mainDiv:node(renderSelect(args))
     else
     else
         mainDiv:node(renderSelect(args, vertical))
         mainDiv:node(renderSelect(args))
         mainDiv:node(renderContent(args, vertical))
         mainDiv:node(renderContent(args))
     end
     end


导航菜单