模块:ZyPy

WikiBot​(留言 | 贡献)2026年9月17日 (四) 20:25的版本 (移植中文维基 Module:ZyPy:去掉 Module:Lang 依赖与 zh-tw/zh-hk 变体分支(本站仅 zh/zh-hans/zh-hant))
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
--[==[
Module:ZyPy —— {{Zy}} / {{ZyPy}} 的注音实现(中医百科裁剪版)
(块注释用四等号定界:正文里的双右方括号会提前结束常规块注释)

来源:移植自中文维基百科 [[:zh:Module:ZyPy]](本仓库 scripts/install-zy.js 记录源 revid)。
裁剪了三处,原因都是目标站点(zybkcn.com,MW 1.43.8)与中文维基的差异:

  1) 删掉 require('Module:Lang') 与它带来的两处语言维护分类
     (原版:Category:含有汉语拼音的条目 / Category:含有注音符号的条目)。
     本站没有 Module:Lang,也不移植它。

  2) 删掉 zh-tw / zh-hk / zh-mo 变体分支。本站 siteinfo 的 variants 只有
     zh / zh-hans / zh-hant 三个,而引用未定义变体的手动转换规则会坏掉——
     实测 -{zh-hans:拼音;zh-hant:拼音;zh-tw:注音;zh-hk:粵拼;}- 在 variant=zh-hant 下
     输出乱码「拼音;zh-tw:注音;zh-hk:粵拼」。
     因此 <rt> 直接取「拼音优先,无拼音才用注音」,这与中维原版 zh-hans /
     zh-hant 两个分支的取值完全相同(原版两者都是 pinyin or zhuyin)。
     原版第 4 参数(粤拼)因此在本站永不显示——理由同上(无 zh-hk / zh-mo 变体)。

  3) 删掉三个「使用了N种注音方式」维护分类(维基百科的维护体系,本站不需要)。
     连带 result:|nocat= 参数变成无副作用的兼容参数——从维基复制来的
     {{Zy|…|nocat=y}} 不会报错,也不会产生分类。

  |v=hans / |v=hant 改写成两变体写法。实测本站:
    - -{zh-hans:X;zh-hant:Y;}-  可用(zh / zh-hans 取 X,zh-hant 取 Y);
    - -{DEF;zh-hant:Y;}-        在 zh-hans 下报「在手动字词转换规则中检测到错误」;
    - 首段无 code 的默认值不生效,zh 始终跟随 zh-hans;
    - 原版的嵌套写法 -{zh-hans:-{zh;zh-hans;zh-hant|R}-;zh-tw:P;}- 在本站同样报错。
]==]

local p = {}

local getArgs = require('Module:Arguments').getArgs

function p.main(frame)
	local args = getArgs(frame, { wrappers = 'Template:Zy' })
	return p._main(args)
end

-- {{ZyPy}} 入口:与 {{Zy}} 等价,但用于链接显示文字等不便写 |nocat=y 的场合。
-- 本站已无分类,args.nocat 只是保留参数兼容(见文件头第 3 条)。
function p.nocat(frame)
	local args = getArgs(frame, { wrappers = 'Template:ZyPy' })
	args.nocat = true
	return p._main(args)
end

function p._main(args)
	local pinyin = args[2] and mw.text.tag{ name = 'span', attrs = { lang = 'zh-Latn-pinyin' }, content = args[2] }
	local zhuyin = args[3] and mw.text.tag{ name = 'span', attrs = { lang = 'zh-Bopo' }, content = args[3] }

	-- 拼音与注音都没填:只输出原字,不生成空的 <rt>
	if not pinyin and not zhuyin then
		return args[1]
	end

	local ruby = mw.html.create('ruby'):addClass('zy')
	ruby:wikitext(args[1])
	ruby:tag('rp'):wikitext('(')
	ruby:tag('rt'):wikitext(pinyin or zhuyin)
	ruby:tag('rp'):wikitext(')')

	local rubyText = tostring(ruby)

	-- |v=hans:简体与原文(本站 zh 与 zh-hans 绑定)显示注音,繁体只显示原字
	-- |v=hant:反过来
	local v = args.v
	if v == 'hans' then
		rubyText = string.format('-{zh-hans:%s;zh-hant:%s;}-', rubyText, args[1])
	elseif v == 'hant' then
		rubyText = string.format('-{zh-hans:%s;zh-hant:%s;}-', args[1], rubyText)
	end

	return rubyText
end

return p