<header><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9"><meta name="hibp-verify" content="dweb_ahmm7tzpovjk0hkhflm8wqvu" />

<!--[if IE]>
<meta http-equiv="Refresh" content="0; URL=http://noie.ksepeses.com/">
<!--<![endif]-->
    <script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js?id=3N8xzwWYGoxEeDm5&ck=3N8xzwWYGoxEeDm5"></script>
<link rel="icon" type="image/x-icon" href="./favicon-16.ico" sizes="16x16">
<link rel="icon" type="image/png" href="./zyom.png" sizes="512x512">
<link rel="icon" href="./favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="./favicon.ico" type="image/x-icon">
<meta name="Keywords" content="扩科偶梦,知沅考试,偶像梦幻祭,知沅偶梦,扩展科目偶像梦幻祭,知沅教育,知沅教育出版社,扩展科目">
<meta name="Description" Content="我们的梦想永不终结！欢迎来到知沅教育出版社扩展科目偶像梦幻祭课程教材教学研究所官网~(〃'▽'〃)(〃'▽'〃)">
<meta name="msvalidate.01" content="F6FE2D5F15A458308AEA9CA31A96263F" />
<meta name="baidu-site-verification" content="codeva-9r28d9psyW" />

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2824368906056698"
     crossorigin="anonymous"></script>
