今朝気付いたのだけど、tomblooでReblogしようとするとエラーが出る。
自分だけなのかなーと思ったら案外そうでもないみたい。

表示されるエラーは以下の通り。



ポストエラー
message : s is undefined
fileName : chrome://tombloo/content/eval.js
lineNumber : 1658

元ページ:
kittenskittenskittens
http://kittenskittenskittens.tumblr.com/post/1086582851

ページを開き直しますか?


最新版(0.4.13)を持ってきて入れてみたけどダメだった。
さてどこを見ればいいのやら...

追記

ソースを引っ張ってきてざっくり検索して行番号と照らし合わせた感じだと、「lineNumber : 1658」というのは01_utility.jsのunescapeHTMLのような気がする。でも当たり前だけど、汎用的に使われてる関数だからこれが問題って言うんじゃなく、こいつを呼び出してる方に問題があって、んで多分パースしたHTMLを入れてるはずだからHTMLかパースした内容かどっちかおかしいはず。いやどこかわからんけど。


追記その2

とりあえず、Reblogしたときの動作が、31_Tombloo.Service.extractors.jsのextractByPage(436行目)に飛んでることがわかった。

extractByPage : function(ctx, doc){
  return this.extractByEndpoint(ctx,
    unescapeHTML(this.getFrameUrl(doc)).replace(/.+&pid=(.*)&rk=(.*)/, Tumblr.TUMBLR_URL+'reblog/$1/$2'));
},

でもって、このthis.getFrameUrl(doc)の返り値がundefinedらしい。

getFrameUrl : function(doc){
  return $x('//iframe[starts-with(@src, "http://www.tumblr.com/dashboard/iframe") and contains(@src, "pid=")]/@src', doc);
},

XParthわからんw


追記その3

いや別に大したことはしてないか。TumblrページにはそのページがTumblrであることを証明するiframeがあるので、それからpidとrkを引っ張ってきてReblog用のURLを作成するってのをやってるだけだ。

というわけで458行目をこう変えればgetFrameUrlの問題は解決する。

return $x('//iframe[starts-with(@src, "http://assets.tumblr.com/iframe") and contains(@src, "pid=")]/@src', doc);

でも今度は404だと怒られるエラーが出る。



これは、iframeの引数が増えてしまっているため。

同じく31_Tombloo.Service.extractors.jsの438行目を、

unescapeHTML(this.getFrameUrl(doc)).replace(/.+&pid=(.*)&rk=(.*)&lang=(.*)/, Tumblr.TUMBLR_URL+'reblog/$1/$2'));

こう変えてやったら直った。けど、何この気持ち悪い正規表現。どうしたらいいんだろ。[^&]*とかやったけど上手くいかなかったんだが。んー?


正式なパッチが出るのを待つか。



追記その4:2010/09/12

0.4.14がリリースされました。上記エントリについて修正されています。

考えてみれば、自分でフォークして修正するなりパッチ書くなりすれば良かったですね。プロジェクトをwatchはしてるんだし...

何はともあれ行われた修正は以下。

Commit 260b519263b193cc293036fdd5c1d181faeff59c to to's tombloo - GitHub

何かよく解らなかった正規表現については、[^&]をつかってreplaceじゃなくてmatch → 後方参照になってますね。そうかそうか。それだったらいけるのね、なるほど。