はてなキーワード: seahorseとは
はてなブックマークのhotentry(ホッテントリとかホットエントリーとか言う奴です)
をよく見るんだけど、もっと便利に見る方法ないですかね?
今は、
http://b.hatena.ne.jp/hotentry
をFirefoxでタブで開きっぱなしにしてたまにチェックする感じです。
以前にその場でブクマコメントが展開できたりするgreasemonkeyだか、seahorseだか
合ったような気がするが、失念してしまった。
そのほか、「RSS経由でさらに便利に見ているよ」「流行のtumblrでゴニョゴニョ」とかそういう人いませんか?
よかったら教えてほしいです。
http://anond.hatelabo.jp/20080302214727
「ネタ」がうまくいかない件は、"\u30cd\u30bf"にしたらうまく行った
とりあえず、Sleipnir2のSeahorseで確認。
// ==UserScript== // @name hatebufilter // @namespace hatebufilter // @description Hatena bookmark filter // @include http://b.hatena.ne.jp/hotentry* // @include http://b.hatena.ne.jp/entrylist* // ==/UserScript== /* 問題点 いまのところなし ・問題が起こりそうなURL http://b.hatena.ne.jp/hotentry?mode=daily&date=20080224 http://b.hatena.ne.jp/hotentry?mode=daily&date=20080218 **/ (function(){ // Hatebu Tag var HatebuTagParentNum = 3; var filters = [ // moconico douga {"tag": "div", "name": "entry", "pattern": "nicovideo\.jp"}, /* // tag of "2ch" {"tag": "a", "name": "tag", "pattern": "2ch", "parentNum": HatebuTagParentNum}, {"tag": "a", "name": "tag", "pattern": "\\*2ch", "parentNum": HatebuTagParentNum}, **/ // 2ch blogs // livedoor {"tag": "div", "name": "entry", "pattern": /http:\/\/blog\.livedoor\.jp\/(insidears|dqnplus)\//}, {"tag": "div", "name": "entry", "pattern": /http:\/\/(guideline|alfalfa|news4vip)\.livedoor\.biz\//}, // fc2 {"tag": "div", "name": "entry", "pattern": /http:\/\/(imihu|urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//}, {"tag": "div", "name": "entry", "pattern": /http:\/\/www\.kajisoku\.org\//}, // hatena anonymouse diary {"tag": "div", "name": "entry", "pattern": /http:\/\/anond\.hatelabo\.jp\//}, // tag of "neta" {"tag": "a", "name": "tag", "pattern": "\u30cd\u30bf", "parentNum": HatebuTagParentNum}, {"tag": "a", "name": "tag", "pattern": "\\*\u30cd\u30bf", "parentNum": HatebuTagParentNum}, ]; for (var i = 0; i < filters.length; i++) { var f = filters[i]; filtering(f.tag, f.name, f.pattern, f.parentNum== undefined ? 1 : f.parentNum); } function filtering(tag, name, pattern, parentNodeNum){ var entrylist = document.getElementsByTagName(tag); //print("pattern = " + pattern); for(var idx = entrylist.length - 1; 0 <= idx; idx--){ // for(var idx = 0; idx < entrylist.length - 1; idx++){ if (entrylist[idx].className == name){ if (entrylist[idx].innerHTML.match(pattern)) { var node = entrylist[idx]; var oldNode = null; for (var j = 0; j < parentNodeNum; j++) { oldNode = node; node = node.parentNode; } // print("class = " + oldNode.getAttribute("class")); // print("id = " + oldNode.getAttribute("id")); node.removeChild(oldNode); } } } } })();
firefoxでしか確認していないけれど、URL、正規表現、XPathで指定できる様にしてみたよ。
// ==UserScript== // @name filter for Hatena::Bookmark // @namespace http://anond.hatelabo.jp/ // @include http://b.hatena.ne.jp/hotentry* // @include http://b.hatena.ne.jp/entrylist* // origin http://anond.hatelabo.jp/20080302214727 // ==/UserScript== (function(){ var itemxpath = "//div[@class='entry']"; function xpathgenURL(url) {return "//div[@class='entry' and descendant::a[starts-with(@href,'"+url+"')]]"} var filters = [ // start with '//' then xpath // moconico douga // {"tag": "div", "name": "entry", "pattern": "nicovideo\.jp"}, "//div[@class='entry' and descendant::a[contains(@href,'nicovideo.jp')]]", /* // tag of "2ch" {"tag": "a", "name": "tag", "pattern": "2ch", "parentNum": HatebuTagParentNum}, {"tag": "a", "name": "tag", "pattern": "\\*2ch", "parentNum": HatebuTagParentNum}, ***/ // start with 'http' then url // 2ch blogs // livedoor // {"tag": "div", "name": "entry", // "pattern": /http:\/\/blog\.livedoor\.jp\/(insidears|dqnplus)\//}, "http://blog.livedoor.jp/insidears/", "http://blog.livedoor.jp/dqnplus/", // {"tag": "div", "name": "entry", // "pattern": /http:\/\/(guideline|alfalfa|news4vip)\.livedoor\.biz\//}, "http://guideline.livedoor.biz/", "http://alfalfa.livedoor.biz/", "http://news4vip.livedoor.biz/", // typeof /regexp/ is function (@firefox) then regexp pattern // fc2 // {"tag": "div", "name": "entry", // "pattern": /http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//}, /http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//, // tag of "neta" // {"tag": "a", "name": "tag", "pattern": "ネタ", "parentNum": HatebuTagParentNum}, "//div[@class='entry' and descendant::a[@class='tag' and string()='ネタ']]", // {"tag": "a", "name": "tag", "pattern": "*ネタ", "parentNum": HatebuTagParentNum}, "//div[@class='entry' and descendant::a[@class='tag' and string()='*ネタ']]", // hatena anonymouse diary // {"tag": "div", "name": "entry", "pattern": /http:\/\/anond\.hatelabo\.jp\//} "http://anond.hatelabo.jp/", ]; for (var i=0; i<filters.length; i++) { var filter = filters[i]; var type = typeof filter; var regexp; var xpath; if (type == "function") { xpath = itemxpath; regexp = filter; } else if (type == "string") { if (filter.match(/^http/)) { xpath = xpathgenURL(filter); } else if (filter.match(/^\/\//)) { xpath = filter; } else { next; } } var removeNodes = document.evaluate(xpath,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var j=0; j<removeNodes.snapshotLength; j++) { var node = removeNodes.snapshotItem(j); if (!regexp || node.innerHTML.match(regexp)) { node.parentNode.removeChild(node); } } } })();
ついでに増田版も作ってみたよ。
// ==UserScript== // @name filter for Hatelabo::AnonymousDiary // @namespace http://anond.hatelabo.jp/ // @include http://anond.hatelabo.jp/ // @include http://anond.hatelabo.jp/*?page=* // @exclude http://anond.hatelabo.jp/YourID/* // ==/UserScript== // origin http://anond.hatelabo.jp/20080302214727 (function(){ var itemxpath = "//div[@class='section']"; function xpathgenURL(url) {return "//div[@class='section' and descendant::a[starts-with(@href,'"+url+"')]]"} var filters = [ // start with '//' then xpath "//div[@class='section' and child::h3[starts-with(string(),'■はてなの嫌われ者!')]]", // start with 'http' then url "http://anond.hatelabo.jp/", // typeof /regexp/ is function (@firefox) then regexp pattern /釣り/, ]; for (var i=0; i<filters.length; i++) { var filter = filters[i]; var type = typeof filter; var regexp; var xpath; if (type == "function") { xpath = itemxpath; regexp = filter; } else if (type == "string") { if (filter.match(/^http/)) { xpath = xpathgenURL(filter); } else if (filter.match(/^\/\//)) { xpath = filter; } else { next; } } var removeNodes = document.evaluate(xpath,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var j=0; j<removeNodes.snapshotLength; j++) { var node = removeNodes.snapshotItem(j); if (!regexp || node.innerHTML.match(regexp)) { node.parentNode.removeChild(node); } } } })();
こんなときのXPathじゃまいか。といってみる。
http://anond.hatelabo.jp/20080102122736
汎用性を上げてみた。
をはてブのhotentryから削除するgreasemonkey。
Sleipnir2のseahorseでも使える。
// ==UserScript== // @name hatebufilter // @namespace hatebufilter // @description Hatena bookmark filter // @include http://b.hatena.ne.jp/hotentry* // @include http://b.hatena.ne.jp/entrylist* // ==/UserScript== /* 問題点 いまのところなし ・問題が起こりそうなURL http://b.hatena.ne.jp/hotentry?mode=daily&date=20080224 http://b.hatena.ne.jp/hotentry?mode=daily&date=20080218 **/ (function(){ // Hatebu Tag var HatebuTagParentNum = 3; var filters = [ // moconico douga {"tag": "div", "name": "entry", "pattern": "nicovideo\.jp"}, /* // tag of "2ch" {"tag": "a", "name": "tag", "pattern": "2ch", "parentNum": HatebuTagParentNum}, {"tag": "a", "name": "tag", "pattern": "\\*2ch", "parentNum": HatebuTagParentNum}, **/ // 2ch blogs // livedoor {"tag": "div", "name": "entry", "pattern": /http:\/\/blog\.livedoor\.jp\/(insidears|dqnplus)\//}, {"tag": "div", "name": "entry", "pattern": /http:\/\/(guideline|alfalfa|news4vip)\.livedoor\.biz\//}, // fc2 {"tag": "div", "name": "entry", "pattern": /http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//}, // tag of "neta" {"tag": "a", "name": "tag", "pattern": "ネタ", "parentNum": HatebuTagParentNum}, {"tag": "a", "name": "tag", "pattern": "*ネタ", "parentNum": HatebuTagParentNum}, // hatena anonymouse diary {"tag": "div", "name": "entry", "pattern": /http:\/\/anond\.hatelabo\.jp\//} ]; for (var i = 0; i < filters.length; i++) { var f = filters[i]; filtering(f.tag, f.name, f.pattern, f.parentNum== undefined ? 1 : f.parentNum); } function filtering(tag, name, pattern, parentNodeNum){ var entrylist = document.getElementsByTagName(tag); //print("pattern = " + pattern); for(var idx = entrylist.length - 1; 0 <= idx; idx--){ // for(var idx = 0; idx < entrylist.length - 1; idx++){ if (entrylist[idx].className == name){ if (entrylist[idx].innerHTML.match(pattern)) { var node = entrylist[idx]; var oldNode = null; for (var j = 0; j < parentNodeNum; j++) { oldNode = node; node = node.parentNode; } // print("class = " + oldNode.getAttribute("class")); // print("id = " + oldNode.getAttribute("id")); node.removeChild(oldNode); } } } } })();
hatebufilter.user.jsなどとUTF-8で保存して使う。
しかし、増田のコード記法、日本語貼り付けたら化けるんだが・・・どうすればいいんだろ?
コメントアウトを直せば、2chコピペブログ以外の「2ch」タグ自体での削除も可能です。
// ==UserScript== // @name はてなハイク // @description NGID・NGKW・NGWORD // @include http://h.hatena.ne.jp/* // ==/UserScript== // 以下でNG指定. NG判定は完全一致ではなく部分一致. // NGID → エントリ(真ん中)やUsers/StarFriends(左側)が対象 ni=new Array('hatenahaiku'); // NGキーワード → エントリ(真ん中)やStarFriends(左側)、Keywordバー(右側)が対象 nk=new Array('アダルトビデオにありそうなタイトル'); // NGワード → エントリ(真ん中)が対象 //nw=new Array('うんこ'); // NGID エントリあぼーん a=document.getElementById('main').getElementsByTagName('a');for(i=0;i<a.length;i++)for(j=0;j<ni.length;j++)if(a[i].href.indexOf(ni[j])>-1){p=a[i].parentNode.parentNode.parentNode.parentNode;if(p.className=='entry')p.style.display='none';} // NGID Users/StarFriendsあぼーん a=document.getElementById('leftbar').getElementsByTagName('a');for(i=0;i<a.length;i++)for(j=0;j<ni.length;j++)if(a[i].href.indexOf(ni[j])>-1){p=a[i].parentNode;if(p.tagName.toUpperCase()=='LI')p.style.display='none';p=a[i].parentNode.parentNode;if(p.className=='userkeyword')p.style.display='none';} // NGキーワード エントリあぼーん a=document.getElementById('main').getElementsByTagName('a');for(i=0;i<a.length;i++)for(j=0;j<nk.length;j++)if(a[i].innerHTML.indexOf(nk[j])>-1){p=a[i].parentNode.parentNode.parentNode;if(p.className=='entry')p.style.display='none';} // NGキーワード StarFriendsあぼーん a=document.getElementById('leftbar').getElementsByTagName('a');for(i=0;i<a.length;i++)for(j=0;j<nk.length;j++)if(a[i].innerHTML.indexOf(nk[j])>-1){p=a[i].parentNode.parentNode.parentNode;if(p.className=='userkeyword')p.style.display='none';} // NGキーワード HotKeyword/RelatedKeywordあぼーん a=document.getElementById('rightbar').getElementsByTagName('a');for(i=0;i<a.length;i++)for(j=0;j<nk.length;j++)if(a[i].innerHTML.indexOf(nk[j])>-1){p=a[i].parentNode;if(p.tagName.toUpperCase()=="LI")p.style.display='none';} // NGワード エントリあぼーん //a=document.getElementById('main').getElementsByTagName('div');for(i=0;i<a.length;i++)for(j=0;j<nw.length;j++)if(a[i].className=='body')if(a[i].innerHTML.indexOf(nw[j])>-1){p=a[i].parentNode.parentNode;if(p.className=='entry')p.style.display='none';}