Как получить доступ к содержимому сообщения в окне создания сообщения Thunderbird?

StackOverflow https://stackoverflow.com/questions/665332

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

Решение

Ну, не включайтесь все сразу!

Я опубликовал это как поток 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 составляется текстовая версия тела электронного письма.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top