2011-02-02
Togetterフィルターを手直ししてみた
http://d.hatena.ne.jp/mEGGrim/20101019/1287684499 が元ネタ
// ==UserScript== // @name TogetterFilter // @namespace TogetterFilter // @description Togetterを任意のユーザー名を用いてフィルタリング // @include http://togetter.com/* // ==/UserScript== // ここにフィルタリングしたいユーザーのIDを''で囲い、,で区切って記述して下さい var blackListArray = ['carejinzaibank', 'ptotjinzaibank', 'nursejinzaibank']; var blackList = new RegExp('^(?:' + blackListArray.join('|') + ')$', 'g'); // AutoPagerizeで増えた分ではない、1ページ目のフィルタリング filter(document); // AutoPagerizeにfilterをイベントとして追加 // 要AutoPagerize(version 0.40 以降)、jAutoPagerize(Rev: 33889+ 以降) // 参考URL: http://d.hatena.ne.jp/os0x/20090829/1251556449 document.body.addEventListener('AutoPagerize_DOMNodeInserted',function(evt){ var node = evt.target; filter(node); }, false); function filter(node) { if(document.URL.match(/^http:\/\/togetter\.com\/li\/\d+/)) { filterTweets(node); } else { filterLists(node); } } function filterTweets(node) { //各まとめページの発言をフィルタリング column = document.evaluate( '//div[@class="list_body"]/div[@class="status"]/a[starts-with(@href, "http://twitter.com")]', node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); for (var i = 0; i < column.snapshotLength; i++) { thisLink = column.snapshotItem(i); if(thisLink.innerHTML.match(blackList)) { //display = 'none'にしてフィルタリング // thisLink.parentNode.parentNode.parentNode.parentNode.style.display = 'none'; thisLink.parentNode.parentNode.parentNode.parentNode.style.opacity = 0.1; } } // コメント欄をフィルタリング column = document.evaluate( '//div[@class="status"]/a[@class="twttrname"]', node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); for (var i = 0; i < column.snapshotLength; i++) { thisLink = column.snapshotItem(i); if(thisLink.innerHTML.match(blackList)) { //display = 'none'にしてフィルタリング // thisLink.parentNode.parentNode.parentNode.parentNode.style.display = 'none'; thisLink.parentNode.parentNode.parentNode.parentNode.style.opacity = 0.1; } } } function filterLists(node) { column = document.evaluate( //*のtwitterまとめ, でまとめ主のIDを検索してフィルタリング // "/html/body/div/div[3]/div/div/div/ul/li/div/div[2]/div/a", '//div[@class="info_infomation"]/a[contains(concat(" ", @class, " "), " icon_author ")]', node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); for (var i = 0; i < column.snapshotLength; i++) { thisLink = column.snapshotItem(i); if(thisLink.innerHTML.match(blackList)) { //display = 'none'にしてフィルタリング // thisLink.parentNode.parentNode.parentNode.parentNode.style.display = 'none'; thisLink.parentNode.parentNode.parentNode.parentNode.style.opacity = 0.1; } } }
display = 'none';だとフィルターが動いてるかどうかが実感できないので透明度10%でうっすら表示にしてみた。
XPathつかってるところはQuerySelectorに書き換えればもうすこしスッキリするかもなぁ。
インストールは https://gist.github.com/raw/807319/92717e85c5260f6bd001a3af3448710ca7d52c10/togetterfilter.user.js で
追記
querySelectorで書きなおした
// ==UserScript== // @name TogetterFilter // @namespace TogetterFilter // @description Togetterを任意のユーザー名を用いてフィルタリング // @include http://togetter.com/* // ==/UserScript== // ここにフィルタリングしたいユーザーのIDを''で囲い、,で区切って記述して下さい var blackListArray = ['carejinzaibank', 'ptotjinzaibank', 'nursejinzaibank']; var blackList = new RegExp('^(?:' + blackListArray.join('|') + ')$', 'g'); // AutoPagerizeで増えた分ではない、1ページ目のフィルタリング filter(document); // AutoPagerizeにfilterをイベントとして追加 // 要AutoPagerize(version 0.40 以降)、jAutoPagerize(Rev: 33889+ 以降) // 参考URL: http://d.hatena.ne.jp/os0x/20090829/1251556449 document.body.addEventListener('AutoPagerize_DOMNodeInserted',function(evt){ var node = evt.target; filter(node); }, false); function filter(node) { if(document.URL.match(/^http:\/\/togetter\.com\/li\/\d+/)) { filterTweets(node); } else { filterLists(node); } } function filterTweets(node) { //各まとめページの発言をフィルタリング var items = document.querySelectorAll( 'div.list_body > div.status > a[href^="http://twitter.com"]' ); for (var i = 0; i < items.length; i++) { var thisLink = items[i]; if(thisLink.innerHTML.match(blackList)) { gone(thisLink); } } // コメント欄をフィルタリング var items = document.querySelectorAll( 'div.status > a.twttrname' ); for (var i = 0; i < items.length; i++) { var thisLink = items[i]; if(thisLink.innerHTML.match(blackList)) { gone(thisLink); } } } function filterLists(node) { var items = document.querySelectorAll( 'div.info_infomation > a.icon_author' ); for (var i = 0; i < items.length; i++) { var thisLink = items[i]; if(thisLink.innerHTML.match(blackList)) { gone(thisLink); } } } function gone(item){ //display = 'none'にしてフィルタリング // item.parentNode.parentNode.parentNode.parentNode.style.display = 'none'; item.parentNode.parentNode.parentNode.parentNode.style.opacity = 0.1; }
追記
https://gist.github.com/807644 にでforkリファクタリング版があります
コメント
トラックバック - http://subtech.g.hatena.ne.jp/otsune/20110202
