在有些时候,我们需要插入一些特别的注音效果,比如生僻字的注音,或者是标注假名、和弦记号等等。一般而言,我们只能通过一些排版的手段,比如两行文字,制表符等等,亦或是贴一张图片上来。这样的效果可能不是很理想,而且也不好再次编辑了。在这里,针对汉字注音这个问题,我先介绍一种HTML5的新标签<ruby>
。
它的显示效果是这个样子:
饕餮、時雨
是不是比起图片而言舒服多了?与之配套的还有rt
和rp
标签,其中,rt
包围起来的是标注内容,而rp
是一种兼容手段,及当浏览器不支持rt
标签时显示的内容。上面注音的HTML代码如下:
<ruby>饕餮<rp>(</rp><rt>tāo tiè</rt><rp>)</rp></ruby>
<ruby>時雨<rp>(</rp><rt>じう</rt><rp>)</rp></ruby>
如果浏览器不支持,你将看到的效果就是饕餮(tāo tiè)
、時雨(じう)
。
OK,讲到这里已经可以进行使用了,不过...这么大一堆标签,使用起来还是非常复杂的啊!先看这么一段,是本人特别喜欢的一首《Glow》中的前半段歌词。
降り注いだ 冷たい雨
青い伤を溶かしてった
いつか见てた 夕暮れ空の
すみっこで笑う 谁かがいた
気付かないうちに オトナになって
瑰丽な嘘 口に进去るほど
いろんな痛みを覚えてきたけど
それでもまだ痛いんだ
夕暮れの涙が出そうな赤
私の中の君を溶かしてしまえ
如果不进行兼容还行,假如类似上面这一段文章中有大量文字需要注音,那么这样手动打标签实在是太痛苦了。
所以下面进入本次的正文!
为wordpress编写插件实现自动生成标签!
我们先来了解一下wordpress的部分机制,我们可以编写一些代码,在wordpress执行过程中注入,类似一个HOOK钩子。首先介绍一个Wordpress提供的函数,叫做add_filter()
,也就是为我们的wordpress添加一个过滤器。第一个参数是过滤的内容,第二个参数是执行的函数。废话不多说了,先上代码再讲解。
function test($content) {
return $content."<br><div>添加一个小尾巴</div>";
}
// MAIN:内容替换过滤器
add_filter('the_content', 'test');
这么一段简单的代码,就在我们的文章或者页面显示时,执行了test()函数,将内容文本后拼接了一个小尾巴返回。这样我们的每一个页面,就会多显示一个小尾巴的文字。这里的示例代码介绍了add_filter()
这个函数的基本用法,现在我们来开始做我们想要的。
我的设想是通过正则表达式,将一个简单的标记内容替换为上面复杂的<ruby>
标签。比如这里我设置的标记内容格式如下:
[ph饕餮(taotie)]
[ph私(わたし)]
ph
为phonetic的缩写,表示注音,整体用[]
括起来符合markdown的语法习惯,然后为了方便就将注音放在()
括弧内。然后这里ph
和文字中间应该有一个空格,如果打上就会被转换了= =。
因此我们要先编写符合这样一个标记格式的正则表达式:\[ph ([^(]+)\([^\)]+\)\]
然后对文章内容进行遍历,找到了这样的标记格式就进行替换,完整的PHP代码如下,有些函数使用方法可见注释。
/**
* 内容替换
* @param 原内容
* @return 修饰注音内容
*/
function ph_tag($content) {
$ph = "/\[ph ([^(]+)\([^\)]+\)\]/";#整体匹配符
$ph_param = "/\(([^\)]+)\)/";#参数部分匹配符
$rp_param = "/\(|\)/";#删除参数括弧
$rp_word = "/\[ph |\]|\(|\)/"; #删除外层括弧
$matches = array();
# 若为文章页
if(is_singular() && preg_match_all($ph, $content, $matches)) {
foreach ($matches[0] as $num => $value){
preg_match($ph_param, $value, $match_papram);#匹配参数字段
$papram = $match_papram[0];
$match_word = preg_replace($match_papram[0], "", $value);#正文字段删除参数字段
$match_word = preg_replace($rp_word, "", $match_word);#正文字段删除外层括弧
$match_papram = preg_replace($rp_param, "", $papram);#参数字段删除括弧
$content = str_replace($value,
"<ruby>".$match_word."<rp>(</rp><rt>".$match_papram."</rt><rp>)</rp></ruby>", $content);
}
}
return $content;
}
// MAIN:内容替换过滤器
add_filter('the_content', 'ph_tag');
到这里,基本功能就完成了。我们可以将这段代码粘贴到wordpress根目录下的function.php
文件中,就可以应用效果了。
不过我们可不会就这么收手了,毕竟要自己输入还是挺麻烦的。下一章我们来讲讲如何自动插入格式代码。
Comments | 1 条评论
学到了 :smirk: