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

Module:Sandbox/渚 花/オシミズ

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Template-info.svg 模块文档  [创建] [刷新]
local p = {}
-- [] 代码能看就行,不大追求效率了
-- [] 测试完毕
local escapeTable = { -- []转义
	['@'] = '\0HAT\0',
	['@'] = '\0FAT\0',
	['('] = '\0HPL\0',
	[')'] = '\0HPR\0',
	['('] = '\0FPL\0',
	['('] = '\0FPR\0',
}

local unescapeTable = {} -- []反转义
for k, v in pairs(escapeTable) do
	unescapeTable[v] = k 
end


function p._main(args, ruby)
	local ugsub = mw.ustring.gsub
	local format = string.format

	local sequence = {}

	for i, arg in ipairs(args) do
		-- @转义
		escaped = ugsub(arg, '[@@](.)', escapeTable)
		local word, accent, particle

		-- 分离成分
		word, accent, particle = mw.ustring.match(escaped, '^(.-)[@@](.)(.*)$')
		word = word or escaped
		-- [注释于2023/11/9 15:28] assert(not accent or tonumber(accent), '参数“' .. arg .. '”格式有误')
		-- if (not accent or tonumber(accent)) then
		--if (particle and (not tonumber(accent))) then
		if (accent and (not tonumber(accent))) then
			local temp	= particle
			particle	= accent .. temp
		--		particle = accent .. particle
				accent   = nil
		end
		
		-- ruby
		word = ugsub(word, '%b()', function (s)
				return '(' .. mw.ustring.sub(s, 2, -2) .. ')'
			end)
		word = ugsub(word, '(.-)(%b())', function (rb, rt)
				return rt == '()' and rb or ruby{ rb, string.sub(rt, 2, -2) }
			end)

		-- HTML
		if (not accent) and (not particle) then -- 没有注音和助词
			-- sequence[i] = format('<span class="oshimizu-raw">%s</span>', word)
			sequence[i] = '<span class="oshimizu-word">' .. word .. '</span>'
		elseif (not accent) and particle then  -- 有助词没有注音
			sequence[i] ='<span class="oshimizu-span">'						..	
							'<span class="oshimizu-word>'					.. 
								word										.. 
							'</span>'										..
							'<span class="oshimizu-particle">'      		.. 
								particle									..
							'</span>'										..
						 '</span>'
		elseif accent and (not particle) then   -- 有注音没助词
			sequence[i] = '<span class="oshimizu-span oshimizu-word">'	.. 
							word										..
							'<span class="oshiizu-accent">'		    	.. 
								accent									..
							'</span>'									..
						  '</span>'
		else                                     -- 既有注音也有助词
			sequence[i] = '<span class="oshimizu-span">'				..
							'<span class="oshimizu-word">'				..
								word									..
								'<span class="oshimizu-accent">'		..
									accent								..
								'</span>'								..
							'</span>'									..
							'<span class="oshimizu-particle">'			..
								particle								..
							'</span>'									..
						   '</span>'
		end
		
		-- HTML
		--if not accent then
		--	sequence[i] = '<span class="oshimizu-raw">' .. word .. '</span>'
		--elseif particle == '' then
		--	sequence[i] = format('<span class="oshimizu-span oshimizu-word">%s<span class="oshimizu-accent">%s</span></span>', word, accent)
		--else
		--	sequence[i] = format('<span class="oshimizu-span"><span class="oshimizu-word">%s<span class="oshimizu-accent">%s</span></span><span class="oshimizu-particle">%s</span></span>', word, accent, particle)
		--end
	end

	return '<span lang="ja">-{' .. ugsub(table.concat(sequence), '(%z...%z)', unescapeTable) .. '}-</span>'
end


function p.main(frame)
	local parent = frame:getParent()
	if parent and parent:getTitle() == 'User:渚 花/オシミズ' then
		frame = parent
	end
	local args = {}
	local trim = mw.text.trim
	for k, v in pairs(frame.args) do
		v = trim(v)
		if v ~= '' then args[k] = v end
	end
	return p._main(args, function (t) return frame:expandTemplate{ title = 'Ruby', args = t } end)
end

return p