MovableTypeのテンプレートをプログラムで生成・フィルタリングする方法と使い方の例として再構築の高速化をメモ。もう既にどなたか試されたものなのか、考えたけどやらなかったのかはわかりません。
- MovableType Background Rebuilder Plugin を作った理由。 (Junnama Online (Mirror))
- MovableType再構築高速化案と動的・静的な話2 (blog@browncat.org)
このあたりで少し考えていたもの。perlはそれなりに使ってましたがMTの中身はほとんど見たことなかったので、こんな感じで良いのか少し心配ではあります。
どういうもの?
MovableTypeのテンプレートにはリンクファイルという機能があり、外部ファイルを読み込んでテンプレートとして使うことが出来ます。これは内部でperlのopenを使っているので、外部コマンドとpipeが使えるはずです。というか実際に使えるのですが、そのままだと少し問題があるため適当なパッチを捏造してみました。
これを使って外部コマンドでテンプレートを前処理し、MovableTypeを通すことで半分処理済みのテンプレートを作ることが出来ます。これを個別エントリ作成に使えば高速化できるのでは?という感じです。
パッチ
いくつかある問題を解決するためにmt/lib/MT/Template.pmを修正しました。 MovableTypeのバージョンは3.35jです。
パッチファイル:mt-template-pipe-patch-070703.txt
パッチの当て方: 適当なところに上のパッチを置いて
patch -p0 < $PATCH/mt-template-pipe-patch-XXXXXX.txt (XXはバージョン)
これでテンプレートのリンクファイル部分にかなり自由にコマンドを記述出来るようになるはずです。
書式など
リンクファイルのコマンド書式は以下のとおり(コマンドは絶対パスで最後が必ず'|')
コマンドはテンプレートの保存や再構築時に実行され、標準出力がそのままテンプレートとして使われます。適当にechoとかしても良いですし、フィルタとファイルを指定して普通にテキスト処理を行うことも出来ます。リダイレクトは試してませんが避けた方がいいかと思います。MTからは何も渡されませんので入力は必ずファイルから読むか自分自身で生成することになります。
使い道
さて何に使うかというと。。。なかなか微妙です。テンプレートをスクリプトでいじれるのは面白そうですが、意外と用途が思いつきません。
- 再構築カウンタ (誰もいらないか。しかもプラグインでも出来そう)
- ブロックのローテーション (広告とか?これも普通にプラグインにしたほうが良さそう)
- その他リビルド時になにやら生成 (ううむ・・・)
- ちょっと前のエントリに書いたようなリビルド高速化(やはりこれかな)
高速化の例
まだかなり適当なので申し訳ないのですが、個別エントリに関連するタグを置換するようなフィルタを用意。 比較的クリーンなテンプレート相手なのでこんなのでもあまり問題なさそうです。タグはエラーが出ない程度に適当に選んだもの。実用的に使うにはもう少し追加・検討が必要そうです。まずは暫定版ということで。
sample-filter1.sh-070703.txt-- MTタグをXMTに変換(sample-filter1.sh、要実行権)
sed -e 's/MTEntryKeywords/XMTEntryKeywords/g'\
-e 's/MTEntryTitle/XMTEntryTitle/g'\
...
-e 's/MTPingDate/XMTPingDate/g' $1
sample-filter2.sh-070703.txt-- XMTタグをMTに戻す(sample-filter2.sh、要実行権)
sed -e 's/XMTEntryKeywords/MTEntryKeywords/g'\
-e 's/XMTEntryTitle/MTEntryTitle/g'\
...
-e 's/XMTPingDate/MTPingDate/g' $1
フィルタ設置例
- 個別エントリのテンプレートを/tmp/individual-template.txtとして保存。
- インデックステンプレートに新しいテンプレートを作成
- 出力ファイル名: /tmp/tmp1.txt
- リンクファイル: /hoge/bin/sample-filter1.sh /tmp/individual-template.txt|
- 個別エントリのテンプレートの入力にインデックスの出力を指定
- リンクファイル: /hoge/bin/sample-filter2.sh /tmp/tmp1.txt|
- ご注意!:必ず個別エントリテンプレートはローカルにでもいいのでバックアップしてから入れ替えてください。万一なにかあっても保証できません。
使い方
- リビルド時にまずインデックスを作成
- 個別エントリ構築や全構築
インデックス生成時に決まるものが先に決めることが出来るので個別テンプレートは大きくなりますが、タグの処理がない分高速になるはずです。テンプレートの生成がおかしいときは一旦テンプレートのテキストエリアをクリアにしてから保存してみてください。
最後に
試してませんがrdocとかもテンプレートネタに使えたりするかもしれません。phpのcliなんかもですね。htmlやxmlを吐いてくれるものはかなりテンプレートのソースに使えそうです。
ただマジメにテンプレートの最適化をするならDOMで影響範囲とかを調べつつ解析して出力するとか、一部のタグを実行するとかが必要でしょうね。今だとMTInclude先のタグは処理できませんし。
ってこんなもの誰か必要なんだろうかとか思いつつ。。。