IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

はてスタの引用をまとめる Greasemonkey を書きました。

このように

引用機能を使って伝えたいことを表現するときってありますよね><









でも、いちいちマウスを横に動かしてくのがプルプルするんです!プルプルするんです!

というわけで

以下のようにまとめてくれるグリモン書いた

ご自由にお使いください

// ==UserScript==
// @name           Quote Matome
// @namespace      http://d.hatena.ne.jp/amachang/
// @include        http://*
// ==/UserScript==

(function(f) {

    // Greasemonkey から prototype をいじるトリック
    unsafeWindow.location.href = 'javascript:(' + f + ')();void(0);' 

})(function() {

    // はてスタ使ってないページ
    if (!window.Hatena || !Hatena.Star) return;

    // uri から Hatena.Star.Entry のインスタンスを取得するための辞書
    Hatena.Star._entryMap = {};

    // Hatena.Star.Star の quote プロパティを _quote プロパティに変える
    Hatena.Star.EntryLoader.entries.forEach(function(e) {

        // ついでに辞書に登録
        Hatena.Star._entryMap[e.uri] = e;

        e.stars.forEach(function(s) {
            s._quote = s.quote;
            delete s.quote;
        });
    });

    // Hatena.Star.Star に quote セッターを作る
    Hatena.Star.Star.prototype.__defineSetter__('quote', function(quote) {
        return this._quote = quote;
    });

    // Hatena.Star.Star にゲッターを作る
    Hatena.Star.Star.prototype.__defineGetter__('quote', function() {

        // 自分自身が所属する Hatena.Star.Entry を取得する
        return Hatena.Star._entryMap[this.entry.uri].

                   // スターを取得
                   stars.

                   // 同じ名前のスターだけ抽出
                   filter(function(s) { return s.screen_name == this.screen_name }, this).

                   // 引用を持っているスターを抽出
                   filter(function(s) { return s._quote }).

                   // 引用文字の抽出
                   map(function(s) { return s._quote }).

                   // 結合
                   join(' ');
    });

});