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

来自SS唯基
跳到导航 跳到搜索
无编辑摘要
无编辑摘要
第16行: 第16行:


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




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


--处理旧参数名与别名
--处理旧参数名与别名
第56行: 第62行:
     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 renderSelect(contents, vertical)
local function renderSelect(contents, horizontal)
     local tabs_pages = mw.html.create('div')
     local tabs_pages = mw.html.create('div')
         :addClass('tabs_pages ' .. selectTabCSS['class'])
         :addClass('tabs_pages ' .. 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
     if horizontal then
         tabs_pages
         tabs_pages
             :css('display', 'inline-grid')
             :css('display', 'inline-grid')
第77行: 第87行:
             :css('width', '20%')
             :css('width', '20%')
     end
     end
     if selectTabCSS['height'] ~= nil then
     if CSSvalue['stab']['height'] ~= nil then
         tabs_pages:css('overflow-y', 'auto')
         tabs_pages:css('overflow-y', 'auto')
     end
     end
     if selectTabCSS['width'] ~= nil then
     if CSSvalue['stab']['width'] ~= nil then
         tabs_pages:css('overflow-x', 'auto')
         tabs_pages:css('overflow-x', 'auto')
     end
     end


     selectTabCSS['class'] = nil
     for _, CSS in ipairs(ordering['stab']) do
    selectTabCSS['splitCount'] = nil
        tabs_pages:css(CSS, CSSvalue['stab'][CSS])
     tabs_pages:css(selectTabCSS)
     end


    local itemClass = selectItemCSS['class']
     for _, tabIndex in ipairs(ordering['tabIndices']) do
    selectItemCSS['class'] = nil
     for _, tabIndex in ipairs(tabIndices) do
         tabs_pages:tag('div')
         tabs_pages:tag('div')
             :addClass('tab ' .. itemClass)
             :addClass('tab ' .. CSSvalue['sitm']['class'])
            :css(selectItemCSS)
             :wikitext(contents['tab' .. tabIndex])
             :wikitext(contents['tab' .. tabIndex])
        for _, CSS in ipairs(ordering['sitm']) do
            tabs_pages:css(CSS, CSSvalue['sitm'][CSS])
        end
     end
     end


第103行: 第113行:


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


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


    contentTabCSS['class'] = nil
     for _, tabIndex in ipairs(ordering['tabIndices']) do
    tabs_contents:css(contentTabCSS)
 
    local itemClass = contentItemCSS['class']
    contentItemCSS['class'] = nil
     for _, tabIndex in ipairs(tabIndices) do
         tabs_contents:tag('div')
         tabs_contents:tag('div')
             :addClass('tab-c ' .. itemClass)
             :addClass('tab-c ' .. CSSvalue['citm']['class'])
            :css(contentItemCSS)
             :wikitext(contents['content' .. tabIndex])
             :wikitext(contents['content' .. tabIndex])
        for _, CSS in ipairs(ordering['citm']) do
            tabs_contents:css(CSS, CSSvalue['citm'][CSS])
        end
     end
     end


第141行: 第148行:


function p.selectTable(frame)
function p.selectTable(frame)
     local args = {}
     local args = {splitCount=5}


     --获取页面传来的参数,而非模板#invoke時的参数
     --获取页面传来的参数,而非模板#invoke時的参数
第148行: 第155行:
     --将获取的参数传给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 --避免空的参数
         if v ~= 'nil' then args[replaceArgsName(k)] = v end
     end
     end
    table.sort(args)


    local validArgs = {stab=true, sitm=true, ctab=true, citm=true}
     for k, v in pairs(args) do
     for k, v in pairs(args) do
         k = '' .. k
         k = '' .. k; v = '' .. v
         if not (nonCSS[k] or k:match('^content%d+')) then
         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
                if not (CSS == 'class') then table.insert(ordering[prefix], CSS) end
                 contentTabCSS[firstToLower(k:sub(5))] = v
            elseif k:match('^citem') then
                contentItemCSS[firstToLower(k:sub(6))] = v
             else
             else
                 divCSS[firstToLower(k)] = v
                 table.insert(ordering['div'], k)
                CSSvalue['div'][k] = v
             end
             end
         end
         end
     end
     end --由于args被排序过了,因此ordering内的阵列也是排序好的
    table.sort(tabIndices)


     local mainDiv = mw.html.create('div')
     local mainDiv = mw.html.create('div')
     local vertical = args['textDisplay'] == 'left' or args['textDisplay'] == 'right'
     local horizontal = args['textDisplay'] == 'left' or args['textDisplay'] == 'right'
     if vertical then divCSS['display'] = 'flex' end
     if horizontal then
        mainDiv:css('display', 'flex')
        args['splitCount'] = args['splitCount'] or 1
    end


     local divClass = divCSS['class']
     mainDiv:addClass('tabs-container ' .. CSSvalue['div']['class'])
    divCSS['class'] = nil
     for _, divCSS in ipairs(ordering['div']) do
     mainDiv
         mainDiv:css(divCSS, CSSvalue['div'][divCSS])
        :addClass('tabs-container ' .. divClass)
    end
         :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, horizontal))
         mainDiv:node(renderSelect(args, vertical))
         mainDiv:node(renderSelect(args, horizontal))
     else
     else
         mainDiv:node(renderSelect(args, vertical))
         mainDiv:node(renderSelect(args, horizontal))
         mainDiv:node(renderContent(args, vertical))
         mainDiv:node(renderContent(args, horizontal))
     end
     end



