tumblrで特定のポストを隠すGreasemonkeyスクリプト(A smart dashboard is mineの改造)
自分のポストを隠すスクリプトならA smart dashboard is_mine | Userstyles.orgがある。自分のポストかどうかの判定をXPathで行っているので、それだったらテキストとしてxxxx reblogged youと表示される、“自分のポストから直接リブログされたポスト”を隠すことも出来るのではないかと考えた。
それを実現するための格闘の残滓がこれ。
http://ohmizaiju.tumblr.com/post/323869916/a-smart-dashboard-is-reblogged-mine
で、過去に作った分だと、全ページに対してis_reblogged_mine関数を適用して、際限なくクラス名is_reblogeed_mineが追加されていく状況にあった。
そのあたりの問題を、document.evaluateの動作を調べつつ解決できたのが以下のソース。
// ==UserScript== // @name A smart dashboard is_reblogged_mine // @description Tumblrのダッシュボードの内、自分が投稿したpostからreblogされたものを折りたたみ&半透明化し、ダッシュボードをスマートにします // @include http://www.tumblr.com/* // @include https://www.tumblr.com/* // @include http://*.www.tumblr.com/* // @include https://*.www.tumblr.com/* // ==/UserScript== (function() { var css = <![CDATA[ li[id^="post"][class*="is_reblogged_mine"] { -moz-opacity:0.9 !important; opacity:0.9 !important; max-height:1em !important; overflow:hidden !important; } li[id^="post"][class*="is_reblogged_mine"] img { display:none !important; } li[id^="post"][class*="is_reblogged_mine"] blockquote { display:none !important; } ]]>; if (typeof GM_addStyle != "undefined") { GM_addStyle(css); } else if (typeof PRO_addStyle != "undefined") { PRO_addStyle(css); } else if (typeof addStyle != "undefined") { addStyle(css); } else { var heads = document.getElementsByTagName("head"); if (heads.length > 0) { var node = document.createElement("style"); node.type = "text/css"; node.appendChild(document.createTextNode(css)); heads[0].appendChild(node); } } function is_reblogged_mine(doc, xpath){ var target = document.evaluate(xpath,doc,null,7,null); for(var i = 0, maxi = target.snapshotLength; i < maxi; i++){ target.snapshotItem(i).className += " is_reblogged_mine ";//" notification is_reblogged_mine "; } } var boot=function(){ is_reblogged_mine(document,'.//li[contains(@class,"not_mine")][contains(@class,"is_reblog")][div[@class="post_info"][text()[contains(self::text(),"reblogged you")]]]'); window.addEventListener('AutoPagerize_DOMNodeInserted', function(evt){ is_reblogged_mine(evt.target,'.//div[@class="post_info"][text()[contains(self::text(),"reblogged you")]]/parent::li'); }, false); } if(window.AutoPagerize){ boot(); }else{ window.addEventListener('GM_AutoPagerizeLoaded', boot, false); } })();