4

メッセージを作成できるThunderbird拡張機能を作成しようとしていますが、メッセージテキストを送信する前に処理します。したがって、電子メール本文のプレーンテキストコンテンツにアクセスする必要があります。

これが、Extension Developer Javascriptコンソールのテストコードと同じように、これまでのところです。

var composer = document.getElementById('msgcomposeWindow');
var frame = composer.getElementsByAttribute('id', 'content-frame').item(0);
if(frame.editortype != 'textmail') {
  print('Sorry, you are not composing in plain text.');
  return;
}

var doc = frame.contentDocument.documentElement;

// XXX: This does not work because newlines are not in the string!
var text = doc.textContent;
print('Message content:');
print(text);
print('');

// Do a TreeWalker through the composition window DOM instead.
var body = doc.getElementsByTagName('body').item(0);
var acceptAllNodes = function(node) { return NodeFilter.FILTER_ACCEPT; };
var walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT, { acceptNode: acceptAllNodes }, false);

var lines = [];

var justDidNewline = false;
while(walker.nextNode()) {
  if(walker.currentNode.nodeName == '#text') {
    lines.push(walker.currentNode.nodeValue);
    justDidNewline = false;
  }
  else if(walker.currentNode.nodeName == 'BR') {
    if(justDidNewline)
      // This indicates back-to-back newlines in the message text.
      lines.push('');
    justDidNewline = true;
  }
}

for(a in lines) {
  print(a + ': ' + lines[a]);
}

私が正しい方向に進んでいるかどうかについてのフィードバックをいただければ幸いです。また、いくつかの具体的な質問があります。

  • doc.textContent本当に改行がありませんか?それはどれほど愚かですか?私はそれがJavascriptコンソールの単なるバグであることを望んでいますが、そうではないと思います。
  • TreeWalkerは正しいですか?私は最初に試しましたが、返信に引用された資料が含まれているsにNodeFilter.SHOW_TEXTトラバースしませんでした。<SPAN>同様に、すべてのノードにとって面白いように見え、FILTER_ACCEPT後で手動でチェリーピックしますが、ノードを拒否した場合にSPANウォーカーが中に入ることができないという同じ問題がありました。
  • 連続したsは、間にノード<BR>がないため、単純な実装を中断します。#textそこで、手動でそれらを検出し、配列に空の行をプッシュします。メッセージの内容にアクセスするには、本当に多くの手作業を行う必要がありますか?
4

1 に答える 1

5

じゃ、みんな一斉にチャイムを鳴らさないで!

これをmozilla.dev.extensions スレッドとして投稿したところ、実りある議論がありました。私は Venkman で遊んでいますが、解決策は、DOM/DHTML の習慣を捨てて、正しい API に書き込むことです。

var editor = window.gMsgCompose.editor;

// 'text/html' works here too
var text = editor.outputToString('text/plain', editor.eNone)

textこれで、メール本文のプレーンテキスト バージョンが作成されました。

于 2009-03-20T19:10:46.327 に答える