MTのテンプレートを公開する

最近(主にワタシがMTを勧めた知人関係から:^^;)たまにMT関係の質問を貰うようになったんですが、結構「いちいち聞かなくてもテンプレートを見られればすぐ解る」レベルのことも多いので、テンプレートのバックアップを兼ねて、この機会にプラグインを導入し自動的にテンプレートを公開するようにしてみました。(現在このサーバは日毎に全ファイルをバックアップしてるので、ファイルを作っておけば最大1ヶ月前までのテンプレートに遡れることになる)

テンプレートの公開にはMTShowTemplatesプラグインを使います。今回使用したのはバージョン0.3。

ただ、このプラグインはそのままだと日本語がハゲシク化けます。

<div class="sidetitle">
倉庫
</div>

<div class="sidetitle">
AO,E
</div>

になっちゃうのは、「大意は解る」にしてもバックアップとしてちょっとキビシイ(^^;;

仕方ないのでプラグインのソースを読みます。perlの心得などまったくないワタシですが、短いスクリプトなので「どの辺が怪しいか」くらいの見当はつきます。

my $text = $start_wrap.encode_entities($template->text).$end_wrap;

どうも↑ココみたい。

my $start_wrap = '<textarea cols="75" name="text" rows="15" wrap="virtual" style="background-color: #eee;">';
my $end_wrap = '</textarea>';

変数$start_wrapと$end_wrapにはそれぞれtextareaタグが入ってて、これでデータをはさみ込むことによって「データのフォーム内表示」を実現させてるみたいです。

encode_entities()

という関数はよく解りませんが、この文脈で使われているということはPHPhtmlspecialchars()htmlentities()に相当する

特殊文字をHTMLエンティティに変換する関数

→HTMLタグを表示出来るようにする&サニタイズ用の関数でしょう、たぶん。どうやら文字化けの原因はコレみたい。

encode_entities()関数はどういう風に定義されてるのか、MTのスクリプトをgrepしてみます。

/mt/lib/MT/Util.pm

if ($Have_Entities && !MT::ConfigMgr->instance->NoHTMLEntities) {
$html = HTML::Entities::encode_entities($html);

この辺りまで来ると、perlが読めないワタシにはナニが書いてあるのやらさっぱり解りません(^_^;) ただ、自分で定義してる関数じゃ無さそう→汎用モジュールなのかな?とか、一緒にHTML::Entitiesがなんとかと書いてあるのでこれと何らかの関連が有りそうだ位の見当はつきます。

改めて見直してみると、showtemplates.plの上のほうにも

use HTML::Entities;

と書いてますんで、これが外部ライブラリを呼び出してるっぽい気が。

早速ぐぐってみたところ、HTML::Entitiesは(やはり)perlのモジュールみたいっす。

HTML::Entities

encode_entities($string, [$unsafe_chars])

このルーチンは$stringでの安全ではない文字をエンティティ表現で置換えます。2番目の引数を与えることにより、安全ではないと考えられる文字を指定することができます。拡張できるデフォルトの文字セットは制御文字、ハイビット文字、そして'<' '<', '&', '>' そして'"' です。

ああ、コレですな。オプション無しでこのモジュールを使うとどうも2バイト文字がエンティティ化されるみたい→そりゃ化けます(^_^;)(「ハイビット文字」っつーのはどうもまっきん用語らしいのですが、正確な意味が解りません。いわゆる「2バイト文字」とは異なるんでしょうかねぇ??)

ということで、エンティティ化する文字をオプションとして明示的に指定するようにしました。

my $text = $start_wrap.encode_entities($template->text,'<&>"').$end_wrap;

結果>バッチリ(^_^)

無事文字化けしなくなったので、Show Templatesというテンプレートでtemplates.htmlを作成するようにしました。これでShow Templatesをリビルドする度にtemplates.htmlにテンプレートのバックアップが取れるようになります。

ついでに、cronで日に3回とか(他の処理と一緒に)自動再構築するようにしました。

あとは、メインインデックスの下のほうにでもtemplates.htmlへのリンクを作り込んでおけばいいでしょう。