【Movable Type】出力されるURLを相対パスに置換する
概要
MT(PowerCMS含む、以下同)のタグで出力されるパスは基本的にhttp(s)://
から始まる絶対パスですが、これをまとめて相対パスに置換して出力するコード例です。
コード例
htmlファイルを出力するテンプレートのコード全体をMTFor
やMTUnless
で囲み、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
モディファイアに記述の値で置換され出力されます。
MTBlogURL
にreplace
モディファイアを付与
検証② リンクテキストのMTBlogURL
にreplace
モディファイアを付与しています。./
に置換された文言が再び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/
を値としているため、念のためMTBlogURL
のreplace
モディファイアの置換後の値を変えた以下のコードでも確認してみました。
<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
に付与されたモディファイアが処理されていると推測できます。
検証③ 検証②の裏付け
検証②の裏付けとして、以下コードを出力してみます。MTBlogURL
のreplace
モディファイアであらかじめURLをhttp://127.0.0.1/
に置換するため、リンクテキストの出力ではMTFor
のreplace
モディファイアが実行されないことを確認します。
<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>
リンクテキストの出力のみ、MTFor
のreplace
モディファイアによる置換は発生しませんでした。
本記事の内容は以上です。
Discussion