2008/01/31


MinibufferBookmarkCommand - 3.14

適当ですが...
はてなブックマークと違いdel.icio.usの場合は、クローラでタイトルを補完してくれませんので、XHRで自前で取得しています。その際、responseTextが文字化けを起こしている可能性がありますので要注意。
--- minibufferbookmarkcomman.user.js.orig   Sat Nov 24 14:53:01 2007
+++ minibufferbookmarkcomman.user.js    Sat Nov 24 14:51:57 2007
@@ -140,6 +140,90 @@
        postToHatenaB(nodes, urls);
    }
    
+   // delicious bookmark
+   var delicious = function(nodes, urls, tags, comment){
+       if(!urls.length) return;
+       var total = urls.length;
+       var time = new Date().getTime();
+       var getParam = function(node, url, fn, afterPost){
+           if(!url) return;
+           var callback = function(res){
+               var html = res.responseText.createHTML();
+               var form = window.Minibuffer.$X('//form[@id="delForm"]', html)[0];
+               var inputs = window.Minibuffer.$X('//form[@id="delForm"]//input', html);
+               var res = {};
+               inputs.forEach(function(node){
+                   res[node.getAttribute('name')] = node.getAttribute('value');
+               });
+               if(keys(res).length == 1){
+                   // already bookmarked
+                   var text = url;
+                   if(window.LDRize){
+                       var siteinfo = window.LDRize.getSiteinfo();
+                       if(siteinfo && siteinfo.view){
+                           var view = window.Minibuffer.$X(siteinfo.view, node)[0];
+                           if(view) text = view.textContent;
+                       }
+                   }
+                   window.Minibuffer.message('<small>'+text+'</small><br/> has already bookmarked.', 2000);
+                   afterPost();
+               }else{
+                   res.action = 'http://del.icio.us/' + form.action.replace(/^https?:\/\/[^\/]+\//, '');
+                   // not yet bookmarked
+                   fn(res, afterPost);
+               }
+           }
+           GM_xmlhttpRequest({
+             method: 'GET',
+             url: "http://del.icio.us/post?v=4&url="+encodeURIComponent(url),
+             onload: callback,
+             onerror: function(res){log('onerror',res.responseText, '\n',res.responseHeaders)},
+           });
+       }
+       var post = function(opt, afterPost){
+           if (!opt.description) {
+               var x = new XMLHttpRequest();
+               x.open('GET', opt.url, false);
+               x.send(null);
+               if (x.readyState == 4 && x.status == 200) {
+                   try {
+                       var html = x.responseText.createHTML();
+                       opt.description = window.Minibuffer.$X('//title', html)[0].text;
+                   } catch(e) {}
+               }
+           }
+           var request = [
+               "url=", encodeURIComponent(opt.url),
+               "&oldurl=", encodeURIComponent(opt.url),
+               "&private=", opt.private,
+               "&description=", encodeURIComponent(opt.description),
+               "&notes=", encodeURIComponent(comment),
+               "&tags=", encodeURIComponent(opt.tags),
+               "&v=", opt.v,
+               "&key=", opt.key,
+               ].join('');
+           GM_xmlhttpRequest({
+             method: 'POST',
+             url: opt.action,
+             headers: {
+                 'Content-Type': 'application/x-www-form-urlencoded'
+               },
+             onload: afterPost,
+             onerror: function(res){log('onerror',res.responseText, '\n',res.responseHeaders)},
+             data: request
+           });
+       }
+       var postToDelicious = function(nodes, urls){
+           if(!urls.length){
+               window.Minibuffer.status('bookmark'+time,'Bookmark 100 %', 1000)
+               return;
+           }
+           window.Minibuffer.status('bookmark'+time,'Bookmark ' + Math.floor((total-urls.length) / total * 100) + '%');
+           getParam(nodes.shift(), urls.shift(), post, function(){postToDelicious(nodes, urls)});
+       }
+       postToDelicious(nodes, urls);
+   };
+
 // var delicious = function(urls, tags){
 //     log('delicious: urls:tags',urls, tags);
 // }
@@ -147,7 +231,7 @@
 //     log('livedoor: urls:tags',urls, tags);
 // }
    addBookmark('hatena',    'h', hatenab);
-// addBookmark('delicious', 'd', delicious);
+   addBookmark('delicious', 'd', delicious);
 // addBookmark('livedoor',  'l', livedoorclip);
    
    window.Minibuffer.addCommand({
Posted at by




こちらを参考に...
MinibufferベースのTwitter Post&Favorites Command Greasemonkey - 0x集積蔵
Jaiku版作ってみました。
以下ダウンロードURLがあります。

ただ、Jaikuの場合twitterと違ってBasic Authのダイアログを出す訳には行きません。Jaikuの場合にはAPIキーが必要となります。
グリモンをインストールした後
グリモンの設定ボタンを押してスクリプト編集に移り、「JaikuUser」と「JaikuApiKey」を修正します。
minibuffer-jaiku
個々のユーザに対するAPIキーはJaikuのAPIドキュメントに書いてあります。(黄色くおねしょしたみたいになっている部分です)
あとはtwitter版と同じ使い方になります。キーバインドとして「J T」および「J R」が追加されます。

なお、先ほどJaiku用のLDRize SITEINFOも書いておきましたので、pinからreplyする事も出来ます。

後は適当に...
minibufferjaikucommand.user.js

mattn the jaiku jaiker jaikest!.
Posted at by




Firefoxをshellの様に扱えるグリモン「Minibuffer ? Userscripts.org」で使える、はてなブックマークコマンド「hatena-bookmark」書いた。 Minibufferは、LDRizeと併用すると「pinned-link」や「pinned-node」というルートコマンド(フィルタコマンドではない)が追加される。
例えば、LDRizeでpinを付けたリンクをタブで開くには :pinned-link | open とすれば良い。ここで注意しなければならないのがグリモンの設定で
  • Minibuffer
  • LDRize
  • ...LDRizeプラグインもしくはMinubufferプラグイン...
という順番にしておかないと、「pinned-link」や「pinned-node」が正しく動かなくなるので注意。

この順番になるように、以下のスクリプト入れると、「hatena-bookmark」コマンドが追加される。
LDRizeを入れておくと、ブログ等の記事1つずつにpinが付けられるようになっていて、そのpinを付けたものに対してパイプ形式にコマンドを繋げられる。
例えば、pinをつけたリンクのGoogleキャッシュを開くには :pinned-link | google-cache | open とすればよい。
※pinをつけるには「p」を押す。

「hatena-bookmark」の使い方は、何もpinしていない状態で「Alt-x」(ALTキーを押しながらx)を押して :hatena-bookmark とすると、現在見ているページのはてなブックマーク登録画面が立ち上がる。またpinを付けた状態で :pinned-link | hatena-bookmark とすると、pinが指すリンクのブックマーク登録画面が立ち上がる。
なお :pinned-node | hatena-bookmark では、pinしているHTMLノードの先頭にあるリンクを使ってブックマーク登録画面を表示する。
ちなみにソースはこんな感じ。 // ==UserScript==
// @name           Minibuffer Hatena Command
// @namespace      Minibuffer.Hatena-Command
// @description    add hatena-bookmark command to Minibuffer.
// @include        http://*
// @include        https://*
// ==/UserScript==

var SCRIPT_VERSION  = 'Thu, 15 Nov 2007'

var Minibuffer_Hatena = new function() {
    var self = this;

    this._run_bookmark = function(u, t) {
        var link;
        if (t) link = 'http://b.hatena.ne.jp/add?mode=confirm&is_bm=1&title='+escape(t)+'&url='+escape(u);
        else   link = 'http://b.hatena.ne.jp/add?mode=confirm&is_bm=1&url='+escape(u);

        setTimeout(function(){
            window.open(link, '_blank', 'width=550,height=600,resizable=1,scrollbars=1');
        }, 10);
    }

    this.bookmark = function ( stdin ) {
        if (stdin.length == 0) {
            self._run_bookmark(location.href, document.title);
        } else {
            stdin.forEach(function(obj){
                if (typeof obj == 'string' && obj.match(/^https?:.*/)) self._run_bookmark(obj);
                else if (typeof obj == 'object') {
                    try {
                        var links = obj.getElementsByTagName('a');
                        for(var n = 0; n < links.length; n++) {
                            if (links[n].href.match(/^https?:.*/)) {
                                self._run_bookmark(links[n].href);
                                break;
                            }
                        }
                    } catch(e) { }
                }
            });
        }
    };
    this.condition = function() { return true; };
};

if (window.Minibuffer) {
    Minibuffer.addCommand({
        "hatena-bookmark": Minibuffer_Hatena.bookmark,
    });
}

インストール:minibuffer.hatena.user.js
ちなみに、ファイル名が「minibuffer.hatena.bookmark.user.js」になっていないのは、いずれ他のコマンドも作って行きたいから...。

あ、あと記事とは無関係ですが、今日CodeReposのLDRize-SITEINFO書いときました。

追記1
bookmarkコマンドで、stdinを返すように修正した。
これで :pinned-link | hatena-bookmark | clear-pin とか出来る様になった。

追記2
申し訳ない。objがtypeofでstringとして戻るパターンとobjectとして戻るパターンがあるようです。修正しました。
Posted at by