SuikaWikiをはてなスターに対応させてみた

SuikaWikiをはてなスターに対応させてみた

[2] SuikaWikiはてなスターに対応させてみました (2008年12月16日)。

はてなアカウントとの対応付け

[3] SuikaWiki は匿名なので、アカウントとの対応は付けようがありません。 幸いはてなスターはアカウントと紐付けせずとも使えるようになっているので、 そのまま匿名で使うことにします。

☆を付ける対象

[11] SuikaWiki4 では名前 (WikiName) と頁 (WikiPage) が多対多対応になっています。 「ある名前」や「ある名前に属するある頁」には URL がありますが、「ある頁」 には URL がありません。スターを付けたい対象となり得るのはきっと「ある頁」 でしょうけど、 URL がない以上使えませんから、「ある名前」に付けることにします。

「ある名前に属するある頁」にスターをつけると、別の名前で同じ頁を見たときのスターと別になってしまいます。
「ある頁」に URL がないのは、現時点では仕様です。将来変えるかもしれませんが、 変えないかもしれません。

[12] 章や段落にも付けられた方がいいかもですが、とりあえず保留。

スクリプト内での動的な読み込み

[4] 普通ははてなスターJavaScript 実行コードを HTML 内に script タグを直接書き込んで呼び出すのでしょうが、 あまり HTML をいじりたくなかったので、既に参照するようになっている sw.js (<http://suika.fam.cx/swe/scripts/sw.js>) の中で DOM 的に script 要素を挿入する形にしました。

[5] そういう使い方は想定外のようで、文書構文解析が終わった後からはてなスタースクリプトを読み込んでも初期化が実行されなかったり (FirefoxOpera の場合 ― load が既に終わっているため)、 Ten.DOM が読み込まれた時点で中途半端な初期化が行われたり (SafariChromeWinIE の場合 ― バグ対策なのか謎のループを使っていますが、構文解析終了後は待ちなしで即実行されるため) してしまいます。仕方がないので無理矢理 dispatchEvent して初期化させています。

body 要素の entryNode 化

[6] SiteConfig では選択子を指定しますが、 Ten.Selector.getElementsBySelector の呼び出し時に使われる親要素document.body になっています。

[7] SuikaWiki の出力する HTML では頁全体が一つの記事で、 その子要素大見出しである h1 要素ナビゲーションdiv 要素があります。 その h1div題名URL やスターの container に使いたいのですが、 >>6 のため、 「body」と指定しても思ったようにはなりません。

[8] 仕方がないので、 Hatena.Star.EntryLoader.loadNewEntries を動的に書き換えて、 document.documentElement親要素に使うようにしました。

[9] でも後から気づきましたが、実は選択子空文字列にするだけでよかったみたいです。

本家 W3C選択子空文字列にできませんけどね。

onLoadFunctions

[10] Hatena.Star.onLoadFunctions という Array (最初はないので自分で用意する必要があります。) に Function を突っ込んでおくと、初期化の直前の丁度いいタイミングで呼び出してくれます。 >>4>>8 のような変な使い方をする時には便利です。