うつし世はゆめ / 夜のゆめもゆめで“TIPS”タグの付いているブログ記事

反省

先日のおみ子さんフィルタは、重いし精度が悪いしでできがよくなかったのでつくり直した。

[Patterns]
Name = "Add Link to Hatena Diary Title"
Active = TRUE
URL = "d.hatena.ne.jp/*/*"
Limit = 250
Match = "(<h1>)\1([^<>]+)\2$STOP()"
Replace = "$URL(\u&&(*\h/\3/*))"
          "\1<a href="http://d.hatena.ne.jp/\3/">\2</a>$STOP()"

つくっている内に発見したことを書く。

ちょっと難しかったのは、はてなidをどう取得するかという点なのだった。

どう取得すればよいかというと、もちろんURLから採るのがよいに決まっている。

そして「\u&&(*\h/\1/*)」と書けば、idの部分が変数\1に格納されるのだが、これをこのまま書くと、「このページのURLにマッチする文字列」という意味になってしまう。

別にURLにマッチさせたいわけではないので、マッチはエスケープして、変数への格納だけを実行したかった。

それをどうやってやればよいのかわからなかったのだが、試行錯誤しているうちにできた。

正解は、"$URL(\u&&(*\h/\1/*))"だった。

(「括弧内の文字列はURLか?」という意味)

この解答はなかなかむずかしかったが、いじっている内におみとろんの検索言語に無駄に詳しくなってしまったのでよしとする。




Movable Type のサイドバーでアクティブなページのスタイルだけを変更

ついでに最近仕事でいじっていたせいでMTについても無駄に詳しくなってきたので、そっちの方で学んだことも書きしるしておく。


サイドバーに、メニューなどをだしているとき、アクティブなページのスタイルだけ変えたいことがあると思う。

これをMTのテンプレートタグでやろうとすると意外に大変なのだが、以下の方法はかなり幅広く適用できる。

Movable Typeには、独自のループタグがある。

(複数形のタグは大抵これ)

<$MTEntryTitle$>

これは

#=> 現在のページのエントリータイトルを出力

という意味だが、一方、

<MTEntries>
<$MTEntryTitle$>
</MTEntries>

とすると、

#=> すべてのエントリーの中のそれぞれのエントリーについて
#==> エントリーのタイトルを出力

という意味になる。

これはふつうのプログラム言語だと、

for e in entries{
    print(e.title)
}

みたいな感じだと思う。

つまり、<MTEntries><MTCategories>とか、その手の複数形のコンテナタグは、コンテクスト内のテンプレートタグに対し、エントリーやカテゴリーの配列をひとつずつわたす。

だから、たとえばエントリーのリストを出力したいときは、

<MTEntries>
<MTEntriesHeader><ul></MTEntriesHeader>
<li><a href="<$MTEntryPermaLink$>"><$MTEntryTitle$></a></li>
<MTEntriesFooter></ul></MTEntriesFooter>
</MTEntries>

みたいな感じになる。

一方、現在ひらいているページのスタイルだけ変えるには、以下のようにすればよい。

(多分他にも方法はあるが、このやり方は、アーカイブでもカテゴリでも幅広く使える)

<MTSetVarBlock name="this_id"><$MTEntryID$></MTSetVarBlock>
<MTEntries>
<MTSetVarBlock name="itr"><$MTEntryID$></MTSetVarBlock>
<MTEntriesHeader><ul></MTEntriesHeader>
<li class="<MTIf name="this_id" like="$itr">active<MTElse>nonactive</MTIf>"><a href="<$MTEntryPermaLink$>"><$MTEntryTitle$></a></li>
<MTEntriesFooter></ul></MTEntriesFooter>
</MTEntries>

日本語にすると、

#=> 変数this_id に現在のページのエントリーIDを代入
#=> すべてのエントリーの中のそれぞれのエントリーについて
#==> まず、変数itr にエントリーのIDを代入
#==> (省略)
#==> this_idとitrの値がひとしかったら、class="active"
#==> ひとしくなければ、class="nonactive"

みたいな感じ。


現在のわたしがどれほど無駄にMTに詳しくなってしまったかと言うと、ここまでをすべて空で書いているというくらいである。

まあ、試してないから、どっかまちがってるかもしれないけど。