模块:切换显示:修订间差异
外观
	
	
| Willson-v-(留言 | 贡献) 无编辑摘要 | Willson-v-(留言 | 贡献) 无编辑摘要 | ||
| 第4行: | 第4行: | ||
| local initSpan = function(className, templateName, frame) | local initSpan = function(className, templateName, frame) | ||
|     mw.log.warn("Module:切换显示 called") | |||
|     mw.log.warn(className) | |||
|     local args = getArgs(frame, { wrappers = 'Template:' .. templateName }) | |||
|      local parent_args = frame:getParent().args; |      local parent_args = frame:getParent().args; | ||
|     local span = mw.html.create('span') | |||
|     span:attr('class', className) | |||
|     if className == 'textToggleDisplayButtons' then -- 自Template:切换显示调用。 | |||
|         local operators = {} -- 操作参数。 | |||
|         local contentlist = {} --[[内容表列。结构为: | |||
|                                                 { | |||
|                                                     strcode = 字符串代号, | |||
|                                                     on = @on后缀的内容, | |||
|                                                     off = @off后缀的内容, | |||
|                                                     default = 没有@on或@off后缀的内容, | |||
|                                                 } | |||
|                                             ]] | |||
|         for k, v in pairs(args) do | |||
|             mw.log(k, v) | |||
|             if mw.ustring.sub(k, 1, 1) == '@' then | |||
|                 operators[k] = v | |||
|             else | |||
|                 local strcode | |||
|                 local onoff = nil | |||
|                 -- 获取字符串代号和开关类型。 | |||
|                 if mw.ustring.sub(k, -3) == '@on' then | |||
|                     strcode = mw.ustring.sub(k, 1, mw.ustring.len(k) - 3) | |||
|                     onoff = 'on' | |||
|                 elseif mw.ustring.sub(k, -4) == '@off' then | |||
|                     strcode = mw.ustring.sub(k, 1, mw.ustring.len(k) - 4) | |||
|                     onoff = 'off' | |||
|                 else | |||
|                     strcode = k | |||
|                 end | |||
|                 onoff = onoff or 'default' -- 没有开关类型就是默认值。 | |||
|                 if not contentlist[strcode] then | |||
|                     table.insert(contentlist, {strcode = strcode}) -- 增加空的内容表。 | |||
|                     contentlist[strcode] = #contentlist -- 定位新增加的索引,绑定到参数k。 | |||
|                 end | |||
|                 contentlist[contentlist[strcode]][onoff] = v -- 替换内容。 | |||
|             end | |||
|         end | |||
|         local counter = 0 -- 计数器。 | |||
|         for k_operators, v_operators in pairs(operators) do | |||
|             span:attr('data-key-' .. counter, k_operators):attr('data-value-' .. counter, v_operators) | |||
|             counter = counter + 1 | |||
|         end | |||
|         for index, content in ipairs(contentlist) do | |||
|             span:tag('span'):attr('data-order', index - 1):attr('data-key', content.strcode):tag('span'):addClass( | |||
|                 'textToggleDisplayButtonLabelText on' | |||
|             ):wikitext(frame:preprocess(content.on or content.default)):done():tag('span'):addClass( | |||
|                 'textToggleDisplayButtonLabelText off' | |||
|             ):wikitext(frame:preprocess(content.off or content.default)) | |||
|         end | |||
|     else | |||
|         local counter = 0 -- 计数器 | |||
|         for k, v in pairs(args) do | |||
|             if v ~= nil then | |||
|                 span:attr('data-key-' .. counter, k):attr('data-value-' .. counter, v) | |||
|                 counter = counter + 1 | |||
|             end | |||
|         end | |||
|     end | |||
|     return tostring(span) | |||
| end | end | ||
| function module.template(frame) | function module.template(frame) | ||
|     local args = getArgs(frame, { wrappers = 'Template:切换显示/模板' }) | |||
|     local tTitle = args['@'] or '' | |||
|     if tTitle == '' then | |||
|         return nil | |||
|     end | |||
|     local tag = args['@tag'] | |||
|     local branches = {} | |||
|     local params = {} | |||
|     for k, v in args do | |||
|         if not mw.ustring.match(k, '^@[^@]') then | |||
|             local i = 1 | |||
|             while true do | |||
|                 local _, j, flag = mw.ustring.find(k, '@(.)', i) | |||
|                 if j == nil then | |||
|                     i = mw.ustring.len(k) | |||
|                     break | |||
|                 elseif flag == '@' then | |||
|                     i = j + 1 | |||
|                 else | |||
|                     i = j - 2 | |||
|                     break | |||
|                 end | |||
|             end | |||
|             local param = mw.text.trim(mw.ustring.gsub(mw.ustring.sub(k, 1, i), '@@', '@')) | |||
|             local branch = mw.ustring.sub(k, i + 2) | |||
|             if mw.text.trim(param) ~= '' then | |||
|                 if params[param] == nil then | |||
|                     params[param] = {} | |||
|                 end | |||
|                 if branch ~= '' and branches[branch] == nil then | |||
|                     branches[branch] = #branches + 1 | |||
|                     table.insert(branches, branch) | |||
|                 end | |||
|                 if branch == '' then | |||
|                     params[param][0] = v | |||
|                 else | |||
|                     params[param][branch] = v | |||
|                 end | |||
|             end | |||
|         end | |||
|     end | |||
|     local result = {} | |||
|     for _, branch in ipairs(branches) do | |||
|         if type(branch) == 'string' then | |||
|             local tArgs = {} | |||
|             for param, bValue in pairs(params) do | |||
|                 tArgs[param] = bValue[branch] or bValue[0] | |||
|             end | |||
|             table.insert( | |||
|                 result, | |||
|                 frame:expandTemplate { | |||
|                     title = '切换显示', | |||
|                     args = { | |||
|                         [1] = branch, | |||
|                         [2] = frame:expandTemplate {title = tTitle, args = tArgs}, | |||
|                         [3] = tag | |||
|                     } | |||
|                 } | |||
|             ) | |||
|         end | |||
|     end | |||
|     return table.concat(result) | |||
| end | end | ||
| function module.button(frame) | function module.button(frame) | ||
|     return initSpan('textToggleDisplayButtons', '切换显示按钮', frame) | |||
| end | end | ||
| function module.style(frame) | function module.style(frame) | ||
|     return initSpan('textToggleDisplayStyle', '切换显示样式', frame) | |||
| end | end | ||
| function module.buttonStyle(frame) | function module.buttonStyle(frame) | ||
|     return initSpan('textToggleDisplayButtonsStyle', '切换显示按钮样式', frame) | |||
| end | end | ||
| return module | return module | ||
2022年5月4日 (三) 13:48的版本
此模块的文档可以在模块:切换显示/doc创建
local module = {}
 
