2006-10-14

Google Reader に「はてなブックマーク」するショートカットを追加する Greasemonkey

[注:2006-10-29] アップデートしました。10/29 以前に greader-sbm.user.js をインストールされた方は、アップデートをお願いします。

ヒビノキロクさんが、Google Readerはてなブックマークを連携させる Greasemonkey スクリプトを公開された。「b」キーで閲覧中の記事をはてなブックマークにブックマークする (正確には、ブックマーク用の画面を別ウィンドウで開く)。とっても便利。

さて、ぼくははてなブックマークの他に livedoor clip も愛用している。こちらにもワン・キーでブックマークできると嬉しい。というわけで

  1. b キーで、はてなブックマーク
  2. B キーで、livedoor clip

する拡張版 Greasemonkey を書いた。

ソースはこんな感じ。

// ==UserScript==
// @name          Google Reader - Social Bookmark
// @namespace     http://at-aka.blogspot.com/
// @description   Add shortcut keys 'b' for bookmarking Hatena Bookmark and 'B' for livedoor clip.
// @include       http://www.google.com/reader/*
// @include       https://www.google.com/reader/*
// @include       http://reader.google.com/*
// @include       https://reader.google.com/*
// ==/UserScript==

var entry = new Array();

function greader_get_title_and_url ()
{
  var current_entry = document.getElementById('current-entry');
  var a = current_entry.getElementsByTagName('a')[0];
  var h2 = current_entry.getElementsByTagName('h2')[0];
  var title = '';
  if (h2.firstChild == a) {
    title = a.firstChild.textContent;
  } else {
    title = h2.textContent;
  }
  entry['title'] = encodeURIComponent(title);
  entry['url']   = encodeURIComponent(a.href);
}

function greader_open_link (link)
{
  window.open(link);
  // if you prefer to open a tab in background, you can use this alternative.
  // GM_openInTab(link);
}

function greader_hatena_bookmark () {
  var b_hatena = 'http://b.hatena.ne.jp/add?mode=confirm&is_bm=1';
  var link = b_hatena + '&title=' + entry['title'] + '&url=' + entry['url'];
  greader_open_link(link);
}

function greader_livedoor_clip ()
{
  var livedoor_clip = 'http://clip.livedoor.com/clip/add?';
  var link = livedoor_clip + 'title=' + entry['title'] + '&link=' + entry['url'];
  greader_open_link(link);
}

function greader_delicious ()
{
  var delicious = 'http://del.icio.us/post?v=4';
  var link = delicious + ';title=' + entry['title'] + ';url=' + entry['url'];
  greader_open_link(link);
}

function GRT_key(event)
{
  var element = event.target;
  elementName = element.nodeName.toLowerCase();
  var typing = false;
  if (elementName == "input") {
    typing = (element.type == "text" || element.type == "password");
  } else {
    typing = (elementName == "textarea");
  }
  if (typing) return true;
  var key = String.fromCharCode(event.which);
  if ((key == "B" || key == "b") && !event.ctrlKey && !event.altKey) {
    greader_get_title_and_url();
    if (key == "B"){
      greader_livedoor_clip();
    } else { // "b"
      greader_hatena_bookmark();
    }
    try {
      event.preventDefault();
    } catch (e) {
    }
    return false;
  }
  return true;
}

document.addEventListener("keypress", GRT_key, false);

こんなことを書いてると、del.icio.us にも対応したいという人があるでせう。そんな人の為に、greader_delicous という関数を用意しておいた。関数 GRT_key の中で greader_hatena_bookmark(); を見付けて greader_delicious(); に書き換えると、b キーで del.icio.us にブックマークできるようになる。

それ以外のソーシャル・ブックマーク・サービスを使う場合は、次のコードを雛型に自分用のブックマーク関数を作られたし。

function greader_hatena_bookmark () {
  var b_hatena = 'http://b.hatena.ne.jp/add?mode=confirm&is_bm=1';
  var link = b_hatena + '&title=' + entry['title'] + '&url=' + entry['url'];
  greader_open_link(link);
}

そして、上の greader_delicious と同じ要領で GRT_key を書き換える。

本当は、もっと簡単にソーシャル・ブックマーク・サービスの切り替えが出来ればいいんだけどねぇ。よいアイデアがあればコメント下さい。

2 comments:

  1. 細かい話ですが、 greader_delicious() のとこ、s/livedoor_clip/delicious/ ですね。

    ReplyDelete
  2. おっしゃる通りです。ご指摘ありがとうございます。
    ブログ、user script ともに、修正致しました m(_ _)m

    ReplyDelete