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