Module:Lyrics/colors/sub

此模块的文档可以在Module:Lyrics/colors/sub/doc创建

local module = {}
 
local getArgs = require('Module:Arguments').getArgs
 
function module._charaBlock(args)
	local colors = mw.text.split(mw.ustring.gsub(args.colors, ';+$', ''), ';')
	for i, v in ipairs(colors) do
		colors[i] = mw.ustring.match(v, '^%s*([^=]+)%f[%s=%z]') -- %f边界判断
	end
	local charas = mw.text.split(mw.ustring.gsub(args.charas, ';+$', ''), ';')
	local groupColor = args.groupColor or ''
	local hasGroupColor = false
	
	for k,v in ipairs(charas)do
		if v == '合唱' then
			charas[k] = v .. '(@nolink)'
			break
		end
	end
	
	if string.find(groupColor, '^color:([^;]+)') then
		table.insert(colors, string.match(groupColor, '^color:([^;]+)'))
		hasGroupColor = true
	end
 
	if string.find(charas[#colors] or '', '^%s*$') then
		charas[#colors] = '合唱(@nolink)'
	end
 
	if hasGroupColor and charas[#colors]:find('%(@nolink%)$') == nil then
		charas[#colors] = charas[#colors]..'(@nolink)'
	end
 
	if args['groupName'] then
		charas[#colors] = args['groupName']..'(@nolink)'
	end
 
	local product = {}
	for i, v in ipairs(colors) do
		v = string.gsub(v, '\n', '')
		repeat
			local ban = {
			    'lg%(.+%)', 'rg%(.+%)', 'rlg%(.+%)', 'rrg%(.+%)', 'co%(.+%)', 'rb%(.+%)', '^%s*$'
			}
			local flag = false
			for index, ptn in ipairs(ban) do
				if string.find(v, ptn) then
					flag = true
					break
				end
			end
			if flag then break end
			local charaName = ' '..string.gsub(charas[i], '(.+)%(.+%)', '%1')
			local arg = string.gsub(charas[i], '.+%((.-)%)', '%1')
			local block = mw.html.create('span')
				:css('display', 'inline-block')
				:css('color', v)
				:tag('span'):css({
					width = '10px',
					height = '10px',
					background = v,
					display = 'inline-block'
				})
				:done():wikitext(charaName)
			:allDone()
 
			function link(link, block)
				return '[['..link..'|'..tostring(block)..']]'
			end
 
			if arg == '@nolink' then
				table.insert(product, tostring(block))
			elseif arg:find('^@link:.+') then
				table.insert(product, link(arg:match('^@link:(.+)'), block))
			else
				table.insert(product, link(charas[i], block))
			end
		until true
	end
 
	local productWiki = ''
	for i, v in ipairs(product) do
		productWiki = productWiki..v..'<span style="cursor:default; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; -o-user-select:none; user-select:none;">&emsp;</span>'
	end
 
	return productWiki
end
 
function module.charaBlock(frame)
	local args = getArgs(frame)
	return module._charaBlock(args)
end
 
return module