« 失われたエントリの復旧は簡単 | Main | 完成版 HaloScan のコメント数を全部表示する »

2006年07月09日

HaloScan のコメント数を全部表示する

このブログで採用しているより障害に強い HaloScan 利用方法(参照「Thingamablog にコメントとトラックバックを付ける」)を、他のブログのエントリ「HaloScan のコメント数が改善されました」で述べた HaloScan の仕様変更に対応させてみた。

これに伴いテンプレートセット Mac_Stripe-XHTML_Strict-ja をアップデートした。

追記1
やっぱりこの試みは失敗でしたね。害はないので改良版を出すまでこのままにしておきます。

更新の動機

この度の HaloScan の仕様変更により、今までコメント数が表示されなかった古いコメントスレッドもコメント数が表示できるようになった。しかしここで採用している(そして Mac_Stripe-XHTML_Strict-ja に埋め込まれている)方法で HaloScan を利用しているとそれを享受できない。

更新内容

そこでテンプレートセットJavaScript ファイル に改良を加えた。変更点は次のとおり。

main.template
category.template
archive.template
entry.template

head 要素の中の一番最後に次を追加した。

        <script type="text/javascript"><!--
var ThreadIDs = new Array;

<BlogEntry>if (hs['entry_<$EntryID$>'] == undefined) ThreadIDs[ThreadIDs.length] = 'entry_<$EntryID$>';
</BlogEntry>
HaloScanLoad('<$HaloScanAccount$>', ThreadIDs);
// --></script>
haloscan.js

テンプレートで使用している JavaScript 関数 HaloScanLoad を定義した。定義内容は次のとおり。

function HaloScanLoad(account, threadIDs, elmt) {
 if (document.createElement && threadIDs.length > 0) {
  var scriptElmt = document.createElement('script');

  scriptElmt.src = 'http://www.haloscan.com/load/'
   + account
   + '/?c='
   + ThreadIDs.join('+');
  scriptElmt.type = 'text/javascript';
  try {
   if (!elmt) {
elmt = document.getElementByTagName('head');
elmt = elmt[0];
   }
   elmt.appendChild(scriptElmt);
  }
  catch (e) {
  }
 }
}

更新解説

http://www.haloscan.com/load/HaloScanアカウント名 によってコメント数とトラックバット数を格納した JavaScript の配列をロードするのは従来通り。その上で、そのページでコメント数が欲しい各コメントスレッドについて(テンプレートの <BlogEntry> </BlogEntry> という部分)、コメント数が取得できていないとき(テンプレートの if (hs['entry_<$EntryID$>'] == undefined) の部分)ものは、そのページでコメント数が欲しいコメントスレッドの ID として記憶する(テンプレートの ThreadIDs[ThreadIDs.length] = 'entry_<$EntryID$>' の部分)。

その記憶したコメント数が欲しいコメントスレッドの ID 達と自分の HaloScan アカウント名について HaloScan にコメント数を要求する(テンプレートの HaloScanLoad('<$HaloScanAccount$>', ThreadIDs) の部分)。

JavaScript 関数 HaloScanAccount は HaloScan に要求する URL を生成し、それをロードするコードを head 要素の一番後ろに加えるようになっている。

この関数が実行されるときには head 要素はまだ読み終わっていないので、ブラウザは head 要素の終端(</head>)を読む直前に HaloScanAccount によって追加されたコードを解釈する。

以上によりページの body 要素の解釈が始まる前に全ての必要なコメントスレッドのコメント数が(もしあれば)ロードされるというようになっている。

  • Posted by OKAMURA at 18時27分
  • Edited on: 2006年07月15日 08時12分
  • Categories: 工夫, 配布