FC2ブログ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Thunderbirdのアドオン作りをちまちまと続けていましたが、
自分の中で需要が途絶えたので開発を中止しました。
転職にともない、需要が大幅に変化したためです。
まぁ別に続きを待ちわびていた人もいないはずですが。

その代わりに、自分の中で需要があったFirefoxのアドオンを作ることにしたのですが、
どうにもおかしなことがあったのでとりあえず裏書きしておきます。

Firefoxでページ(タブ)を開くごとにある処理を行わせるアドオンを作成
したのですが、どうにも動きがおかしかったのです。
具体的には、ページの読み込みが完了したタイミングでHTMLを
編集する処理を組み込んだのですが、複数のタブを一気に開くと、
あるタブの内容が別のタブとまったく同じ内容になってしまう現象が
みられました。コード的には以下のようなもので、onLoadイベントを
拾うListenerをブラウザに組み込みました。



window.addEventListener(
  "load",
  function() {
    処理;
  },
  false);


いろいろしらべてみたのですが挙動が理解不能で、
最終的にはスタック配列とsetInterval関数を使って、
Onloadが発生したページを一つずつ処理をするように修正したことで
想定どおり動くようになりました。

不具合の原因は私が思うには、JavaScriptはマルチスレッド処理ができないのに
それを無理やりやらせようとしたことじゃないかと思います。

もしも同じようなことをして、とくに不具合もなく動いてるよーって人は
ぜひ連絡ください。
スポンサーサイト
前回の記事でいただいたコメントをもとに、デコードするコードを組んでみました。
以下のdecodeメソッドの引数にBase64文字列を渡すと、
デコードされた文字列が返ってきます。



function decode(aInput) {
  MIMEHeaderParam = Components.classes['@mozilla.org/network/mime-hdrparam;1']
    .getService(Components.interfaces.nsIMIMEHeaderParam);
  var encodedParts = aInput.match(/=\?[-_a-z0-9]+\?.\?[^?]+\?=/gi);
  var self = this;
  encodedParts.sort().forEach(function(aPart) {
    if (!/[ \t]+/.test(aPart)) {
      aInput = aInput.replace(
        aPart,
        self.MIMEHeaderParam.getParameter(aPart, '', '', false, {})
      );
      return;
    }
    var prefix = aPart.match(/^=\?[^\?]+\?Q\?/);
    var parts = aPart.match(/[ \t]+|[^ \t]+/g);
    parts = parts.map(function(aSubPart, aIndex) {
      if (aIndex > 0 && !/[ \t]+/.test(aSubPart)) aSubPart = prefix + aSubPart;
      if (aIndex < parts.length-1 && !/[ \t]+/.test(aSubPart)) aSubPart += '?=';
      return aSubPart;
    }).join('');
    aInput = aInput.replace(aPart, self.decode(parts));
  });
  return aInput;
}


なぜデコードされるのかは、

MIMEHeaderParam = Components.classes['@mozilla.org/network/mime-hdrparam;1']
.getService(Components.interfaces.nsIMIMEHeaderParam);

が鍵なんだろうけど、まだ中身を見てないので
詳しい動作は不明です。調べたらまた書きます。

コメントありがとうございました:)
Thunderbirdでならもう少し簡単にデコードする方法がある、という情報をコメントでいただきました。
情報を元に組んだコードはこちら


前回から1ヶ月も空いてしまった。
今回は文字コードの変換について分かったことを書きます。

日本でメールのやりとりをするとき、ヘッダ部分は
ISO-2022-JPという文字コードとbase64でエンコードされている
ことが大半です。

しかし、アドオンでロジック部分を担当するJavaScriptは
内部的な文字コードがUnicodeですので、これらの文字列を扱う
(文字列検索したり、alert()で表示させたりする)ためには、
文字コードの変換が必要になります。

具体的には、たとえばメールの件名として


"古い複合機について"


という文字列は、メールの内部的には


