WP Plugin: WP-Math-2

ふと気になってtex2MMLにて変換しているエントリについてValidatorを実行してみたのですが、結果はボロボロでした。インライン系の変換の際にどうしてもmathタグがpタグに対して入れ子になってしまうのが宜しく無いようでして。そこで記載内容をこれまでと変更する事無く以降できるプラグインを検索したところ WP-Math-2 というプラグインに辿り着きました。

このプラグインを使うとエントリ自体の置き換えは実行しないで表示の際の変換のみとなるので、XHTMLの生成に負荷がかからず変換トラブルも発生しなさそうです。試しに万有引力の公式を描いてみるとこんな感じです。

[ F = G frac{M m}{r^2} ]

作者であるWoody Wang氏に感謝。

via
Woody的技?Blog » WP-Math-2 released

追記 2015/03/20

そういえばJetpackにてBeautiful Mathを有効にした後マークアップを修正するのを忘れていました。上記はこんな感じになります。

F = G frac{M m}{r^2}

どうでしょう。見えますか?

MathML: itexToMMLを導入する

MT4からWP2.3に移行した最大の理由がMathMMLの記述をサポートしてくれるプラグインitex2MMLの動作にあります。MT版のプラグインがPerlで書かれたものしか無い為に、ダイナミックパブリッシングと組み合わせる為には別途プラグインが必要になってきてしまうのです。

プラグインの動作の為に別途プラグインが必要で…という図式は個人的にあまり好ましいものではありません。やはり独立して動かしたいものです。…というわけでWP2.3にitex2MMLを組み込んでみます。あ、そうそう。itex2MMLのバイナリには一切手を加えていません。MTの時と同じものを使っています。

プラグインのダウンロード

WP1.2用のプラグインを用いました(via: WordPress 1.2, MathML Goodness | Musings)。単純にitexの書式からの変換だけをしたかったのでこれで十分です。

実際に表示をしようとすると次の問題点が発覚しました。

  1. math要素を一意にブロック扱いしている為に$で囲われた内容についてもp要素を付加してしまう。
  2. &rightarrowなどの記号を実体参照表示できるように強制変換してしまう。

2番目の問題は兎も角1番目についてはapplication/xhtml+xmlで表示しようとする以上致命的です(結果的にエラーで表示されない)。そこで実際にWPのコードに手を入れる事になりました。

wp-includes/formatting.phpの修正

上記の問題点を解決すべく書き換えて、前後でdiffを取ったものを次に示します。

% diff formatting.php.org formatting.php
60a61,66
> // ++ add 2008-02-04
> function clean_math($matches) {
>       if ( is_array($matches) )
>              $text = $matches[1] . $matches[2] . "</math>";
>       else
>               $text = $matches;
61a68,75
>       $text = str_replace('&#038;', '&',$text);
>       $text = str_replace('<br />', '', $text);
>       $text = str_replace('<p>', "n", $text);
>       $text = str_replace('</p>', '', $text);
>
>       return $text;
> }
> // -- add 2008-02-04
66c80,85
<       $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';
---
> // ++ del 2008-02-04
> //    $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';
> // -- del 2008-02-04
> // ++ add 2008-02-04
>       $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|style|input|p|h[1-6]|hr)';
> // -- add 2008-02-04
89a109,112
> // ++ add 2008-02-04
>       if (strpos($pee, '<math') !== false)
>               $pee = preg_replace_callback('!(<math.*?>)(.*?)</math.*?>!is', 'clean_math', $pee );
> // -- add 2008-02-04

これで一応キチンと表示されるようになりました。

本当はもっと巧い遣り方もあったのかも知れませんが、とりあえずはこれでOKかと。

続きを読む MathML: itexToMMLを導入する