全サイトはてぶ化

元ねた:
http://d.hatena.ne.jp/kusigahama/20060307#1141708818
hb_addictの自己改修を続けていたら、このたびのリニューアルで動かなくなりました記念
で、探す。
http://worris.sakura.ne.jp/hbcview.html
を発見。
しかし自前で作ってしまっていた。。。こっちはアイコンを出せるようにしたので、気に入っている。
その場でコメント登録はできません。
ではソース。

// ==UserScript==
// @name           Hatena Bookmark For All Site
// @namespace      http://d.hatena.ne.jp/sadac/
// @description    insert ?B comment for anypage
// @include        http://*
// ==/UserScript==

(function() {

  function displayComment(response) {
    var json = eval("(" + response.responseText + ")");
    if (json.count == 0) return;
    print(json.count, json.entry_url, json.bookmarks);
  }
  
  function print(count, entry_url, bookmarks) {
    var block = document.createElement("div");
    block.setAttribute("id", "block");
    block.setAttribute("style", "background-color: white; clear: both; text-align: left; border-top: 1px solid gray; list-style-type: none; padding: 5px; margin: 0px; list-style-type: circle; list-style-position: inside; list-style-image: none; font-size: 90%; line-height: 150%;");

    var ul = document.createElement("ul");
    ul.setAttribute('id', 'bookmarkers_comments');
    block.appendChild(ul)
    
    for each (b in bookmarks) {
      if (b.comment == "") continue;
      var li = document.createElement("li");
      li.innerHTML = getEntryText(b);
      ul.insertBefore(li, ul.lastChild);
    }

    var users = document.createElement('a');
    users.setAttribute("id", "bookmarkers_count");
    users.setAttribute("href", entry_url);
    users.innerHTML = count + " users";
    ul.appendChild(users);
    
    document.body.appendChild(block);
  }
  
  function getEntryText(bookmark) {
    return getUserIcon(bookmark.user) + getUser(bookmark.user) + getTagMessage(bookmark.user, bookmark.tags) + getComment(bookmark.comment);
  }
  
  //  アイコン画像。
  function getUserIcon(user) {
    return "<a href=\"http://yagi.xrea.jp/h/" + user + "/\"><img src=\"http://www.hatena.ne.jp/users/" +
    user.substring(0, 2) + "/" + user + "/profile_s.gif\" border=\"0\" /></a> ";
  }

  //  リンクを追加。
  function getUser(user) {
    return "<a href=\"http://b.hatena.ne.jp/" + user + "/\">" + user + "</a> ";
  }
  
  //  タグのリンクを追加。フォントを小さく。
  function getTagMessage(user, tags) {
    if (tags.length == 0) return "";
    
    var tagMessage = "";
    for each (t in tags) {
      tagMessage = tagMessage + "," + "<a href=\"http://b.hatena.ne.jp/" + user + "/" + encodeURI(t) + "/\">" + t + "</a>";
    }
    return "<font size=\"1\" color=\"steelblue\">[" + tagMessage.substring(1, tagMessage.length) + "]</font> ";
  }
  
  //  http://またはhttps://で始まるURLを含む文字列を、リンクとして置換。
  function getComment(comment) {
    var matches = comment.match(/https?:\/\/[\w'.\-)(*/%]+/g);
    for each (m in matches) {
      comment = comment.replace(m, "<a href=\"" + m + "\">" + m + "</a>");
    }
    return comment;
  }

  GM_xmlhttpRequest({
    method: "GET",
    url: "http://b.hatena.ne.jp/entry/json/" + document.URL.replace(/#/,"%23"),
    onload: displayComment
  });
})();