[2] SuikaWiki をはてなスターに対応させてみました (2008年12月16日)。
[3] SuikaWiki は匿名なので、アカウントとの対応は付けようがありません。 幸いはてなスターはアカウントと紐付けせずとも使えるようになっているので、 そのまま匿名で使うことにします。
[11] SuikaWiki4 では名前 (WikiName) と頁 (WikiPage) が多対多対応になっています。 「ある名前」や「ある名前に属するある頁」には URL がありますが、「ある頁」 には URL がありません。スターを付けたい対象となり得るのはきっと「ある頁」 でしょうけど、 URL がない以上使えませんから、「ある名前」に付けることにします。
[12] 章や段落にも付けられた方がいいかもですが、とりあえず保留。
[4] 普通ははてなスターの JavaScript 実行コードを HTML 内に
script
タグを直接書き込んで呼び出すのでしょうが、
あまり HTML をいじりたくなかったので、既に参照するようになっている sw.js
(<http://suika.fam.cx/swe/scripts/sw.js>)
の中で DOM 的に script
要素を挿入する形にしました。
[5] そういう使い方は想定外のようで、文書の構文解析が終わった後からはてなスターのスクリプトを読み込んでも初期化が実行されなかったり
(Firefox や Opera の場合 ― load
が既に終わっているため)、
Ten.DOM が読み込まれた時点で中途半端な初期化が行われたり
(Safari や Chrome や WinIE の場合 ― バグ対策なのか謎のループを使っていますが、構文解析終了後は待ちなしで即実行されるため)
してしまいます。仕方がないので無理矢理 dispatchEvent して初期化させています。
body
要素の entryNode 化[6] SiteConfig では選択子を指定しますが、 Ten.Selector.getElementsBySelector
の呼び出し時に使われる親要素が document.body
になっています。
[7] SuikaWiki の出力する HTML では頁全体が一つの記事で、
その子要素に大見出しである h1
要素やナビゲーションの
div
要素があります。
その h1
や div
を題名や URL
やスターの container に使いたいのですが、 >>6 のため、
「body」と指定しても思ったようにはなりません。
[8] 仕方がないので、 Hatena.Star.EntryLoader.loadNewEntries を動的に書き換えて、
document.documentElement
を親要素に使うようにしました。
[10] Hatena.Star.onLoadFunctions という Array (最初はないので自分で用意する必要があります。) に Function を突っ込んでおくと、初期化の直前の丁度いいタイミングで呼び出してくれます。 >>4 や >>8 のような変な使い方をする時には便利です。