ページ先頭の改行を削除する

Movable Type 4では、テンプレートのモジュール化が押し進められています。
そして、組み込むモジュールを判別するために、インデックステンプレートやアーカイブテンプレートの先頭で、MTSetVarタグを使って変数を多数定義しています。
ところが、このタグがあるために、出力されたページの先頭に空の改行が入り、DOCTYPE宣言がページの先頭にならないという問題があります。

・参考
MT4のヘッダ部分(WolaWola)
Movable Type 4 の PHP 化で XML 宣言を自動的に切り替える(小粋空間)
Movable Type 4 正式リリース! インストールと雑感(亜細亜ノ蛾)

MTSetVarタグの行をすべて1行につなげて書き、さらにその後に改行せずにDOCTYPE宣言を書けば、一応はこの問題を解決することができます。
しかし、それだとテンプレートの可読性が下がります。

そこで、プラグインを使って、この問題を解決してみました。

1.ltrim修飾子

Movable Typeでは、テンプレートタグに修飾子(※注参照)を適用することで、タグの出力にさまざまなフィルターをかけることができます。

修飾子の中に、「ltrim」というものがあります。
これは、タグの出力の先頭から、ホワイトスペース(空白や改行など)を削除するものです。
たとえば、「<MTEntryBody ltrim="1">」とすると、エントリーの本文を出力する際に、先頭にあるホワイトスペースが削除されます。

このltrim修飾子を利用して、出力されたページの先頭からホワイトスペースを削除するというのが、ここで紹介する方法です。

※注
Movable Type 4の英文のドキュメントによると、従来のグローバルフィルターのことを、MT4では「global modifier」と呼ぶようです。
日本語では「修飾子」になるものと思われます。

2.ApplyModifierプラグインのインストール

ページ全体に対して修飾子を適用するために、「ApplyModifier」というプラグインを作りました(MT4専用です)。
以下からダウンロードすることができます。

ApplyModifier_1_00.zip

プラグインの継続的な開発やサポートのために、プラグインをご利用された方は、ドネーション(寄付)を行っていただけると幸いです。
ドネーションの方法は、こちらのページをご参照ください。

また、このプラグインの他にも、いくつかのプラグインを配布しています。
配布中のプラグインは、Movable Type Plugin Directoryのページをご参照ください。

Movable Typeのプラグイン開発等のドキュメント「Movable Type Developer's Guide Volume 1」も販売しています。
ご自分でプラグインを作ってみたい方に、ぜひお勧めしたい一冊です。
詳細は特設ページをご覧ください。

このプラグインは、<MTApplyModifier>と</MTApplyModifier>で囲まれた部分をそのまま出力する働きをします。
「そのまま出力するのなら無意味なのでは?」と思われるかも知れませんが、そうではありません。
このタグでは修飾子を使うことができます。
タグで囲った範囲すべてに修飾子を適用して出力するのが、このプラグインの役割です。

メインページやアーカイブテンプレートをこのタグで囲み、「ltrim="1"」の修飾子を使えば(以下参照)、ページの先頭の改行を削除することができることになります。

<MTApplyModifier ltrim="1">
メインページやアーカイブテンプレートの内容
</MTApplyModifier>

なお、どこかで同じようなプラグインを見たことがありますが、どこで見たか失念してしまったのと、どうせならMT4用にしようということで、自分でプラグインを書きました。
また、このプラグインは、MT標準のPHPのダイナミックパブリッシングにも対応させました(実質1行でできたので(笑))。

3.MTApplyModifierプラグインの他の利用法

MTApplyModifierプラグインは、使い方次第でいろいろな応用ができます。

たとえば、「テンプレート上では可読性を上げるために改行を入れたいが、改行があるとレイアウトが崩れることがあるので、出力されるページでは改行を削除したい」ということも、よくあると思います。
このようなときには、改行を入れたくない部分全体をMTApplyModifierタグで囲み、「ltrim="1"」と「strip_linefeeds="1"」の修飾子をつけると良いです(以下参照)。

<MTApplyModifier ltrim="1" strip_linefeeds="1">
改行を削除したい部分
</MTApplyModifier>