tetsunosukeのnotebook

tetsunosukeのメモです

はじめてぐりもん書いた

初めてのGreasemonkeyにチャレンジ。

Livedoor Readerからソーシャルブックマークへのクリップ機能を拡張するために書いた。既にあるとか言うな。練習なんだから。

やりたかったこと

  • 一発クリップ(はすでにある)
  • 特定のタグをつける
  • タグを指定できるようにする

って感じ。名前がLDR2SBMのくせに今のところdel.icio.usだけ対応。しかも作りかけ。

おいおい勘違いしまくってるよとかあったらおしえてほしい!

// ==UserScript==
// @name          LDR2SBM
// @namespace     http://d.hatena.ne.jp/kidd-number5/
// @include       http://reader.livedoor.com/reader*
// ==/UserScript==

// この(function(){}();が作法のひとつくさい)
(function() {
    var w = unsafeWindow;
    var _onload = w.onload;
    var add_api_url = "https://api.del.icio.us/v1/posts/add?";
    // この関数もお決まりくさい。なぜかみんな最後に書いてるけど理由あんのかな。
    w.onload = function(){
		_onload();
		onload();
    };
    // Keybindを設定して、ショートカットキーを作った。
    // キーがおされるとコールバック関数が起動する
    var onload = function() {
        with(w) {
            Keybind.add("D", call_del_icio_us);
            Keybind.add("T", call_del_icio_us_w_tag);
            Keybind.add("N", call_del_icio_us_nsfw);
        }       
    };
    // del.icio.us にadd
    // ここらへんにコールバック関数を列挙。
    // まだ作ってないけど、カスタマイズバージョン的には
    // タグをつけるためのプロンプトが出てくるバージョンと、
    // 自動的にnsfw(職場で見るには不適切)タグをつけようかなと。
    // nsfwについては、URLで自動判別までしたいのだけどね。
    function call_del_icio_us() {
        // このget_active_itemはLDR内で使われている関数を勝手につかっちゃってるらしい。
        var item = w.get_active_item(true);
        // これもLDRの関数。噴出しの中に何か表示。ちょっとしたデバッグに使った。
        w.message("del.icio.us");
        // setTimeoutで囲うのが最近の流儀らしい
        window.setTimeout(function() {
            // ぐりもんによる外部へのHTTPリクエスト。
            // あえてAuthorizationヘッダーは送らないで、ブラウザに任せる。
            // もし認証済みでなければ普通にベーシック認証のWindowが出てくるので、
            // そこでいれればいいやと思った。
            GM_xmlhttpRequest({
                method: 'POST',
                url: add_api_url,
                data: 'url=' + encodeURIComponent(item.link) + 
                      '&tags=' + 'test' + 
                      '&description=' + encodeURIComponent(item.title),
                headers: {
                    'Content-type' : 'application/x-www-form-urlencoded',
                },
                onload: onloadHandler
            });
        }, 0);
    };
    
    function call_del_icio_us_w_tag() {
        var tag_string = w.prompt("tag?");
        w.message(tag_string);
    };
    function call_del_icio_us_nsfw() {
        w.message("nsfw");
    };

    // XHRしたあとのお作法っぽい。
    // DOM ParserやらXPathやら。
    // ぐりもんのXHRはresponseTextじゃないと取れないらしく
    // responseXMLとかはないらしい。
    function onloadHandler(detail) {
        var wp = new XPCNativeWrapper(window, "DOMParser()");
        var parser = new wp.DOMParser();
        var res = parser.parseFromString(detail.responseText, "text/xml");
        var result = res.getElementsByTagName("result");
        w.message(result[0].getAttribute("code"));
    };    
})();