简单脚本实现wordpress快速注音标签(一)

发布于 2018-12-03  13 次阅读


有些时候,我们需要插入一些特别的注音效果,比如生僻字的注音,或者是标注假名、和弦记号等等。一般而言,我们只能通过一些排版的手段,比如两行文字,制表符等等,亦或是贴一张图片上来。这样的效果可能不是很理想,而且也不好再次编辑了。在这里,针对汉字注音这个问题,我先介绍一种HTML5的新标签<ruby>
它的显示效果是这个样子:

饕餮(tāo tiè)時雨(じう)

是不是比起图片而言舒服多了?与之配套的还有rtrp标签,其中,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》中的前半段歌词。

00:00/00:00

()(そそ)いだ (つめ)たい(あめ)
(あお)(きず)()かしてった
いつか()てた 夕暮(ゆうぐ)(そら)
すみっこで(わら)(だれ)かがいた
気付(きづ)かないうちに オトナになって
瑰丽(きれい)(うそ) (くち)进去(でき)るほど
いろんな(いた)みを(おぼ)えてきたけど
それでもまだ(いた)いんだ
夕暮(ゆうぐ)れの(なみだ)()そうな(あか)
(わたし)(なか)(きみ)()かしてしまえ

如果不进行兼容还行,假如类似上面这一段文章中有大量文字需要注音,那么这样手动打标签实在是太痛苦了。
所以下面进入本次的正文!
为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


来自像素世界的代码家,创造第九艺术!