Hatena::ブログ(Diary)

明日とロボット このページをアンテナに追加 RSSフィード

2011-06-23

Greasemonkeyで、はてなダイアリーから直接はてなグループキーワード編集

はてなグループキーワードにリンクを張る

はてなダイアリーを使っていて、自分の日記だけでしか使わないようなキーワードにもリンクを張りたい場合、はてなグループを作成しグループキーワードにリンクを張れるようになる。
手順は以下

  • はてなグループで適当にグループを作る。
  • そこで適当にキーワードを登録すれば、グループ内のみでのキーワードを作れる。
  • その後、はてなダイアリーの設定画面から、記事の設定で、「はてなグループの登録キーワード」という項目に作成したグループのidを登録する。
  • すると、はてなダイアリーで書いた日記からも、グループキーワードにリンクが張られるようになる。

はてなダイアリーから直接グループキーワードを編集できるようにする。

通常、はてなダイアリーでキーワードを記事内で書いて新規登録しようと思った場合、はてなダイアリーのキーワード作成画面に飛ぶ。よって、グループキーワードを編集したいのであれば、一段階余分なステップを踏むことになる。それが面倒なので、簡単なJava scriptを書いてGreasemonkeyに登録し、自動化する。
コードは以下のよう

// ==UserScript==
// @name           hatenaGroupKeywordEdit
// @namespace      http://d.hatena.ne.jp/astrobot/
// @description    To directly edit hatena group keyword from a main hatena diary
// @author         astrobot
// @include        http://d.hatena.ne.jp/astrobot/*
// ==/UserScript==

(function () {
	var aTags = document.getElementsByTagName('a');
	for (var i in aTags) {
		var href = String(aTags[i].href);
		if (href.match(/d\.hatena\.ne\.jp\/keyword\/(.*)\?mode\=edit/)) {
			href = href.replace(/d\.hatena\.ne\.jp/g,'astrobot.g.hatena.ne.jp');
			aTags[i].href = href;
		}
	}
})();
  • includeに自分のはてなダイアリーのベースアドレスを入力
  • aTagsを取得し、その中からhrefラベル下の値を文字列変数に入力
  • その文字列変数内で、正規表現でキーワード編集画面のリンクかどうかを判断。
  • そうであれば、URLをグループキーワード編集のものに置き換えて上書き

ブラウザにgracemonkeyをインストールしていれば、上記のjava scriptをブラウザにドラッグアンドドロップするだけで簡単に登録できる。

追記

上のコードは日本語キーワードで使えてなかった。
URLエンコードで問題が起こってたっぽい。
var href = String(aTags[i].href);
で取り込んだ時点で日本語キーワードは勝手にEUC-JPでエンコードされてたらしく、はてなはUTF-8でエンコードしたキーワードをURLに使ってるためそこが問題。
だから必要なことは

  1. EUC-JPからのデコード
  2. UTF-8へのエンコード

後者はJavaScriptが用意するencodeURI()を使えば一瞬だけど、前者は無理。
ってわけでこちらより改良版ecl.js (Escape Codec Library)という既存ライブラリを借りることに。
GreaseMonkeyで外部ライブラリを参照する際は、@require URLとするだけ。
勝手にfirefoxのgm_scripts下のディレクトリにダウンロードしてくれる。
で、無事完成。
コードは以下

// ==UserScript==
// @name           hatenaGroupKeywordEdit
// @namespace      http://d.hatena.ne.jp/astrobot/
// @description    To directly edit hatena group keyword from a main hatena diary
// @author         astrobot
// @include        http://d.hatena.ne.jp/astrobot/*
// @require	       http://www.drk7.jp/pub/js/ecl_test/ecl_new.js
// ==/UserScript==

(function () {
	var aTags = document.getElementsByTagName('a');
	for (var i in aTags) {
		var groupURL = 'http://astrobot.g.hatena.ne.jp/keyword/'
		var href = String(aTags[i].href);
		if (href.match(/d\.hatena\.ne\.jp\/keyword\/(.*)\?mode\=edit/)) {
			var str = encodeURI(UnescapeEUCJP(RegExp.$1));
			groupURL+=str;
			groupURL+='?mode=edit';
			aTags[i].href = groupURL;
		}
	}
})();