印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableType Timeline を毎年の今頃の投稿を眺めるのに使う

SIMILE Timeline を使って,「毎年の今頃の投稿」を串刺し表示する。

■ ■ ■

去年や一昨年の今頃は何をしていただろうか? というのが気になることがある。Movable Type であれば bradchoate.com: MTOnThisDay プラグインで「去年や一昨年の『本日この日』」の投稿を表示することができる。MT4/MTOS 用のバージョンも公開されている (OnThisDay)。この OnThisDay の機能に加え,前後の日に幅を持たせたのが,LastYearEntries プラグインである (「去年の今頃はこんな記事を書いていました」を実現するMovableTypeプラグイン:LastYearEntries - Open MagicVox.net)。「去年や一昨年の『本日このあたりの日』」の投稿を表示することができる。

さて,「去年や一昨年の今日はどんな記事を書いていたのか?」というのを単に知りたいだけではなく,積極的に使いたいことがある。例えば,毎年同じ日に同じテーマで記事を書きたいときである。このブログであれば,ブログを開始した日や (1月26日),禁煙記念日がある (6月20日)。こういう日に限っては,行き当たりばったりに記事を書いていては間に合わない。当日になって「あ,このテーマで書かなくちゃ」と気がつくのでは遅い。LastYearEntries プラグインは,この用途にぴったりなのだが対応バージョンは MTOS/MT4 のため,このブログの MT 2.661 はバージョンが古過ぎるので残念ながら使えない。

そこで,タイムラインを表示する SIMILE Widgets | Timeline を使って,「本日このあたりの日」を表示することにする。

必要なものは,データ,スクリプト,HTML ドキュメントである。データは Movable Type のテンプレートを使って用意する。スクリプトはサンプルをもとに手書きする (Timeline_GettingStarted - simile-widgets)。

方針

方針としては,1つの xml データを用意し,これを各年に分けて多段表示する。中心は各年の今日にする。何年分のデータがあるかは自動判定が難しいので,手書きする。手抜きで手書き (スマン)。1年に1度書き換えなければならない。

インストール

ディレクトリとファイル名

まずインストールするディレクトリを決定する。インストールすると言っても,データと,JavaScript と,スクリプトを呼ぶ HTML ドキュメントの3つだけなので,大したことはないが,これが気に入ったら Timeline スクリプトをインストールすることになると思うので,ディレクトリは用意した方がいい。ここでは,次のディレクトリにする。

js/timeline/index.html  (HTML ドキュメント)
js/timeline/onthisday.js  (スクリプト)
js/timeline/timeline.xml  (タイムラインデータ)
js/timeline/timeline  (Timeline JS の実体へのシンボリックリンク)
js/timeline/timeline_2.3.0/  (Timeline JS の実体)
js/timeline/images/  (icon 画像ディレクトリ (オプション))

Timeline スクリプトのインストール

SIMILE Timeline のソースは,Downloads - simile-widgets - Project Hosting on Google Code から入手できる。現時点での最新バージョンは 2.3.0。ソースの他,ドキュメントや例題などの全部入り timeline_source_v2.3.0.zip をダウンロードし,展開する。timeline_2.3.0 というディレクトリ以下に展開される。

Linux ならば,「timeline」というシンボリックリンクを作ってリンク先を「timeline_2.3.0」にしておくと,使用しているバージョンが明確になり,かつバージョンアップする際にシンボリックリンクを張り直すだけでよいので (スクリプトを呼び出す側のソースを変更しなくてよいので),便利である。

$ ln -s timeline_2.3.0 timeline

その他のファイルのインストール

次のファイルを上のディレクトリに保存する。

表示用データ

表示に使うデータは,Movable Type のテンプレートを使って生成する。このサイトは MT 2.661 であるが,MT のバージョンには関係なく使える。MTOS/MT4 でも OK。出力先は,上で決めたディレクトリ内の xml ファイルにする。

