delete tumblr on Minibuffer

http://d.hatena.ne.jp/Constellation/20080405/1207403014

// ==UserScript==
// @name           DeleteCommand
// @namespace      http://d.hatena.ne.jp/Constellation/
// @description    delete tumblr on Minibuffer
// @include        http://www.tumblr.com/dashboard*
// @include        http://www.tumblr.com/show*
// @version        0.0.1
// ==/UserScript==

if(!window.Minibuffer) return; //Minibufferの存在確認。もはやお約束。
var $X = window.Minibuffer.$X; //$X関数を参照。でも参照しときながら使わなかった。

// Tumblr::Deleteのコマンドを登録
window.Minibuffer.addCommand({
  name : 'Tumblr::Delete',
  command : function(stdin){ //渡されてくるものをstdinとして受け取る。あとでpinされたnodeのnodelistを投げるつもり。
  stdin.forEach(function(obj){ //forEachでlistそれぞれのnodeに実行。objでそれぞれのnodeを受け取ってます。
    if (obj.className.match(/is_mine/)){ // 渡されたnodeのクラスにis_mineがはいっているか確かめている。入っていなかったら他人のエントリなので{}の中身を実行しない。今考えるとindexOfのほうが効率がよかった。
      var id = obj.id.match(/post([\d]+)/)[1]; // Deleteのための必須情報、Tumblrのエントリのidを手に入れる。
      window.Minibuffer.status('DeleteCommand'+id, 'Delete...'); //status情報表示。上でやったやつです。

      var data = encodeURIComponent('id') + '=' + encodeURIComponent(id); //手に入れたidからdeleteするためにpostするときのdataを作成。
      //GM_xmlhttpRequestに投げるオブジェクト。
      //自分はGM_xmlhttpRequest内に直接書くのが嫌なのでいつもopt作ってから投げてます。
      //optの中身の諸情報についてはGM_xmlhttpRequestの説明を探してください。
      var opt = {
        method: 'POST',
        url: 'http://www.tumblr.com/delete',
        headers : {
        'Content-Type' : 'application/x-www-form-urlencoded'
          },
        data: data,
        //onload内にはRequestが帰ってきてからの処理が書いてあります。
        //逆に言えばここの中身が実行されるのは、POSTが成功し、終了したときです。
        //引数のresはGM_xmlhttpRequestのresponseオブジェクトです。
        //POSTの場合なのでこの場合はあまり使いませんが。
        onload: function(res){
        window.Minibuffer.status('DeleteCommand'+id, 'Delete... done.', 100); //さっきのstatusを更新し、Deleteが成功したことを明示します。
        },
      }
      GM_xmlhttpRequest(opt); //GM_xmlhttpRequestを実行しています。
    }
  });
  },
});

//以下がショートカットキー登録です。
window.Minibuffer.addShortcutkey({
    //Shift+Dにショートカットキーを設定。
  key: 'D',
  description: 'Tumblr::Delete', // 説明文
  command: function(){
    var stdin = []; //nodelistがなかったときに備えてからの配列を宣言。
    try{
    //LDRizeに標準で入っているpinned-or-current-nodeコマンドを実行
    //このコマンドは、pinしているものがあったらそのnodelistを、
    //なかったら今さしているnodeをlistとして返します。
    //何にもなかった場合に備えてtryで実行
    //そしてそのnodelistをstdinで参照しています。
    stdin = window.Minibuffer.execute('pinned-or-current-node');
    } catch (e){}
    //Tumblr::Deleteコマンドを実行。
    //nodelistのstdinを渡しています。
    window.Minibuffer.execute('Tumblr::Delete', stdin);
    //終わった後Minibuffer標準搭載のclear-pinコマンドを実行し、pinをclearしています。
    window.Minibuffer.execute('clear-pin');
  }
  });

//debug用
function log (e){
  GM_log(e)
}