2022年6月30日 (四) 10:50的版本

此模块的文档可以在模块:收纳表/doc创建


--理论上能调整所有的style,并可新增class
--|stab(css)   选择栏的css。曾经为select(css)
--|sitem(css)  选择栏中每个物件的css
--|ctab(css)   内容栏的css。曾经为text(css)
--|citem(css)  内容栏中每个物件的css

--[[ 非css的参数设定
splitCount      = 5:    决定每行有几个物件
textDisplay     = down: 内容相对于选择栏的位置,可输入
                        top(内容在选择栏上)
                        down(内容在选择栏下)
                        left(内容在选择栏左,此时若用户无指定,则selectWidth会被预设成20%、textWidth被设成60%、textHeight, selectHeight皆被设成400px)
                        right(内容在选择栏右,同上)
--]]

local p = {}
local notCSS = { --非CSS的参数
    textDisplay = true,
    splitCount  = true
}

--用于处理编号非连续的情况与css优先度的问题
--优先度问题如:直接塞:css(table),margin-left被margin盖掉
--前者范围较小,因此(应该是)希望前者优先
local ordering = {
    tabIndices = {},
    div = {},
    stab = {},
    sitem = {},
    ctab = {},
    citem = {},
}
local CSSvalue = {
    div = {class=''},
    stab = {
        class      = '',
        splitCount = '5',
        display    = 'grid',
        margin     = '2.5%',
        gap        = '6px',
    },
    sitem = {
        class   = '',
        margin  = '0',
        padding = '0',
        ['font-weight'] = '700',
    },
    ctab = {
        class   = '',
        display = 'inline',
        margin  = '2.5%',
        ['margin-left'] = '0',
    },
    citem = {class=''},
}



--处理旧参数名与别名
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 renderSelect(contents, horizontal)
    local tabs_pages = mw.html.create('div')
        :addClass('tabs_pages ' .. CSSvalue['stab']['class'])
        :css('grid-template-columns',
             string.rep('1fr ', tonumber(contents['splitCount'])))

    if horizontal then
        tabs_pages
            :css('display', 'inline-grid')
            :css('height', '400px')
            :css('overflow-y', 'auto')
            :css('width', '20%')
    end
    if CSSvalue['stab']['height'] ~= nil then
        tabs_pages:css('overflow-y', 'auto')
    end
    if CSSvalue['stab']['width'] ~= nil then
        tabs_pages:css('overflow-x', 'auto')
    end

    for _, CSS in ipairs(ordering['stab']) do
        tabs_pages:css(CSS, CSSvalue['stab'][CSS])
    end

    for _, tabIndex in ipairs(ordering['tabIndices']) do
        tabs_pages:tag('div')
            :addClass('tab ' .. CSSvalue['sitm']['class'])
            :wikitext(contents['tab' .. tabIndex])
        for _, CSS in ipairs(ordering['sitm']) do
            tabs_pages:css(CSS, CSSvalue['sitm'][CSS])
        end
    end

    return tostring(tabs_pages)
end



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

    if horizontal then
        tabs_contents
            :css('height', '400px')
            :css('overflow-y', 'auto')
            :css('width', '60%')
    end
    if CSSvalue['ctab']['height'] ~= nil then
        tabs_contents:css('overflow-y', 'auto')
    end
    if CSSvalue['ctab']['width'] ~= nil then
        tabs_contents:css('overflow-x', 'auto')
    end
    for _, CSS in ipairs(ordering['ctab']) do
        tabs_contents:css(CSS, CSSvalue['ctab'][CSS])
    end

    for _, tabIndex in ipairs(ordering['tabIndices']) do
        tabs_contents:tag('div')
            :addClass('tab-c ' .. CSSvalue['citm']['class'])
            :wikitext(contents['content' .. tabIndex])
        for _, CSS in ipairs(ordering['citm']) do
            tabs_contents:css(CSS, CSSvalue['citm'][CSS])
        end
    end

    return tostring(tabs_contents)
end



function p.selectTable(frame)
    local args = {splitCount=5}

    --获取页面传来的参数,而非模板#invoke時的参数
    local page_args = frame:getParent().args;

    --将获取的参数传给args
    for k, v in pairs(page_args) do
        if v ~= 'nil' then args[replaceArgsName(k)] = v end
    end
    table.sort(args)

    local validArgs = {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
                if not (CSS == 'class') then table.insert(ordering[prefix], CSS) end
            else
                table.insert(ordering['div'], k)
                CSSvalue['div'][k] = v
            end
        end
    end --由于args被排序过了,因此ordering内的阵列也是排序好的

    local mainDiv = mw.html.create('div')
    local horizontal = args['textDisplay'] == 'left' or args['textDisplay'] == 'right'
    if horizontal then
        mainDiv:css('display', 'flex')
        args['splitCount'] = args['splitCount'] or 1
    end

    mainDiv:addClass('tabs-container ' .. CSSvalue['div']['class'])
    for _, divCSS in ipairs(ordering['div']) do
        mainDiv:css(divCSS, CSSvalue['div'][divCSS])
    end

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

    return tostring(mainDiv)
end

return p