<data>
<MTEntries lastn="0">
<event start="<$MTEntryDate format="%b %d %Y %H:%M:%S GMT+0900"$>" title="<$MTEntryTitle$>" icon="images/<$MTEntryCategory$>.png">
<$MTEntryExcerpt encode_html="1"$>
&lt;a href="<$MTEntryLink$>"&gt;[本文]&amp;lt;/a&gt;</event>
</MTEntries>
</data>

ここではタイトルの先頭についているブレットを,カテゴリ別に色分けするようにしている。ブレットの画像は timeline_2.3.0/src/webapp/api/images/ 以下に用意されているので,これをカテゴリの名前に変更して使う (nlog(n): Master Archive にカテゴリ表示をつけるには の要領)。色分けしない場合は,上のコード内の「icon="..."」の属性の記述を丸ごと削除するだけでよい。

文字セットは UTF-8 を使う。EUC-JP だと,文字セットの指定をしても文字化けしてしまう。サイトが EUC-JP な人は,プラグインなどを使って (nlog(n): Podcast は UTF-8 で),UTF-8 に変換する。

スクリプト

データを表示するための Javascript onthisday.js では,今年の「年」を取得するのに,getFullYear() を使っている。

var year = now.getFullYear();

いつもここは迷うところ。

var year = now.getYear() % 1900 + 1900;

getYear() は古いブラウザにも対応しているが,2000年以降は返す値がブラウザによって異なる (getYear)。getFullYear() は正しい西暦を返すが古いブラウザは対応していない。もうそんなブラウザを使っている人はいないかな (Netscape 3 とか)?

「date0」には今日の日付をセットし,「date1」に去年,「date2」に2年前,「date3」に3年前というようにセットしている。

このブログは開始してから6年になるので,onLoad() 関数内の bandInfos に6年分を書く。毎年1年分を追加しなければならないという欠点がある。Timeline.createBandInfo 内の width は,意味としては「幅」であるが,その年の表示の「縦の長さ」である。「width: 80」は縦を80ピクセルにするという指定である。「intervalPixels」は横幅の指定で,1日の横幅をピクセル数で指定する。

あまり見かけない設定に次がある。

  bandInfos[1].syncWith = 1;
  bandInfos[1].highlight = false;
...
  bandInfos[5].syncWith = 1;
  bandInfos[5].highlight = false;

syncWith に「1」を指定すると,各バンドの動きが同期しなくなる。もし同期させてしまうと,初期表示は問題がないが,マウスを使った瞬間に去年や一昨年の今日が今年の今日になってしまう。これは利点でもある反面,マウスを使うと各年が独立に動いてしまうという欠点にもなっている。各年をまとめてマウスでドラッグできるような,上手い方法はないものか…。highlight に false を指定することで,通常は最下段の大局的タイムラインに見られるような,中央がハイライトされている効果を抑止している。

…としていたのだが,これらを明示的にコードに書くと,IE6 が「Stack overflow」メッセージを出す。この記述を残したままでも,「onResize」の記述を消せば IE6 でもエラーはでない。Firefox 3.0 ではエラーなしに表示される。原因が不明なので,このコードは明示しないことにした。

HTML ドキュメント

タイムラインの表示をする HTML ドキュメントは,Javascript を呼んでいるだけである。スタイルで指定している高さ「style="height: 640px;"」は,onthisday.js スクリプトの Timeline.createBandInfo の width の合計である。

少し注意をする点としては,SIMILE Timeline の例にある,

<body onresize="onResize()">

は実用上問題ないのだが、(X)HTML的に valid でない (bodyタグ に onresize属性はない) ので (javascript: onresizeイベントハンドラの登録 (groundwalker.com)),

window.onresize = onResize;

として,これを onthisday.js 内に記述している。

出来たページ

出来上がった「本日このあたりの日」はこれである nlog(n) - On this day。タイトルの数が多いので,表示されるまでにかなり時間がかかる。

Posted by n at 2009-08-04 21:53 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?