Module:Ruby

来自滚动的天空Wiki
文档图示 模块文档[查看] [编辑] [查看历史] [清除缓存]

本模块用于{{ruby}}和{{ruby-py}}模板。

上述文档内容嵌入自Module:Ruby/doc编辑 | 历史
编者可以在本模块的沙盒创建 | 镜像和测试样例创建页面进行实验。
请将模块自身所属的分类添加在文档中。本模块的子页面
local p = {}

local str2py = require("模块:pinyin")

local function transferArgs(args)
	-- 转换args
	local a = {}
	for k, v in pairs(args) do
		--转换一些参数
		if k == 1 then
			a.rb = v
		elseif k == 2 then
			a.rt = v
		elseif k == 3 then
			a.rblang = v
		elseif k == 4 then
			a.rtlang = v
		elseif k == 'style' then
			a.rubystyle = v
		elseif k == 'lang' then
			a.rubylang = v
		elseif k == 'class' then
			a.rubyclass = v
		else
			a[k] = v
		end
	end
	return a
end


function p._ruby(args, options)
	local options = options or {}
	local pinyin = options.pinyin
	-- 是否启用拼音功能
	
	local a = transferArgs(args)
	-- 将框架对象转化为纯净的参数表
	local ruby
	-- 它将转化为<ruby>或<span lang="zh-latn">的HTML项目
	if a.rt then
		-- 如果有rt部分,即函数第二个参数,返回旁注标记格式
		local rb = mw.html.create("rb")
		rb:wikitext(a.rb)
		if a.rbstyle then
			rb:cssText(a.rbstyle)
		end
		if a.rblang then
			rb:attr("lang", a.rblang)
		end
		if a.rbclass then
			rb:addClass(a.rbclass)
		end
		
		local rp1 = mw.html.create("rp")
		rp1:wikitext("(")
		
		local rp2 = mw.html.create("rp")
		rp2:wikitext(")")
		
		local rt = mw.html.create("rt")
		if pinyin then
			local rtt = mw.text.trim(a.rt)
			local _, sp = rtt:gsub(" ", "")
			if rtt:find(" ")
			and #a.rb / 3 == sp + 1
			and a.autoalign ~= "0"
			then
				-- 如果启用自动对齐且汉字个数与空格数相应则自动对齐
				ruby = mw.html.create("span")
				local i = 1
				for each in mw.text.gsplit(rtt, " ") do
					ruby:wikitext(p._ruby({
						a.rb:sub(i, i+2),
						each
					}, {
						pinyin = true
					}))
					i = i + 3
				end
				return ruby
			end
				
			rt:wikitext(str2py(a.rt))
		else
			rt:wikitext(a.rt)
		end
		rt
			:cssText(a.rtstyle)
			:attr("lang", a.rtlang or a.rblang or pinyin and 'zh-latn' or nil)
			:addClass(a.rtclass)
		
		ruby = mw.html.create("ruby")
			:node(rb)
			:node(rp1)
			:node(rt)
			:node(rp2)
			:cssText(a.rubystyle)
			:attr("lang", a.rubylang)
			:addClass(a.rubyclass)
	elseif pinyin then
		--如果无rt部分,返回<span lang="zh-latn">拼音文字</span>的格式
		ruby = mw.html.create "span"
			:attr("lang", "zh-latn")
			:wikitext(str2py(a.rb))
	end
	return tostring(ruby)
end


function p.ruby(frame)
	return p._ruby(frame:getParent().args, frame.args)
end


return p