ReblogCommand

T/shift-T を押しても動かない。。。LDRize minibuffer tumblr reblog command も同じ。一応 Minibuffer は最新版のはず:var VERSION = "2008.04.19";

状況

  • 対象によって t を押しても何も反応がない
  • "Reblog....Done" とは表示されるが、何も reblog されてない。

ちょいと調査:

keybind

まずは T の keybind が働いているか:

window.Minibuffer.addShortcutkey({
  key: 't',
  description: 'Reblog',
  command: function(){
	    alert("hoge");
	  var target_cmd = getTargetCommand();

ふむ、とりあえずコールバックは動いているらしい。

reblog command for minibuffer

window.Minibuffer.addCommand({
  name: 'reblog',
  command: function(stdin){
	  var args = this.args;
	  var urls = [];
	  ...
	  alert("rebloging...");
	  // reblog
	  if(args.length = 1 && args[0] == '-m'){
		  urls.forEach(function(aURL){
			  reblogManually(aURL);
		  });
	  }else if(args.length){
		  console.log('unknown args...');
	  }else{
	      alert("filter url..");
	      alert(urls.filter(isTumblrUserURL));
		  urls = urls.filter(isTumblrUserURL);
		  if(!urls.length) return stdin;
		  alert("filter checked: " + urls);
		  var lst = urls.map(reblog);
		  alert("lst: " + lst);
		  if(lst.length > 1){
			  with(D()){
				  parallel(lst).wait(2).
				  next(function(){window.Minibuffer.status('ReblogCommand','Everything is OK', 1000)});
			  }

続いて minibuffer に登録してる reblog コマンド部。

ふむ、、、どうやら渡された url が "http://user.tumblr.com/1111111" だと filter チェックに通って、"http://user.tumblr.com/1111111/whatever-comments" だと通らないらしい。ID のあとに何かのコメントが渡されているエントリとないエントリがあるようだが、、、これを調べるには LDRize, minibuffer を追わないとダメそうなのでとりあえず保留。コメントがなく just ID な url な場合を想定。

reblog()

で、そのフィルターチェックが通ると、reblog() に渡される。var lst = urls.map(reblog); のとこ。urls の配列の中身がそれぞれ reblog(url) として渡される。

function reblog(aURL){
	var id  = getIDByPermalink(aURL);
	var d;
	with(D()){
		d = Deferred();
		if(!id) {
			wait(0).next(function(){d.call()});
			return d;
		}
	}
	var url = getURLByID(id);
	window.Minibuffer.status('ReblogCommand'+id, 'Reblog ...');
	getSource(url).
	next(function(res){
		return postData(url, createPostData( parseParams( convertToHTMLDocument(res.responseText))));
	}).
	next(function(){ window.Minibuffer.status('ReblogCommand'+id, 'Reblog ... done.', 100); d.call()}).
	error(function(){
		if(confirm('reblog manually ? \n' + url)) reblogManually(aURL);
		d.call();
	});
	return d;
}

うーん、、D() とか next(), error() を理解せんとダメか。。。非同期処理はよく分からんチンなのだ。
なんとなく、getSource(url) で html ソースをとってきて post して成功したら status に done と表示させて manual の時は reblogManually() 呼ぶらしい。

うーん、、、ちとハードルが高そうなので reblogManually() を読む。shift-t の時は reblog -m と execute() されるように引数渡して、minibuffer reblog command の判定で -m がついてれば reblogManually() に飛ぶ。

function reblogManually(aURL){
	var id  = getIDByPermalink(aURL);
	if(!id) return;
	var url = getURLByID(id);
	window.open(url);
}

渡された url から id を取得し、その id から url に変換して open。
これは動くには動くのだが、開いたページが "We couldn't find the page you were looking for."になってしまう。どうも url の id のあとになにか暗号みたいなの(dashborad 上のreblog リンクを辿るのについてるやつ)が必要らしい。。。。これはちょっと仕様がどうなってるのかみないと分からん。。