«前の日記(2007-12-07 (金)) 最新 次の日記(2007-12-09 (日))»  

まちゅダイアリー


2007-12-08 (土)

自動的にセクションアンカーをつける tDiary プラグイン

tDiary の day にタイトルをつけている人が皆無な件 - HsbtDiaryより。

確かに feed ではすでに day という単位ではなく、section という単位で生成されている以上、day のデフォルト Permalink は

example.com/diary/yyyymmdd.html

よりは

example.com/diary/yyyymmdd.html#p01

の方がいいかもしれないなー。

そうそう。 TinyURL を通すとセクションアンカーが消えるとか、はてなブックマークでアンカー付きとそうでない Permalink が分かれてしまうとかいうことがちょっとイヤ。

#p01 より /p01 の方がいいというツッコミがあったりするけど、その日の日記をまとめて読みたい(昨日の OAuth 日記はまさにそれ)とか、ツッコミをどこに表示するのかとか、 Permalink が複数できるとかいう問題がでてきちゃう。 なので、とりあえずセクションアンカー (#p01 とかのアレ) 無しでの日記へのアクセスは、自動的に最初のセクションアンカーを付けるようにするプラグインを書いた。

  • 日別表示 (@mode == 'day') かつアンカーが無い場合 (YYYYMMDD.html) に
  • 最初のアンカーを付ける (YYYYMMDD.html#p01)

ようにしている。 何か副作用があるかもしれないけど、使ってみないことには分からないのでこの日記に入れている。

#
# day2section.rb - tDiary plugin
#
# When a visitor accesses to day page without section anchor, navigate to first section.
#
# Copyright (c) MATSUOKA Kohei <http://www.machu.jp/>
# Distributed under the GPL
#
add_header_proc do
  if @mode == 'day'
    <<-SCRIPT
    <script type="text/javascript">
    window.onload = function() {
      if(location.hash == "") {
        location.replace(location.href + "#p01");
      }
    }
    </script>
    SCRIPT
  end
end

ソースは CodeRepos にコミットした。 CodeRepos といえば、おとといコミットした Flickr プラグインが、直後に修正されていてビックリした。嬉しいなぁ。

追記 - いきなり修正

window.onload に関数を割り当てていたんだけど、他に window.onload を使っているプラグインがあった場合に競合してしまうことに気がついた。 なので、代わりに footer_proc を使うように修正してコミット

#
# day2section.rb - tDiary plugin
#
# When a visitor accesses to day page without section anchor, navigate to first section.
#
# Copyright (c) MATSUOKA Kohei <http://www.machu.jp/>
# Distributed under the GPL
#
add_footer_proc do
  if @mode == 'day'
    <<-SCRIPT
    <script type="text/javascript">
    if(location.hash == "") {
      location.replace(location.href + "#p01");
    }
    </script>
    SCRIPT
  end
end
Tags: tDiary

location.replace() の挙動が IE と Firefox で違う?

自動的にセクションアンカーを付けるプラグインでは JavaScript の location.replace() を使っているんだけど、手元の環境 (XP SP2) では IE6 と Firefox で挙動が違う。

日記のトップページ (http://www.machu.jp/diary/) から今日の日記 (http://www.machu.jp/diary/20081208.html) へと移動した場合のブラウザの履歴を比較した。

IE6 だと

http://www.machu.jp/diary/
http://www.machu.jp/diary/20081208.html
http://www.machu.jp/diary/20081208.html#p01 ← いまここ

これだと、戻るボタンを押したときにトップページではなくアンカーなしのURLに戻ってしまう。

Firefox だと

http://www.machu.jp/diary/
http://www.machu.jp/diary/20081208.html#p01 ← いまここ

こっちが期待する動作。アンカー無しのURLが履歴に残らないので、戻るボタンを押すとトップページに戻る。

ちなみに

オライリーの JavaScript 第5版には、以下のように書かれている。

replace() メソッドは、履歴リストに新しい項目を作成せずに、指定された URL で現在の URL を置き換えます。

Web でググってみても、履歴に残さないときは replace() を使おうって書いてあるし。謎だ。 このままじゃこのプラグインは使えないなぁ。

追記

もうちょっと調べてみた。 IE の場合、 location.replace() で別ページに遷移するときは履歴に残らないけど、同じページに遷移するときは履歴に残るみたい。

Tags: JavaScript

tDiary プラグインを RubyGems で管理

これまた思いつき。 tDiary のプラグインを gem 化して、 RubyGems で管理できると便利かもしれない。 プラグインと gem だと読み込み方法が違う(プラグインは tDiary::Plugin クラスのインスタンスで instance_eval を使って読み込む)ので、そう簡単にはいかないかもしれないけど。

公式に取り込まれたもの以外はtDiary-users Project - PluginListで公開されているけど、取得方法がマチマチ。 これらを CodeRepos 上に置いて、「gem install プラグイン名」で簡単インストールできるといいな。 (tDiary の設定画面から操作できるとなお Good)

Tags: tDiary