読者です 読者をやめる 読者になる 読者になる

しまてく

学んだ技術を書きためるブログ

vimperator用のdel.icio.usのBookmarkをインクリメンタルサーチできるプラグイン書いた!

ソース

// Vimperator plugin: 'IncSearch in del.icio.us Bookmarks'
// Last Change: 05-Jul-2008.
// License: MIT
// Maintainer: cimadai <dice.k1984@gmail.com> - http://d.hatena.ne.jp/cimadai
//
// del.icio.us のブックマークの[URL][タグ][htmlのタイトル]から検索

(function(){
    const recentEndPoint = "https://api.del.icio.us/v1/posts/recent?"
    const allEndPoint = "https://api.del.icio.us/v1/posts/all?"

    var deli_bookmarks = [];

    function loadDeliciousBookmark(){
        var [lang] = Components.classes["@mozilla.org/network/protocol;1?name=http"]
                               .getService(Components.interfaces.nsIHttpProtocolHandler)
                               .language.split("-", 1);
        var xhr = new XMLHttpRequest();

        if( deli_bookmarks.length == 0 ){
            xhr.open("GET", allEndPoint, false);
            xhr.send(null);

            var match = xhr.responseText.match(/<post .*? \/>/g);
            if( match ) match.forEach( function(post){
                //alert(post);
                var deli_bookmark = {};
                post.match(/href="(.*?)"|description="(.*?)"|tag="(.*?)"/g).forEach( function(r){
                    var w = r.split("=");
                    deli_bookmark[ w[0] ] = w[1].replace(/^"|"$/g,"");
                });
                deli_bookmarks.push( deli_bookmark );
            });
        }

        // 全件取得のAPIで失敗した場合は、直近の100件を取得
        if( deli_bookmarks.length == 0 ){
            xhr.open("GET",recentEndPoint + "&count=" + 100, false);
            xhr.send(null);

            match = xhr.responseText.match(/<post .*? \/>/g);
            if( match ) match.forEach( function(post){
                var deli_bookmark = {};
                post.match(/href="(.*?)"|description="(.*?)"|tag="(.*?)"/g).forEach( function(r){
                    var w = r.split("=");
                    deli_bookmark[ w[0] ] = w[1].replace(/^"|"$/g,"");
                });
                deli_bookmarks.push( deli_bookmark );
            });
        }
    }

    // IncSearch
    liberator.commands.addUserCommand(['delicious'], "IncSearch in del.icio.us",
        function(arg){
            var url = arg.replace(/ \[.*?\ ]/, "");
            liberator.open(url, liberator.NEW_TAB);
        },
        {
            completer: function (filter) {
                if( deli_bookmarks.length == 0 ){
                    loadDeliciousBookmark();
                }

                var completionList = [];
                deli_bookmarks.forEach(function(r){
                    var regobj = new RegExp(".*" + filter + ".*", "i");
                    if( regobj.test(r.href) || regobj.test(r.description) || regobj.test(r.tag) ){
                        completionList.push( [ r.href + " [ " + r.description + " ]", r.tag] );
                    }
                });
                return [0,completionList];
           }
        }
    );

    // TagReload
    liberator.commands.addUserCommand(['deliciousload', 'dell'], "reload del.icio.us Bookmarks",
        function(){ loadDeliciousBookmark(); }
    );
 })();
// vim:sw=4 ts=4 et:

Todo

    • del.icio.usの調子が悪い時やAPIを叩きすぎた時などにBookmarkの取得ができないので、ClientSideDBとか考えてみる。
    • インクリメンタルサーチの時に、複数のタグを順序関係なく検索できるようにしたい。
    • Bookmarkがたくさんある場合のテストやってないのでそのうちやる。

ということで

よかったら使ってくだしあ><

追記(7/6)

スミマセン!思いっきり激しくデバッグ用のアラートが入ってました><
こっそりコメントアウト