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 = ' <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(/&/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();
}
})();