local getArgs = require('Module:Arguments').getArgs
 
local initSpan = function(className, templateName, frame)
    mw.log.warn("Module:切换显示 called")
    mw.log.warn(className)
    local args = getArgs(frame, { wrappers = 'Template:' .. templateName })
    local parent_args = frame:getParent().args;
 
    local span = mw.html.create('span')
    span:attr('class', className)
 
    if className == 'textToggleDisplayButtons' then -- 自Template:切换显示调用。
        local operators = {} -- 操作参数。
        local contentlist = {} --[[内容表列。结构为:
                                                {
                                                    strcode = 字符串代号,
                                                    on = @on后缀的内容,
                                                    off = @off后缀的内容,
                                                    default = 没有@on或@off后缀的内容,
                                                }
                                            ]]
        for k, v in pairs(args) do
            mw.log(k, v)
            if mw.ustring.sub(k, 1, 1) == '@' then
                operators[k] = v
            else
                local strcode
                local onoff = nil
                -- 获取字符串代号和开关类型。
                if mw.ustring.sub(k, -3) == '@on' then
                    strcode = mw.ustring.sub(k, 1, mw.ustring.len(k) - 3)
                    onoff = 'on'
                elseif mw.ustring.sub(k, -4) == '@off' then
                    strcode = mw.ustring.sub(k, 1, mw.ustring.len(k) - 4)
                    onoff = 'off'
                else
                    strcode = k
                end
                onoff = onoff or 'default' -- 没有开关类型就是默认值。
 
                if not contentlist[strcode] then
                    table.insert(contentlist, {strcode = strcode}) -- 增加空的内容表。
                    contentlist[strcode] = #contentlist -- 定位新增加的索引,绑定到参数k。
                end
                contentlist[contentlist[strcode]][onoff] = v -- 替换内容。
            end
        end
 
        local counter = 0 -- 计数器。
        for k_operators, v_operators in pairs(operators) do
            span:attr('data-key-' .. counter, k_operators):attr('data-value-' .. counter, v_operators)
            counter = counter + 1
        end
 
        for index, content in ipairs(contentlist) do
            span:tag('span'):attr('data-order', index - 1):attr('data-key', content.strcode):tag('span'):addClass(
                'textToggleDisplayButtonLabelText on'
            ):wikitext(frame:preprocess(content.on or content.default)):done():tag('span'):addClass(
                'textToggleDisplayButtonLabelText off'
            ):wikitext(frame:preprocess(content.off or content.default))
        end
    else
        local counter = 0 -- 计数器
        for k, v in pairs(args) do
            if v ~= nil then
                span:attr('data-key-' .. counter, k):attr('data-value-' .. counter, v)
                counter = counter + 1
            end
        end
    end
 
    return tostring(span)
