strip_linefeedsモディファイアを使いつつ一部に改行を残す

MTQに、「strip_linefeedsモディファイアで改行を削除しつつも、適切な位置に改行を残したい」といった内容の質問がありました。
この質問に答えてみます。

改行を表す文字列をregex_replaceモディファイアで置換する

strip_linefeedsモディファイアを使うと、対象のテンプレートタグの出力に含まれる改行は、すべて削除されます。
一部の改行を残すような機能はありません。

ただ、strip_linefeedsモディファイアを適用した後で、regex_replaceモディファイアを使って、置換を行うことはできます。
この仕組みを利用して、以下のようにすることが考えられます。

  • 1.改行を入れたい位置に、改行を表すような何らかの文字列を入れておきます。
  • 2.strip_linefeedsモディファイアで、改行文字を削除します。
  • 3.1.の改行を表す文字列を、regex_replaceモディファイアで改行文字に置換します。

事例

例えば、最近のブログ記事10件のタイトルと日付を、以下のようなフォーマットで出力したいとします。

<entry>
  <title>タイトル</title>
  <date>日付</date>
</entry>
・
・(同様のフォーマットで10件繰り返す)
・

改行したい位置に「[cr]」という文字列を入れるとします。
この場合、テンプレートを以下のように書きます。

<mt:Entries lastn="10" strip_linefeeds="1" regex_replace="/\[cr\]/g","\n">
<entry>[cr]
  <title><$mt:EntryTitle$></title>[cr]
  <date><$mt:EntryDate$></date>[cr]
</entry>[cr]
</mt:Entries>

「[」と「]」は正規表現で特別な意味を持つ文字なので、「\」(上のリストではバックスラッシュ)を付けています。
「/\[cr\]/g」の「g」は、見つかったものをすべて置換することを意味します。
また、置換先の「\n」が改行文字を意味します。