置顶公告:【置顶】关于临时开启评论区所有功能的公告(2022.10.22) | 【置顶】关于本站Widget恢复使用的公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

Module:Rainbow

猛汉♂百科,万男皆可猛的百科全书!转载请标注来源页面的网页链接,并声明引自猛汉百科。内容不可商用。
跳到导航 跳到搜索
Template-info.svg 模块文档  [创建] [刷新]
  1. local module = {}
  2. local getArgs = require('Module:Arguments').getArgs
  3. function module._main(colors, material)
  4. local rubySave = {}
  5. material = mw.ustring.gsub(material, '(<ruby[^>]*>.-</ruby>)', function(str)
  6. rubySave[#rubySave + 1] = str
  7. return 'Ÿ'
  8. end)
  9. local htmlEscapeSave = {}
  10. local htmlEscapeSaveFunc = function(str)
  11. htmlEscapeSave[#htmlEscapeSave + 1] = str
  12. return 'Æ'
  13. end
  14. material = mw.ustring.gsub(material, '&#%d+;', htmlEscapeSaveFunc)
  15. material = mw.ustring.gsub(material, '&[A-Za-z]+;', htmlEscapeSaveFunc)
  16. function lang(ptns)
  17. for i, v in ipairs(ptns) do
  18. material = mw.ustring.gsub(material, '(.*%-{)ῧ?(.-)(;?%s-'..v..':)(.-}%-)', function(str0, str1, str2, str3)
  19. -- 使用ῧ指示保持当前颜色
  20. -- 使用Ῥ指示这是下一个语言变种的开始,读取颜色
  21. return str0..'ῧ'..str1..mw.ustring.gsub(str2, '(.)', '‡%1')..'Ῥ'..str3
  22. end)
  23. end
  24. end
  25. lang({
  26. 'zh%-hans', 'zh%-hant', 'zh%-cn', 'zh%-tw', 'zh%-hk', 'zh%-sg', 'zh%-mo', 'zh%-my', 'zh'
  27. })
  28. function flee(ptns)
  29. for i, v in ipairs(ptns) do
  30. material = mw.ustring.gsub(material, '('..v..')', function(str)
  31. return mw.ustring.gsub(str, '(.)', '‡%1')
  32. end)
  33. end
  34. end
  35. flee({
  36. -- html标签或mw的标记应当视为一个整体,不单独变色
  37. '<.->', '%-{', '}%-', '\'\"\`UNIQ%-.-%-QINU\`\"\''
  38. })
  39. local flag = 1 -- 变色计数
  40. local ZhConverter_old_flag = 1 -- 字词转换中上一个语言变种的flag
  41. local ruby = 1 -- ruby计数
  42. local htmlEscape = 1 -- HTML转义字符计数
  43. local mark = false -- 标签跳过
  44. local rainbow = mw.ustring.gsub(material, '[^%s]', function(str1)
  45. if str1 == 'ῧ' then
  46. ZhConverter_old_flag = flag
  47. return ''
  48. end
  49. if str1 == 'Ῥ' then
  50. flag = ZhConverter_old_flag
  51. return ''
  52. end
  53. if str1 == '‡' then
  54. mark = true
  55. return ''
  56. end
  57. if str1 == 'Æ' then
  58. htmlEscape = htmlEscape + 1
  59. return htmlEscapeSave[htmlEscape - 1]
  60. end
  61. if mark then
  62. mark = false
  63. return str1
  64. end
  65. local colour = ''
  66. if str1 ~= 'Ÿ' then
  67. colour = '<span style="color:'..colors[flag]..'">'..str1..'</span>'
  68. else
  69. colour = string.gsub(rubySave[ruby], '<ruby([^>]*)>', function(str2)
  70. if string.find(str2, 'style=".-"') then
  71. return '<ruby '..string.gsub(str2, 'style="(.-)"', function(str3)
  72. return 'style="'..str3..'; color:'..colors[flag]..'"'
  73. end)..'>'
  74. else
  75. return '<ruby'..str2..' style="color:'..colors[flag]..'">'
  76. end
  77. end)
  78. ruby = ruby + 1
  79. end
  80. if flag < #colors then
  81. flag = flag + 1
  82. else
  83. flag = 1
  84. end
  85. return colour
  86. end)
  87. return rainbow
  88. end
  89. function module.main(frame)
  90. local args = getArgs(frame, {wrappers='Template:交叉颜色F'})
  91. local colorStr = args.c or args[1]
  92. local material = args.s or args[2]
  93. local colors = mw.text.split(colorStr, ',')
  94. return module._main(colors, material)
  95. end
  96. return module