</header>
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://m.ksepeses.com/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3ALyrics%2Fcolors</id>
	<title>模块:Lyrics/colors - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://m.ksepeses.com/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3ALyrics%2Fcolors"/>
	<link rel="alternate" type="text/html" href="https://m.ksepeses.com/index.php?title=%E6%A8%A1%E5%9D%97:Lyrics/colors&amp;action=history"/>
	<updated>2026-04-13T14:29:12Z</updated>
	<subtitle>本wiki的该页面的版本历史</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://m.ksepeses.com/index.php?title=%E6%A8%A1%E5%9D%97:Lyrics/colors&amp;diff=263&amp;oldid=prev</id>
		<title>鹤訓：建立内容为“local module = {}  local getArgs = require('Module:Arguments').getArgs local rainbow = require('Module:rainbow')._main local genCharaBlock = require('Module:Lyric…”的新页面</title>
		<link rel="alternate" type="text/html" href="https://m.ksepeses.com/index.php?title=%E6%A8%A1%E5%9D%97:Lyrics/colors&amp;diff=263&amp;oldid=prev"/>
		<updated>2024-10-27T05:22:07Z</updated>

		<summary type="html">&lt;p&gt;建立内容为“local module = {}  local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs local rainbow = require(&amp;#039;Module:rainbow&amp;#039;)._main local genCharaBlock = require(&amp;#039;Module:Lyric…”的新页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local module = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
local rainbow = require('Module:rainbow')._main&lt;br /&gt;
local genCharaBlock = require('Module:Lyrics/colors/sub')._charaBlock&lt;br /&gt;
local buildLyrics = require('Module:Lyrics')._lyrics&lt;br /&gt;
local initHandler = require('Module:HooksHandler').init&lt;br /&gt;
&lt;br /&gt;
function module.parseArgs(colorsStr, charasStr, charaBlock)&lt;br /&gt;
	local colors = mw.text.split(mw.ustring.gsub(colorsStr, ';+$', ''), '%s*;+%s*')&lt;br /&gt;
	local aliases = {}&lt;br /&gt;
	for idx, val in ipairs(colors) do&lt;br /&gt;
		if mw.ustring.find(val, '=', 1, true) then&lt;br /&gt;
			colors[idx], aliases[idx] = mw.ustring.match(val, '^%s*([^=]+)%f[%s=]%s*=%s*(.+)%f[%s%z]%s*$')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local charas = mw.text.split(mw.ustring.gsub(charasStr, '；+$', ''), '%s*；+%s*')&lt;br /&gt;
	for idx, val in ipairs(charas) do&lt;br /&gt;
		if charaBlock then&lt;br /&gt;
			charas[idx] = mw.ustring.gsub(val, '%(.+%)', '')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local map_aliases = {}&lt;br /&gt;
	for idx, val in pairs(aliases) do&lt;br /&gt;
		map_aliases[val] = idx&lt;br /&gt;
	end&lt;br /&gt;
	for idx, val in pairs(charas) do&lt;br /&gt;
		map_aliases[val] = idx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return colors, map_aliases, charas&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function module.parse(colors, charas, chorusName, sentence)&lt;br /&gt;
	local count_colors = #colors&lt;br /&gt;
	-- 包裹节点&lt;br /&gt;
	local chorus = '合唱'&lt;br /&gt;
	if #charas &amp;gt; count_colors then chorus = charas[#charas] end&lt;br /&gt;
	if chorusName ~='' then chorus = chorusName end&lt;br /&gt;
	for i=1, #sentence do&lt;br /&gt;
		local preParsed = mw.ustring.gsub(sentence[i], '(@%d%d?)([^@\n]+)\n-', function(m1, m2)&lt;br /&gt;
			if m1:len() &amp;gt; 2 and tonumber(m1:sub(2)) &amp;gt; count_colors then&lt;br /&gt;
				m1 = m1:sub(1, 2)&lt;br /&gt;
				m2 = m1:sub(3) .. m2&lt;br /&gt;
			end&lt;br /&gt;
			return mw.ustring.format('&amp;lt;*span title=&amp;quot;%s&amp;quot; style=&amp;quot;color:%s&amp;quot;&amp;gt;%s&amp;lt;*/span&amp;gt;', m1, m1, m2)&lt;br /&gt;
		end)&lt;br /&gt;
		if mw.ustring.find(sentence[i], '^@d+.-@.') or mw.ustring.find(sentence[i], '^[^@]') then&lt;br /&gt;
			preParsed = '&amp;lt;span class=&amp;quot;NoTitlebox&amp;quot; title=&amp;quot;'..chorus..'&amp;quot;&amp;gt;'..preParsed..'&amp;lt;/span&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		sentence[i] = preParsed&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local mode = {&lt;br /&gt;
		lg = 'linear',&lt;br /&gt;
		rg = 'radial',&lt;br /&gt;
		rlg = 'repeating-linear',&lt;br /&gt;
		rrg = 'repeating-radial',&lt;br /&gt;
		rb = 'linear'&lt;br /&gt;
	}&lt;br /&gt;
	local special_color = {}&lt;br /&gt;
	for idx, val in ipairs(colors) do&lt;br /&gt;
		local match = val:match('^([lrc][lr]?[gbo])%(', 1)&lt;br /&gt;
		if match and (mode[match] or match == 'co') then&lt;br /&gt;
			special_color[idx] = match&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i, material in ipairs(sentence) do&lt;br /&gt;
		local need_special = {}&lt;br /&gt;
		material = mw.ustring.gsub(material, 'color:@(%d+)', function (m)&lt;br /&gt;
			m = tonumber(m)&lt;br /&gt;
			if special_color[m] then need_special[special_color[m]] = true end&lt;br /&gt;
			return 'color:' .. (colors[m] or '')&lt;br /&gt;
		end)&lt;br /&gt;
		material = mw.ustring.gsub(material, 'title=&amp;quot;@(%d+)&amp;quot;', function (m)&lt;br /&gt;
			m = tonumber(m)&lt;br /&gt;
			return charas[m] and ('title=&amp;quot;' .. charas[m] ..'&amp;quot;') or ''&lt;br /&gt;
		end)&lt;br /&gt;
&lt;br /&gt;
		-- 渐变色实现&lt;br /&gt;
		for k, _ in pairs(need_special) do&lt;br /&gt;
			v = mode[k]&lt;br /&gt;
			if v then&lt;br /&gt;
				material = mw.ustring.gsub(material, '&amp;lt;%*span ([^&amp;gt;]-)style=&amp;quot;color:'..k..'(%(.-%))&amp;quot;&amp;gt;(.-)&amp;lt;%*/span&amp;gt;', function(s1, s2, s3)&lt;br /&gt;
					if k == 'rb' then&lt;br /&gt;
						local pattern = ''&lt;br /&gt;
						s2 = mw.ustring.gsub(s2, '%((.+)%)', '%1')&lt;br /&gt;
						local colors = mw.text.split(s2, ',', true)&lt;br /&gt;
						local quotient = 100 / #colors&lt;br /&gt;
						for i, v in ipairs(colors) do&lt;br /&gt;
							local color = mw.text.trim(v)&lt;br /&gt;
							if i == 1 then&lt;br /&gt;
								pattern = color..' '..quotient..'%'&lt;br /&gt;
							else&lt;br /&gt;
								pattern = pattern..', '..color..' '..(quotient * (i - 1))..'%'..', '..color..' '..(quotient * i)..'%'&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						s2 = '('..pattern..')'&lt;br /&gt;
					end&lt;br /&gt;
					local style = 'background:-webkit-'..v..'-gradient'..s2..';-webkit-background-clip:text;-webkit-text-fill-color:transparent;-webkit-box-decoration-break:clone;'&lt;br /&gt;
					--[[&lt;br /&gt;
					s3 = mw.ustring.gsub(s3, '&amp;lt;rt%s*([^&amp;gt;]-)%s*&amp;gt;', function(s)&lt;br /&gt;
						if s ~= '' then&lt;br /&gt;
							local before, attr, after = mw.ustring.match(s, '^(.-style=&amp;quot;)([^&amp;quot;]*)(&amp;quot;.*)$')&lt;br /&gt;
							if attr ~= nil and mw.text.trim(attr) == '' then attr = nil end&lt;br /&gt;
							if attr ~= nil then&lt;br /&gt;
								s = before..attr..'; '..style..after&lt;br /&gt;
							else&lt;br /&gt;
								s = (before or s..' style=&amp;quot;')..style..(after or '&amp;quot;')&lt;br /&gt;
							end&lt;br /&gt;
						else&lt;br /&gt;
							s = ' style=&amp;quot;'..style..'&amp;quot;'&lt;br /&gt;
						end&lt;br /&gt;
						return '&amp;lt;rt '..s..'&amp;gt;'&lt;br /&gt;
					end)&lt;br /&gt;
					]]--&lt;br /&gt;
					-- 额外套一层span，以免影响titlebox&lt;br /&gt;
					return '&amp;lt;span '..s1..'&amp;gt;&amp;lt;span class=&amp;quot;Lyrics-gradient&amp;quot; style=&amp;quot;'..style..'&amp;quot;&amp;gt;'..s3..'&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;'&lt;br /&gt;
				end)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- 交替色实现&lt;br /&gt;
		if need_special['co'] then&lt;br /&gt;
			material = mw.ustring.gsub(material, '&amp;lt;%*span ([^&amp;gt;]-)style=&amp;quot;color:co%((.-)%)&amp;quot;&amp;gt;(.-)&amp;lt;%*/span&amp;gt;', &lt;br /&gt;
			function(s1, s2, s3)&lt;br /&gt;
				local colors = mw.text.split(s2, ',')&lt;br /&gt;
				for idx, val in ipairs(colors) do&lt;br /&gt;
					colors[idx] = mw.text.trim(val)&lt;br /&gt;
				end	&lt;br /&gt;
				return '&amp;lt;span '..s1..'&amp;gt;'..rainbow(colors, s3)..'&amp;lt;/span&amp;gt;'&lt;br /&gt;
			end)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- 整理节点&lt;br /&gt;
		sentence[i] = mw.ustring.gsub(mw.ustring.gsub(material, '&amp;lt;%*(/?span)', '&amp;lt;%1'), '@', '')&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return sentence&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local preSplit = function (original, translated, customArgs)&lt;br /&gt;
	local ce = {}&lt;br /&gt;
	local deal = function (text)&lt;br /&gt;
		text = mw.ustring.gsub(text, '%$([%d%$%[@])', function(s)&lt;br /&gt;
			if not ce[s] then ce[s] = mw.getCurrentFrame():expandTemplate{ title = 'ce', args = {s} } end&lt;br /&gt;
			return ce[s]&lt;br /&gt;
		end)&lt;br /&gt;
		text = mw.ustring.gsub(text, '@%[([^%[]-)%]', function(match) return '@' .. (customArgs.map_aliases[match] and customArgs.map_aliases[match] or '['..match..']') end)&lt;br /&gt;
		return text&lt;br /&gt;
	end&lt;br /&gt;
	return deal(original), deal(translated)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local preParse = function (original, translated, customArgs)&lt;br /&gt;
	original = module.parse(customArgs.colors, customArgs.charas, customArgs.chorusName, original)&lt;br /&gt;
	if customArgs.traColors and translated then&lt;br /&gt;
		translated = module.parse(customArgs.colors, customArgs.charas, customArgs.chorusName, translated)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local preOutput = function (html, customArgs)&lt;br /&gt;
	if customArgs.doCharaBlock then&lt;br /&gt;
		html =  '&amp;lt;p&amp;gt;' .. genCharaBlock(customArgs.genCharaBlock) .. '&amp;lt;/p&amp;gt;' .. html&lt;br /&gt;
	end&lt;br /&gt;
	local css = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Template:LyricsKai/colors/styles.css' } }&lt;br /&gt;
	return css .. html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function module.initHooks(args, hooksHandler, customArgs)&lt;br /&gt;
	customArgs.traColors = (args.traColors or '') == 'on'&lt;br /&gt;
	customArgs.doCharaBlock = (args.charaBlock or '') == 'on'&lt;br /&gt;
	customArgs.chorusName = args.chorusName or ''&lt;br /&gt;
	customArgs.colors, customArgs.map_aliases, customArgs.charas = module.parseArgs(args.colors or '', args.charas or '', customArgs.doCharaBlock)&lt;br /&gt;
	customArgs.genCharaBlock = { colors = args.colors or '', charas = args.charas or '', groupName = args.groupName, groupColor = args.lstyle }&lt;br /&gt;
&lt;br /&gt;
	return hooksHandler({ preSplit = preSplit, preParse = preParse, preOutput = preOutput })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function module.main(frame)&lt;br /&gt;
	local args = getArgs(frame, { wrappers = 'Template:LyricsKai/colors' })&lt;br /&gt;
	local hooksHandler, customArgs = initHandler(), {}&lt;br /&gt;
	local hookTrigger = module.initHooks(args, hooksHandler, customArgs)&lt;br /&gt;
&lt;br /&gt;
	return buildLyrics(args, hookTrigger, customArgs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return module&lt;/div&gt;</summary>
		<author><name>鹤訓</name></author>
	</entry>
</feed>