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

Module:Lyrics/multiver

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

local getArgs = require('Module:Arguments').getArgs
local buildLyrics = require('Module:Lyrics/Sandbox')._lyrics
local initHandler = require('Module:HooksHandler').init

local preParse = function (original, translated, customArgs)
	customArgs.mutiTags = {}
	customArgs.tags_map = {}
	customArgs.btn_args = {}
	local btn_count = 0
	local idx, count, start, tag_name = 1, #original, nil, nil
	local frame = mw.getCurrentFrame()
	local count_base = frame:callParserFunction{ name = '#var', args = { 'Lyrics-Btn-Count', '0' } }
	local endup = function ()
		if not customArgs.tags_map[tag_name] then
			customArgs.tags_map[tag_name] = 'Lyrics-Btn-' .. count_base + btn_count
			customArgs.btn_args['Lyrics-Btn-' .. count_base + btn_count] = tag_name
			btn_count = btn_count + 1
		end
		table.insert(customArgs.mutiTags, {start, idx, name = tag_name})
		table.remove(original, idx) count = count - 1
		start = nil
	end
	while idx <= count do
		if start then
			if mw.ustring.match(original[idx], '^<%-%-Tag%-End%-%->$') then
				endup()
			else
				idx = idx + 1
			end
		else
			tag_name = mw.ustring.match(original[idx], '^<%-%-Tag%-Start:(.-)%-%->$')
			if tag_name then
				table.remove(original, idx) count = count - 1
				start = idx
			else
				idx = idx + 1
			end
		end
	end
	if start then
		endup()
	end
	if customArgs.defaultVer and customArgs.tags_map[customArgs.defaultVer] then
		customArgs.btn_args['@default'] = customArgs.tags_map[customArgs.defaultVer]
	elseif btn_count == 1 and customArgs.defaultVer then
		customArgs.btn_args['Lyrics-Btn-' .. count_base + btn_count] = customArgs.defaultVer
		customArgs.btn_args['@default'] = 'Lyrics-Btn-' .. count_base + 1
		btn_count = btn_count + 1
	else
		customArgs.btn_args['@default'] = 'Lyrics-Btn-' .. count_base + 1
	end
	frame:callParserFunction{ name = '#vardefine', args = { 'Lyrics-Btn-Count', count_base + btn_count } }
end

local postParse = function (lines, customArgs)
	for idx, tag in ipairs(customArgs.mutiTags) do
		table.insert(lines, tag[1]+(idx-1)*2, '<div class="textToggleDisplay hidden" data-id="' .. customArgs.tags_map[tag.name] .. '">')
		table.insert(lines, tag[2]+(idx-1)*2+1, '</div>')
	end
end

local preOutput = function (html, customArgs)
	local count = 1
	customArgs.btn_args['@radio'] = true
	customArgs.btn_args['@forceNoCancel'] = true
	return mw.getCurrentFrame():expandTemplate{ title = '切换显示按钮', args = customArgs.btn_args } .. html
end

function module.initHooks(args, hooksHandler, customArgs)
	customArgs.defaultVer = args.default
	return hooksHandler({ preParse = preParse, postParse = postParse, preOutput = preOutput })
end

function module.main(frame)
	local args = getArgs(frame, { wrappers = 'Template:LyricsKai/mutiver' })
	local hooksHandler, customArgs = initHandler(), {}
	local hookTrigger = module.initHooks(args, hooksHandler, customArgs)
 
	return buildLyrics(args, hookTrigger, customArgs)
end

return module