Как получить доступ к содержимому сообщения в окне создания сообщения Thunderbird?
-
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
составляется текстовая версия тела электронного письма.