del.icio.us Helper

del.icio.us にキーショートカットを追加する GreaseMonkey スクリプトの update。選択中のポストにフォーカスを当てるようにして o キーでポストを開くようにしてみた。ポップアップブロックしていると開けません。o ではなくて Enter で選択中のリンク先が開けばブロックしていても大丈夫。あと、ページ最後のあたりのポストに正しく移動できるように適当な余白をページ下部に追加されるように del.icio.us 用の css を変更しておくと良いかも。

  • p : 前のポストへ
  • n : 次のポストへ
  • o : 現在のポストを開く
// ==UserScript==
// @name           del.icio.us Helper
// @namespace      http://null.dev/
// @include        http://del.icio.us/*
// ==/UserScript==

(function () {
	var TOP_MARGINE = 0;
	var posts;
	var post; // 現在のフォーカスポスト
	var keyMap;
	var marginTop;
	var w = unsafeWindow;
	var _onload = w.onload;

	w.onload = function() {
		if (_onload) _onload();
		onload();
	}

	var onload = function () {
		InitTags();
		InitShortCuts();
	}
		
	function InitTags() {
	    posts = new Array();
		var lis = document.getElementsByTagName("li");
		for (var k=0; k<lis.length; k++) {
			if (lis[k].className == "post") {
				posts.push(lis[k]);
			}
		}

		marginTop = document.getElementsByTagName("body")[0].childNodes[1].offsetTop;
	}

	function InitShortCuts() {
		keyMap = new Array();
		keyMap["p".charCodeAt(0)] = FindPrevious;
		keyMap["n".charCodeAt(0)] = FindNext;
		keyMap["o".charCodeAt(0)] = OpenEntry;
		
		document.addEventListener("keypress", HandleKeyEvent, false); 
	}
		
	function HandleKeyEvent(event) {
		var charCode = event.which;
		var handler = keyMap[charCode];
		if (handler) handler(event);
	}
	
	function GetOffsetTop(source) {	
		return (source.offsetParent) ? GetOffsetTop(source.offsetParent) + source.offsetTop : source.offsetTop;
	}
	
	function FindPrevious(event) {
		var pos = pageYOffset + TOP_MARGINE;
		post = posts[0];
		for (var i=0; i<posts.length; i++) {
			if (GetOffsetTop(posts[i]) >= pos) {
			    post.scrollIntoView(true);
			    post.childNodes[1].firstChild.focus();
				break;
			}
			post = posts[i];
		}
	}

	function FindNext(event) {
		var pos = pageYOffset + TOP_MARGINE;
		post = posts[0];
		for (var i=0; i<posts.length; i++) {
			post = posts[i];
			if (GetOffsetTop(posts[i]) > pos) {
			    post.scrollIntoView(true);
			    post.childNodes[1].firstChild.focus();
				break;
			}
		}
	}
	
	function OpenEntry(event) {
		if (post != null) {
			var href = post.childNodes[1].firstChild.getAttribute("href");
			window.open(href);
		}
	}
})();
div#bottom
{ height: 500px !important; }