はてブを正規表現やXPathでフィルタできるGreasemonkey

先月 id:solailoさんから

id:solailo これをリニューアルに対応させてもらたりできますか?

http://d.hatena.ne.jp/rikuo/20080902#c1229345579

とコメントをいただきました、「これ」というのは以前にはてな匿名ダイアリーで投稿されたこの Greasemonkey のこと
はてブのhotentryで、2chコピペブログや「ネタ」を削除するGreasemonkeyを勝手に改造 - はてな匿名ダイアリー
こちらは、はてなブックマークの注目・人気エントリーを正規表現とXPathでフィルタできる機能があったのですが、昨年11月に行われたリニューアルでページ構造が大きく変わり、動かなくなっていました。
というわけで、今回はそれをリニューアルに対応し、でもっていくつか機能追加することにしたわけです。
id:solailoさんにコメントいただいてから、実に1ヶ月以上かかってすみません*1。


インストールはこちらから

http://userscripts.org/scripts/show/40632

このGreasemonkeyの概略

はてなブックマークの注目エントリー、人気エントリー、また各ユーザーのお気に入りのページで正規表現やXPathでフィルタします*2。

使い方

正規表現の場合

注目・人気エントリーではこのような表示になっているかと思います。

このGresemonkeyで主にフィルタの対象となるのは、4点

  • エントリーのタイトルの文字列
  • ã‚¿ã‚°
  • 概要(※表示していれば)
  • エントリーのURL

こちらになります。
注目・人気エントリーではタイトルの文字列が64バイトで省略されてしまいますが、フィルタは省略前のタイトルを対象としています。タグについては、エントリーに付けられているタグを全て取得はできず、注目・人気エントリーのページに表示されているもののみがが対象になります。概要については表示・非表示が切り換えられますので、非表示の場合は適用されません。
設定の仕方はそれぞれ

  // タイトルの文字列についての設定
  filters.title = [
  ];

  // タグについての設定
  filters.tag = [
  ];

  // 概要部分についての設定
  filters.summary = [
  ];

  // URLについての設定
  url = [
  ];

となります。
また、タイトル・タグ・概要にどれか1つ合致すればオッケー、というまとめ設定もできます

  filters.all = [
  ];

ただし、できれば個別に指定した方が、動作が軽快になります。
書き方
正規表現を使うことができます

  filters.tag = [
    /これは(ひどい|えがい)/,
    /ネタ|neta/i,
  ];
  url = [
    /http:\/\/(foo|bar|baz).com/,
  ];

など。
正規表現が分からない、という方は

  filters.tag = [
    'これはひどい',
    'これはえがい',
    'ネタ',
    'neta',
  ];
  url = [
    'http://foo.com/',
    'http://bar.com/',
    'http://baz.com/',
  ];

と書いてもオッケーです。

お気に入りページの場合
  • b.hatena.ne.jp/userID/favorite
  • b.hatena.ne.jp/userID/group
  • b.hatena.ne.jp/userID/starfriends

でも同じように使えるのですが、フィルタの対象が若干異なります。
タグはお気に入り・グループメンバー・スターフレンド、及び自分のそれぞれがつけたタグが対象になりますし、概要は表示されないので対象外、となります。

XPathの指定

上記の正規表現など以外に、上級者向けの設定として XPath での指定ができます。

  // 注目・人気エントリー用
  xpath.hotentry = [
  ];
  // お気に入りページ用
  xpath.favorite = [
  ];

ページ構造が異なるため、注目・人気エントリー用とお気に入り他ユーザーページ用のものと分けて設定する必要がありますが、例えば

  // 注目・人気エントリー用
  xpath.hotentry = [
    // カテゴリーが「コンピュータ・IT」の場合
    'descendant::li[@class="category"]/a[starts-with(@href,"/hotentry/it")]',
    // タグ「foo」が付いていて、且つタグ「bar」もついている場合
    'descendant::li[@class="tags" and child::a[contains(text(),"foo")] and child::a[contains(text(),"bar")]]',
    // (id:sampleをお気に入りに登録していて)id:sampleがブックマークしている場合
    'descendant::li[@class="favorite"]/img[contains(@title,"sample")]',
  ];

など、複雑な条件を設定して選別することもできます。
XPath はどう書けばいいの?とか、そもそもXPath ってなに?というのは説明がすげー面倒なので、割愛。まぁ、こういうこともできるよ、ということで。

追記

XPathの指定について、応用編を書いてみました




フィルタに対しての処理

前述の設定に合致したエントリーについて、行う処理は3種類あります

非表示

文字通り表示しない

希薄化


流しやすいようにうっすらと

強調


むしろ逆に目立つように


このような処理になります。
切り換えは上部ヘッダにボタンを追加しているので、そこをクリックして下さい。



数字はフィルタを適用しているエントリーの数です。

このGreasemonkeyの狙い

元になったGreasemonkeyは「フィルタの条件に合致したら消す」という動作でしたが、むしろ特定の条件に合ったら強調して表示してもいいんじゃないか?と考えました。
気になるタグを設定したり、気になるワードを設定したりすることで、それを目出せて使う方向もありかなー、っていう。


あとちなみに、はてなブックマークのAutoPagerizeにも対応しています。


[どうぞご利用下さい。]



これまでに制作したGreasemonkey

><

*1:1ヶ月かかったというよりは、正月休みにやってしまおう、と思ってたら結局、飲み会があったり箱根駅伝見てたりでダラダラ過ごし、松の内が明けてからようやく着手してました……、スミマセン

*2:自分がブックマークしたもの(自分のページ)ではフィルタの必要性はないでしょうから、行いません