📃

【Movable Type】出力されるURLを相対パスに置換する

に公開

概要

MT(PowerCMS含む、以下同)のタグで出力されるパスは基本的にhttp(s)://から始まる絶対パスですが、これをまとめて相対パスに置換して出力するコード例です。

コード例

htmlファイルを出力するテンプレートのコード全体をMTForMTUnlessで囲み、replaceモディファイア(正規表現を使用する場合はregex_replaceモディファイア)でURLを相対パスに置換します。

<mt:For replace="https://example.com/","./">
  <!-- テンプレートのコード全体 -->
</mt:For>

<!-- または -->

<mt:SetVars>
  blogURL=<mt:BlogURL>
</mt:SetVars>
<mt:For replace="$blogURL","./">
  <!-- テンプレートのコード全体 -->
</mt:For>

"./"の部分は、htmlファイルが出力される階層によって書き換えます。
注意点として、全体指定した場合、記事本文などに表記されたドメインが置換元の値と一致した場合は、これらも等しく置換されてしまいます(次項参照)

全体に適用されるよう指定したモディファイアが実行されるタイミングについて

上記コード例において、MTForに指定したreplaceモディファイアが実行されるタイミングは、「MTForで囲われたコード内容が処理されたあと」、つまり一番最後に処理されます。

以下は検証コードとその結果です。URLはhttp://localhost/で検証しています。
また、MTMLは2パターン記述がありますが、出力結果は同じです。

検証① 通常出力

普通に置換処理をします。なお、MTタグでの出力と比較のためhttp://localhost/を直接テンプレートに記述もしています(以降同様)

<mt:For replace="http://localhost/","./">
  <p>http://localhost/</p>
  <p><a href="<$mt:BlogURL$>"><$mt:BlogURL$></a></p>
</mt:For>

<!-- または -->

<mt:SetVars>
  blogURL=<mt:BlogURL>
</mt:SetVars>
<mt:For replace="$blogURL","./">
  <p>http://localhost/</p>
  <p><a href="<$mt:BlogURL$>"><$mt:BlogURL$></a></p>
</mt:For>
<!-- 出力結果 -->
<p>./</p>
<p><a href="./">./</a></p>

replaceモディファイアに記述の値で置換され出力されます。

検証② MTBlogURLreplaceモディファイアを付与

リンクテキストのMTBlogURLreplaceモディファイアを付与しています。./に置換された文言が再びhttp://localhost/に置換されるかどうかの確認です。

<mt:For replace="http://localhost/","./">
  <p>http://localhost/</p>
  <p><a href="<$mt:BlogURL$>"><$mt:BlogURL replace="./","http://localhost/"$></a></p>
</mt:For>

<!-- または -->

<mt:SetVars>
  blogURL=<mt:BlogURL>
</mt:SetVars>
<mt:For replace="$blogURL","./">
  <p>http://localhost/</p>
  <p><a href="<$mt:BlogURL$>"><$mt:BlogURL replace="./","$blogURL"$></a></p>
</mt:For>

なお、上記はどちらも同じhttp://localhost/を値としているため、念のためMTBlogURLreplaceモディファイアの置換後の値を変えた以下のコードでも確認してみました。

<mt:For replace="http://localhost/","./">
  <p>http://localhost/</p>
  <p><a href="<$mt:BlogURL$>"><$mt:BlogURL replace="./","http://127.0.0.1/"$></a></p>
</mt:For>

<!-- または -->

<mt:SetVars>
  blogURL=<mt:BlogURL>
</mt:SetVars>
<mt:For replace="$blogURL","./">
  <p>http://localhost/</p>
  <p><a href="<$mt:BlogURL$>"><$mt:BlogURL replace="./","http://127.0.0.1/"$></a></p>
</mt:For>

出力結果はいずれも同じです。

<!-- 出力結果 -->
<p>./</p>
<p><a href="./">./</a></p>

検証①と同じ状態で出力されました。このことからMTForで囲われたコード内容が処理されたあと、MTForに付与されたモディファイアが処理されていると推測できます。

検証③ 検証②の裏付け

検証②の裏付けとして、以下コードを出力してみます。MTBlogURLreplaceモディファイアであらかじめURLをhttp://127.0.0.1/に置換するため、リンクテキストの出力ではMTForreplaceモディファイアが実行されないことを確認します。

<mt:For replace="http://localhost/","./">
  <p>http://localhost/</p>
  <p><a href="<$mt:BlogURL$>"><$mt:BlogURL replace="http://localhost/","http://127.0.0.1/"$></a></p>
</mt:For>

<!-- または -->

<mt:SetVars>
  blogURL=<mt:BlogURL>
</mt:SetVars>
<mt:For replace="$blogURL","./">
  <p>http://localhost/</p>
  <p><a href="<$mt:BlogURL$>"><$mt:BlogURL replace="$blogURL","http://127.0.0.1/"$></a></p>
</mt:For>
<!-- 出力結果 -->
<p>./</p>
<p><a href="./">http://127.0.0.1/</a></p>

リンクテキストの出力のみ、MTForreplaceモディファイアによる置換は発生しませんでした。

本記事の内容は以上です。

Discussion