2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

Module:Rainbow

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Template-info.svg 模块文档  [创建] [刷新]
local module = {}

local getArgs = require('Module:Arguments').getArgs

function module._main(colors, material)
    local rubySave = {}
    material = mw.ustring.gsub(material, '(<ruby[^>]*>.-</ruby>)', function(str)
        rubySave[#rubySave + 1] = str
        return 'Ÿ'
    end)
    
    local htmlEscapeSave = {}
    local htmlEscapeSaveFunc = function(str)
        htmlEscapeSave[#htmlEscapeSave + 1] = str
        return 'Æ'
    end
    material = mw.ustring.gsub(material, '&#%d+;', htmlEscapeSaveFunc)
    material = mw.ustring.gsub(material, '&[A-Za-z]+;', htmlEscapeSaveFunc)
    
    function lang(ptns)
        for i, v in ipairs(ptns) do
            material = mw.ustring.gsub(material, '(.*%-{)ῧ?(.-)(;?%s-'..v..':)(.-}%-)', function(str0, str1, str2, str3)
                -- 使用ῧ指示保持当前颜色
                -- 使用Ῥ指示这是下一个语言变种的开始,读取颜色
                return str0..'ῧ'..str1..mw.ustring.gsub(str2, '(.)', '‡%1')..'Ῥ'..str3
            end)
        end
    end

    lang({
        'zh%-hans', 'zh%-hant', 'zh%-cn', 'zh%-tw', 'zh%-hk', 'zh%-sg', 'zh%-mo', 'zh%-my', 'zh'
    })

    function flee(ptns)
        for i, v in ipairs(ptns) do
            material = mw.ustring.gsub(material, '('..v..')', function(str)
                return mw.ustring.gsub(str, '(.)', '‡%1')
            end)
        end
    end

    flee({
        -- html标签或mw的标记应当视为一个整体,不单独变色
        '<.->', '%-{', '}%-', '\'\"\`UNIQ%-.-%-QINU\`\"\''
    })

    local flag = 1            -- 变色计数
    local ZhConverter_old_flag = 1    -- 字词转换中上一个语言变种的flag
    local ruby = 1            -- ruby计数
    local htmlEscape = 1      -- HTML转义字符计数
    local mark = false        -- 标签跳过
    local rainbow = mw.ustring.gsub(material, '[^%s]', function(str1)
        if str1 == 'ῧ' then
            ZhConverter_old_flag = flag
            return ''
        end
        if str1 == 'Ῥ' then
            flag = ZhConverter_old_flag
            return ''
        end
        if str1 == '‡' then
            mark = true
            return ''
        end
        if str1 == 'Æ' then
            htmlEscape = htmlEscape + 1
            return htmlEscapeSave[htmlEscape - 1]
        end
        if mark then
            mark = false
            return str1
        end

        local colour = ''
        if str1 ~= 'Ÿ' then
            colour = '<span style="color:'..colors[flag]..'">'..str1..'</span>'
        else
            colour = string.gsub(rubySave[ruby], '<ruby([^>]*)>', function(str2)
                if string.find(str2, 'style=".-"') then
                    return '<ruby '..string.gsub(str2, 'style="(.-)"', function(str3)
                        return 'style="'..str3..'; color:'..colors[flag]..'"'
                    end)..'>'
                else
                    return '<ruby'..str2..' style="color:'..colors[flag]..'">'
                end
            end)
            ruby = ruby + 1
        end

        if flag < #colors then
            flag = flag + 1
        else
            flag = 1
        end

        return colour
    end)

    return rainbow
end

function module.main(frame)
    local args = getArgs(frame, {wrappers='Template:交叉颜色F'})
    local colorStr = args.c or args[1]
    local material = args.s or args[2]
    local colors = mw.text.split(colorStr, ',')
    return module._main(colors, material)
end

return module