"=?ISO-2022-JP?B?GyRCOEUkJEojOWc1ISRLJEQkJCRGGyhC?="


という文字列で表現されているので、アドオンの内部でいろいろ
使うにはこいつを変換してやらねばならないのです。

変換の詳しいことは以下のサイトに書いてあります。
すばらしい。
メールヘッダの日本語SubjectをISO-2022-JPに変換する方法(MIME(Base64))

で、このサイトを参考にして以下を実行したら変換できた。


①"=?ISO-2022-JP?B?" と "?=" で囲まれる部分を、
  base64方式でデコード

②デコードしてできた文字列を、いったんISO-2022-JP方式で
 エスケープ

③最後にその文字列をアンエスケープすると、元の日本語が見える


ISO-2022-JPのエンコード・デコード方法については
Escape Codec Library: ecl.js
base64のデコード方法については
高度な JavaScript 技集base64.js
を参考にしました。感謝。

日本語についてはこれでいけますが、ASCII文字(Aとかbとかc)については、
"=?ISO-2022-JP?B?" と "?=" で囲まれることなく
平文で書いてあるので、そこらへんうまいことロジックで
よけておかねばなりません。他にも、件名が長くなると
"=?ISO-2022-JP?B?"が何回も現れたりしますので注意してください。

具体的なソースコードについては、技術調査レベルのコードしかないので
載せません。あんまり変なのを載せると弾さんに怒られるし

なんでエスケープしてからアンエスケープしないといけないのか
理由が分からなくて気持ち悪いのですが、いろいろいじってたら
できてしまいました。なので、上記はその程度のものだという認識でお願いします。
勉強が足りなくてすみません。

次回はメールの中身を取得する方法について書くと思います。

続きを読む
前回はIDEの紹介をしました。

実は執筆の速度に比べて開発の方が進みすぎて、
どこから紹介すればいいか迷っています。
端から端まで紹介するのは、どうにも効率が悪いというか
要領を得ない気がするので、私が開発を進めていく上で
詰まったところを重点的に紹介していくことにします。

というわけでタイトル。「新しいウィンドウを開く」。

Thunderbirdの見た目はXULで作られますが、
ロジックはJavaScriptで作ります。なので、以下のように書けば
新しいウィンドウを開くことができます。

window.open('chrome://messenger/content/messenger.xul', 'messenger', 'chrome');

chrome://messenger/content/messenger.xul はThunderbirdの
メイン画面ですから、実行するとメイン画面がもう一つ開くことになります。

実際にThunderbirdに組み込むには、ボタンなどの
アクションに割り当てるのが普通でしょうか。
part2で紹介した、ステータスバーに"Hello, World"を表示するXULコードを、
下のコードに置き換えれば動作すると思います。

 <statusbar id="status-bar">
  <button id="my-panel" label="Hello, World" oncommand="window.open('chrome://messenger/content/messenger.xul', 'messenger', 'chrome');"/>
 </statusbar>


oncommand は普通のHTMLで言う onclick みたいなものです。
で、実際に組み込んで動作させた様子が以下。


右下の"Hello, world"ボタンをクリックすると、下のようなウィンドウが開きます。





こんな感じで、自分で作ったXULをhrefに割り当てればMyアプリが作れるわけです。
じゃあ、今日はこんなところで。


前回DOM Inspector を紹介してからずいぶん経ってしまいましたが、
今回はIDEの紹介でも。

いま私はこれを使っています。
Spket IDE

ページの上部にあるDownloadタブからjarファイルをダウンロードします。
オートコンプリート機能付きとのことですが、期待していたほど
コンプリートしてくれません。Thunderbirdアドオン開発用のコンプリートを
要求する方が酷、ということでしょうか。

それでも、ソースコードの管理がずいぶん楽になりました。色もつくし。
おすすめです。


それにしてもなかなか進まないです。いまは文字コードにハマってます。
BASE64をJavascriptでデコードするかどうか悩んでいます。
なにかInterfaceがあればいいんですが、現在探索中です。
>>次のページ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。