--[==[
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