HatebuComment on LDR

By ABCbo Last update Jul 27, 2009 — Installed 578 times. Daily Installs: 0, 0, 1, 0, 0, 1, 0, 1, 0, 8, 2, 2, 2, 3, 3, 2, 4, 2, 2, 7, 3, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2

There are 8 previous versions of this script.

// ==UserScript==
// @name           HatebuComment on LDR
// @namespace      http://d.hatena.ne.jp/ABCbo/
// @include        http://reader.livedoor.com/reader/
// ==/UserScript==

(function() {
	var w = unsafeWindow;
	with(w) {
		//はてブ数を表示
		register_hook('before_printfeed', function(feed) {
			var items = feed.items;
			for (var i = 0; i < items.length; i++) {
				var item = items[i];
				var link = item.link.replace(/#/g,'%23');
				if (!item.author.match(/hatebu_count/)) {
					var hatebu_count = '&nbsp;<span class="hatebu_count"><a href="http://b.hatena.ne.jp/entry/' + link + '">'
						+ '<img style="border:none;" src="http://b.hatena.ne.jp/entry/image/' + link + '"></a><span class="hatebu_get_comment" title="コメント表示">▼</span></span><span class="hatebu_get_comment" title="コメント表示" style="display:none;">▼</span>';
					item.author = item.author + hatebu_count;
				}
			}
		});
		//コメント取得(マウス)
		register_hook('AFTER_PRINTFEED', function() {
			var hist = [];
			var isComp = function(){
				var len = hist.length;
				if(len < 3) return false;
				return hist[len-1] == hist[len-2] && hist[len-2] == hist[len-3];
			}
			var addEvent = function() {
				var elems = document.evaluate('//span[@class="hatebu_get_comment"]', document, null, 7, null);
				for (var i = 0; i < elems.snapshotLength; i++) {
					elems.snapshotItem(i).addEventListener('click', function() {
						var item = get_active_item(true);
						hatebu = $('hatebu_' + item.offset);
						if (hatebu) {
							toggleComment(hatebu, item.offset);
						} else {
							getComment(item);
						}
					}, false);
				}
				
			}
			isComp() || setTimeout(addEvent, 1000);
		});
		//コメント取得(キーボード)
		register_hook('after_init', function() {
			Keybind.add('m', function() {
				var item = get_active_item(true);
				hatebu = $('hatebu_' + item.offset);
				if (hatebu) {
					toggleComment(hatebu, item.offset);
				} else {
					getComment(item);
				}
			});
		});
		
		function getComment(item) {
			var url = 'http://b.hatena.ne.jp/entry/json/?url=' + escape(item.link.replace(/&amp;/g, '&')) + '&callback=appendComments';
			var jsonp = document.createElement('script');
			jsonp.src = url;
			jsonp.onload = function() {
				message('読み込み完了');
				document.body.removeChild(jsonp);
			};
			message('コメント読み込み中...');
			document.body.appendChild(jsonp);
			toggleArrow(item.offset);
		}

		//コールバック関数
		w.appendComments = function(json) {
			//コメント挿入用の要素を作成
			var item = get_active_item(true);
			var parent = document.getElementById('item_count_' + item.offset);
			//var elem = document.evaluate('//div[@id="item_count_' + item.offset + '"]/div[@class="item_footer"]', document, null, 
			var elem = document.evaluate('//div[@id="item_count_' + item.offset + '"]//span[@class="hatebu_count"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
			var ul = document.createElement('ul');
			ul.className = 'hatebu';
			ul.id = 'hatebu_' + item.offset;
			//parent.insertBefore(ul, elem.snapshotItem(0));
			elem.snapshotItem(0).appendChild(ul);

			//レスポンスの処理
			var bm = json.bookmarks;
			for (i = 0,j = 0; i < bm.length; i++) {
				var user = bm[i];
				var name = user.user;
				if (user.comment.length > 0) {
					var date = getDate(user.timestamp);
					var Date = date.replace(/^(....)(..)(..)/, "($1/$2/$3)");
					var li = document.createElement('li');
					if (j == 0) {
						li.className = 'line_one';
						j++;
					}
					li.innerHTML
						= '<span class="date">' + Date + '</span>'
						+ ' <img src="http://www.hatena.ne.jp/users/' + name.substring(0,2) + '/' + name + '/profile_s.gif">'
						+ ' <a href="http://b.hatena.ne.jp/' + name + '/' + date + '#bookmark-' + json.eid + '">' + name + '</a>'
						+ ' <span class="tags">'
						+ user.tags.map(function(x){ return '<a href="http://b.hatena.ne.jp/'+name+'/'+x+'/">'+x+'</a>' }).join(', ')
						+ '</span> ' + user.comment;
					var place = $('hatebu_' + item.offset);
					place.appendChild(li);
					Control.scroll_to_px(place.parentNode.parentNode.parentNode.parentNode.offsetTop + 2);
				}
			}
			//コメントしたユーザーがいなかった場合
			if (i == bm.length && j == 0) {
				var li = document.createElement('li');
				li.className = 'line_one';
				li.innerHTML = "No Comment.";
				var place = $('hatebu_' + item.offset);
				place.appendChild(li);
				Control.scroll_to_px(place.parentNode.parentNode.parentNode.parentNode.offsetTop + 2);
			}
		}//appendComment
		
		function toggleComment(ele, offset) {
			if (ele.style.display != 'none') {
				ele.style.display = 'none';
				toggleArrow(offset);
			} else {
				ele.style.display = '';
				toggleArrow(offset);
			}
			Control.scroll_to_px(ele.parentNode.parentNode.parentNode.parentNode.offsetTop + 2);
		}
		//矢印切り替え
		function toggleArrow(offset) {
			var elems = document.evaluate('//div[@id="item_count_' + offset + '"]//span[@class="hatebu_get_comment"]', document, null, 7, null);
			for (var i = 0,elem; elem = elems.snapshotItem(i); i++) {
				if (elem.title == 'コメント表示') {
					elem.innerHTML = '▲';
					elem.title = 'コメントを隠す';
					elem.style.display = 'inline';
				} else {
					elem.innerHTML = '▼';
					elem.title = 'コメント表示';
					if (i == 1) {
						elem.style.display = 'none';
					}
				}
			}
		}
	
		var style = document.createElement('style');
		style.innerHTML
			= '.hatebu {border-top:1px dashed LightGray; border-bottom:1px dashed LightGray; list-style-type:circle; background-color:#EDF1FD;}'
			+ '.hatebu li {margin-bottom: 3px; border-top:1px dotted LightGray;}'
			+ '.line_one {border:none !important;}'
			+ '.hatebu span.tags a {font-size: 85%; color:RoyalBlue; text-decoration:none;}'
			+ '.date {font-size: 85%; color:Gray;}'
			+ '.hatebu_get_comment {cursor: pointer !important; font-size: 13px;}'
			+ '.hatebu_count {font-size: 13px;}';
		document.body.appendChild(style);
	}//with(w)

	function getDate(timestamp) {
		var date = new Date(timestamp);
		var y = date.getFullYear();
		var m = date.getMonth() + 1;
		var d = date.getDate();
		if (m < 10) m = "0" + m;
		if (d < 10) d = "0" + d;
		return y.toString() + m.toString() + d.toString();
	}
})();