L
次のページ
H
前のページ
U
上のページ

« tagsoup カスタム版 | Main | Mac_Stripe-XHTML_Strict-ja 更新 Read More を可能に »

2005年12月10日

Hypertext タグの置換設定の使い方

1.0.4 から Hypertext テンプレートタグで置換設定ができるようになったのはエントリ「1.0.4 がもう出た」で述べた。What's New でも簡単に解説されているが、Thingamablog で所謂「Read More」を実現する方法も交えて突っ込んだ使い方を説明する。

文字列置換ではなく正規表現置換であること

find 属性と replace 属性でできる置換の設定は、文字列の単純な置き換えではなく正規表現による置き換えだということに注意する必要がある。正規表現として意味のある記号はエスケープしなければならない。

Thingamablog は Java アプリケーションなので当然使用される正規表現も Java の正規表現である。Java の正規表現については Java の Pattern クラスのドキュメントの正規表現構文の要約というセクションに解説されているからそこを参照してほしい。

エスケープするには \ (バックスラッシュ) を直前におく方法と、\Q\E で挟む方法の二種類がある。

特別な記号と誤解されないために

正規表現として正しくてもそのままでは使えない記号がある。それは >" それから , だ。それぞれテンプレートタグの終端、属性値の終端の記号、そして後述する属性値の区切り記号と同じだからだ。

これらはそれぞれ \> " \, と書く必要がある。

テンプレートタグを使用する

find 属性値や replace 属性値にテンプレートタグを使うこともできる。ただしテンプレートタグの処理の順番によって使い方が変わってくる。

当該の Hypertext テンプレートタグを処理する前に置き換えられるテンプレートタグはそのまま書けばよい。エスケープする必要はない。なぜなら置換をするころには文字列に置き換えられているからだ。

当該の Hypertext テンプレートタグを処理した後に置き換えられるテンプレートタグは上に述べたエスケープをしないとならない。文字列に置き換えられる前に置換設定として扱われるからだ。

先に置き換えられるテンプレートタグの使用例

例えば <$EntryBody$> よりも <$BaseURL$> の方が先に処理されるから、<$EntryBody$> の置換設定に <$BaseURL$> を使用するときには次のようにする。

<$EntryBody close_empty_tags="1" find="\Q<$BaseURL$\E\>" replace="<$BaseURL$>"$>

こうしておくとエントリ中に書いた <$BaseURL$> を自分のブログの URL に置き換えてくれる。他のエントリへのリンクを張るときに例えば次のように書いて使う。

<a href="<$BaseURL$>/archives/2005/12/entry_75.html" title="Thingamablog メモ : tagsoup カスタム版">tagsoup カスタム版</a>

こうして書くことにしていればブログの URL を変更してもエントリに書かれた URL をいちいち修正する必要がない。

後から置き換えられるテンプレートタグの使用例

一方で <$EntryPermalink$><$EntryBody$> よりも後に処理されるから、<$EntryBody$> の置換設定に <$EntryPermalink$> を使用するときには次のようにする。

<$EntryBody close_empty_tags="1" find="\Q<!-- end of abstruct --\E\>[\S\s]*" replace="<a href=&quot;<\$EntryPermalink\$\>&quot;>続きを読む</a\>"$>

こうするとエントリの中に書いた <!-- end of abstruct --> も含めてそれ以降がエントリのパーマリンクへのハイパーリンクに置き換えられる。つまり所謂「Read More」が実装できる。

複数の置換を設定する

ソースを読むと複数の置換が設定できるのがわかる。find 属性値と replace 属性値を , で区切って記述する。上にあげた例を同時に指定するには次のようにする。

<$EntryBody close_empty_tags="1" find="\Q<$BaseURL$\E\>,\Q<!-- end of abstruct --\E\>[\S\s]*" replace="<$BaseURL$>,<a href=&quot;<\$EntryPermalink\$\>&quot;>続きを読む</a\>"$>

順序と数が find 側と replace 側で合うようにする必要がある。また , の前後にスペースを入れるとそれも正規表現の内だと思われてしまうので、見やすくするためにスペースを入れてはならない。