MTの「改行を変換」をHTML5に対応させる

MTでブログ記事やウェブページを作る際、改行や空行をpタグやbrタグに変換してくれる「改行を変換」は、ただ文章を書いていくだけならば非常に便利な機能です。

しかし、HTMLタグを使って作りこむ際には、変なところにpタグやbrタグを勝手に入れてしまうので、非常に不便でもあります。

特に、サイトをHTML5で構築していて、本文中にsectionタグやarticleタグなどを使った場合には、pタグやbrタグのオンパレードになります。

そこで、「改行を変換」をHTML5に対応させる方法を紹介します。MTのバージョンアップに即座に対応できるようプラグインを使用しない方法です。

やっていることは非常にシンプルで、MTEntryBody, MTEntryMore, MTPageBody, MTPageMoreの各種テンプレートタグに以下のグローバルモディファイアを追加するだけです。

regex_replace="/<p>(<.?)(dl|dd|ol|ul|li|legend|section|article|aside|nav|header|hgroup|footer|figure|figcaption)(.*?>)/g","$1$2$3" regex_replace="/(<.?)(dl|dd|ol|ul|li|legend|section|article|aside|nav|header|hgroup|footer|figure|figcaption)(.*?>)<\/p>/g","$1$2$3" regex_replace="/<br \/>(\s?<.?)(figcaption)(.*?>)/g","$1$2$3" regex_replace="/(<.?)(dd|li|select|optgroup|option|object|param|embed|figure|figcaption)(.*?>)<br \/>/g","$1$2$3"

タグの前(後)にpタグが付いたとき、タグの前(後)にbrタグが付いたときの計4パターンでregex_replaceが実行されます。

ただ、ちょっと長すぎるので、「MTSetVarTemplateを使い倒す」で紹介した独自テンプレートタグにしておくと良いでしょう。

<MTSetVarTemplate name="EntryModifiedBody"><MTEntryBody regex_replace="/<p>(<.?)(dl|dd|ol|ul|li|legend|section|article|aside|nav|header|hgroup|footer|figure|figcaption)(.*?>)/g","$1$2$3" regex_replace="/(<.?)(dl|dd|ol|ul|li|legend|section|article|aside|nav|header|hgroup|footer|figure|figcaption)(.*?>)<\/p>/g","$1$2$3" regex_replace="/<br \/>(\s?<.?)(figcaption)(.*?>)/g","$1$2$3" regex_replace="/(<.?)(dd|li|select|optgroup|option|object|param|embed|figure|figcaption)(.*?>)<br \/>/g","$1$2$3"></MTSetVarTemplate>

このように、MTSetVarTemplateで定義したら、<MTEntryBody>の代わりに<MTGetVar name="EntryModifiedBody">を使えばOKです。

ただし、pタグやbrタグを完全に除去しきれない場合もあるので注意してください。なぜなら、この方法は以下のような書き方を前提にしたものだからです。

<section>
 
<header>
 
<hgroup>
 
<h1>section要素 &gt; header要素 &gt; hgroup要素 &gt; h1要素</h1>
 
<h2>section要素 &gt; header要素 &gt; hgroup要素 &gt; h2要素</h2>
 
</hgroup>
 
</header>
 
section要素 &gt; p要素
 
<footer>
 
section要素 &gt; footer要素 &gt; p要素
 
</footer>
 
</section>
 
<figure><img alt="figure要素 &gt; img要素" /></figure>
 
<figure>
<img alt="figure要素 &gt; img要素" />
<figcaption>figure要素 &gt; figcaption要素</figcaption>
</figure>
 
<figure>
<figcaption>figure要素 &gt; figcaption要素</figcaption>
<img alt="figure要素 &gt; img要素" />
</figure>
 
<figure>
 
<pre>figure要素 &gt; pre要素</pre>
 
<figcaption>
 
figure要素 &gt; figcaption要素 &gt; p要素
 
figure要素 &gt; figcaption要素 &gt; p要素
 
</figcaption>
 
</figure>

まず普通に文章を打ち込み、文章の一塊の前後には必ず空行を入れる。すると「改行を変換」する場合に、その一塊はp要素として扱われるので、p要素以外に適切な要素があれば、その要素でマークアップする。

こうした、ローカルルールのもとで書かれた本文は上記のようになり、このようなケースで追加されるpタグやbrタグが除去されるわけです。つまり、別のローカルルールのもとに書かれた本文には効果がない場合もあるわけです。

なので、きちんとpタグとbrタグが除去されない場合は、自身のローカルルールにあったregex_replaceの設定を探すか、こっそり教えてください。

教えてもらえたら、こっそり修正しときます。

【追記】不具合が見つかったのでこっそり修正しました。