Module:Rainbow
跳到导航
跳到搜索
- 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