Как получить доступ к содержимому сообщения в окне создания сообщения Thunderbird? - PullRequest
4 голосов
/ 20 марта 2009

Я пытаюсь написать расширение Thunderbird, которое позволит вам составить сообщение, но оно обработает текст сообщения перед его отправкой. Поэтому мне нужен доступ к текстовому содержимому тела письма.

Вот то, что у меня есть, так же, как тестовый код в консоли JavaScript Extension Developer.

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? Сначала я попробовал NodeFilter.SHOW_TEXT, но он не прошел через <SPAN>, которые содержат цитируемый материал в ответе. Точно так же кажется забавным FILTER_ACCEPT каждый узел, а затем вручную выбрать его позже, но у меня была та же проблема, когда если бы я отклонил узел SPAN, ходок не стал бы входить внутрь.
  • Последовательные <BR> s нарушают наивную реализацию, потому что между ними нет узла #text. Поэтому я вручную определяю их и добавляю пустые строки в мой массив. Неужели так много нужно делать вручную, чтобы получить доступ к содержанию сообщения?

1 Ответ

5 голосов
/ 20 марта 2009

Ну, не всем сразу!

Я опубликовал это как ветку 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 содержит текст сообщения электронной почты в виде открытого текста.

...