MovableTypeで生HTML
MovableTypeでHTMLをそのまま出力したいときにはどうすればいいか??ということを最近考えていろいろためしています。文章の再利用性が下がるのはいやなので、HTMLのコードを生の文章として出力するために<や>をHTMLエスケープの>や<といった文字参照で書きたいとは思いません…。そこでMTMacro(MovableTypeのプラグイン)を使用して、文字を正規表現で検索、置換することによって、生のコードをそのままエントリーにかけるように努力してみました。
方針としては、スタイルが変わる可能性がある<pre>タグは使用しない(もちろんスタイルシートを適用すれば回避できますが…)で、<や>を<や>に置換することにしました。こうすれば、例えばコード内に強調したいところがあった場合、コード内<strong>タグを使用することができます!!
で、肝心の方法ですが、まずは使用方法の説明を。
<code>
<html>
<head>
</head>
<body>
<font <span style="color: red;">style="color: red;"</span>>タグ内のタグは有効</font>
<font><<strong>>コード内で置換して欲しくないタグは左右のタグのように2重タグ化する<</strong>></font>
</body>
</code>
<html>
<head>
</head>
<body>
<font <span style="color: red;">style="color: red;"</span>>タグ内のタグは有効</font>
<font><<strong>>コード内で置換して欲しくないタグは左右のタグのように2重タグ化する<</strong>></font>
</body>
</code>
次に設定方法。
現在はMTMacroで次の2段階の置換を作用させています。
まずどこからどこまでが生のコードだかわからないので、
public_codeマクロ
<MTMacroDefine name="public_code" ctag="code">
<div class="code"><MTMacroApply macro="Tag2Char escapedTag"><MTMacroContent></MTMacroApply></div>
</MTMacroDefine>
<div class="code"><MTMacroApply macro="Tag2Char escapedTag"><MTMacroContent></MTMacroApply></div>
</MTMacroDefine>
でコードの位置を把握、そしてこの部分をさらにTag2Char、escapedTagという2つのマクロを順にかけています。
Tag2Charマクロ
<MTMacroDefine name="Tag2Char" pattern=
"m/\x3c(?!(?:br\s\/?|\/?p)\x3e)
((?:[^\x22'\x3c\x3e]|\x3c[^\x3e]*\x3e|\x22[^\x22]*\x22|'[^']*')*)\x3e/m">
<<MTMacroMatch position="1">>
</MTMacroDefine>
"m/\x3c(?!(?:br\s\/?|\/?p)\x3e)
((?:[^\x22'\x3c\x3e]|\x3c[^\x3e]*\x3e|\x22[^\x22]*\x22|'[^']*')*)\x3e/m">
<<MTMacroMatch position="1">>
</MTMacroDefine>
escapedTagマクロ
<MTMacroDefine name="escapedTag" pattern=
"m/\x26lt;\x3c((?:[^\x22'\x3e]|\x22[^\x22]*\x22|'[^']*')*)\x3e\x26gt;/m">
<<MTMacroMatch position="1">>
</MTMacroDefine>
"m/\x26lt;\x3c((?:[^\x22'\x3e]|\x22[^\x22]*\x22|'[^']*')*)\x3e\x26gt;/m">
<<MTMacroMatch position="1">>
</MTMacroDefine>
まずTag2Charマクロで、普通のタグの<や>を<、>に置換しています。このとき、MovableTypeによって自動的につけられるおそれのある<p>タグ、<br />タグは対象にならないよう正規表現の(?!)の部分で回避しています。またタグ内のタグ(例えば<img <strong>src="hoge.img"</strong> width="100">のようなもの)は外側のタグだけ処理されるようにしてあります。
次にescapedTagマクロですが、2重タグを検出して、1重タグに置換しています。Tag2Charマクロが適用されたあとなので、<<、>>で検出しています。
以上のマクロをテンプレート上のどこかに書いて、public_codeマクロを適用すれば、上記の目的はいちおう達成されます~
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。