end
 
function module.template(frame)
    local args = getArgs(frame, { wrappers = 'Template:切换显示/模板' })
 
    local tTitle = args['@'] or ''
    if tTitle == '' then
        return nil
    end
    local tag = args['@tag']
 
    local branches = {}
    local params = {}
    for k, v in args do
        if not mw.ustring.match(k, '^@[^@]') then
            local i = 1
            while true do
                local _, j, flag = mw.ustring.find(k, '@(.)', i)
                if j == nil then
                    i = mw.ustring.len(k)
                    break
                elseif flag == '@' then
                    i = j + 1
                else
                    i = j - 2
                    break
                end
            end
 
            local param = mw.text.trim(mw.ustring.gsub(mw.ustring.sub(k, 1, i), '@@', '@'))
            local branch = mw.ustring.sub(k, i + 2)
            if mw.text.trim(param) ~= '' then
                if params[param] == nil then
                    params[param] = {}
                end
                if branch ~= '' and branches[branch] == nil then
                    branches[branch] = #branches + 1
                    table.insert(branches, branch)
                end
                if branch == '' then
                    params[param][0] = v
                else
                    params[param][branch] = v
                end
            end
        end
    end
 
    local result = {}
    for _, branch in ipairs(branches) do
        if type(branch) == 'string' then
            local tArgs = {}
            for param, bValue in pairs(params) do
                tArgs[param] = bValue[branch] or bValue[0]
            end
 
            table.insert(
                result,
                frame:expandTemplate {
                    title = '切换显示',
                    args = {
                        [1] = branch,
                        [2] = frame:expandTemplate {title = tTitle, args = tArgs},
                        [3] = tag
                    }
                }
            )
        end
    end
 
    return table.concat(result)
end
 
function module.button(frame)
    return initSpan('textToggleDisplayButtons', '切换显示按钮', frame)
end
 
function module.style(frame)
    return initSpan('textToggleDisplayStyle', '切换显示样式', frame)
end
 
function module.buttonStyle(frame)
    return initSpan('textToggleDisplayButtonsStyle', '切换显示按钮样式', frame)
end
 
return module
