Ich versuche, eine Thunderbird-Erweiterung zu schreiben, mit der Sie eine Nachricht verfassen können, aber sie verarbeitet den Nachrichtentext vor dem Senden. Also brauche ich Zugriff auf den reinen Text-Inhalt des E-Mail-Körpers.Wie greifen Sie auf den Nachrichteninhalt im Thumbbird Nachrichten-Fenster zu?
Hier ist, was ich bisher habe, nur als einige Test-Code in der Extension Developer Javascript-Konsole.
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]);
}
Ich würde mich über jede Rückmeldung freuen, ob ich auf dem richtigen Weg bin. Ich habe auch einige spezifische Fragen:
- Hat
doc.textContent
wirklich keine Zeilenumbrüche? Wie dumm ist das? Ich hoffe, es ist nur ein Fehler mit der Javascript-Konsole, aber ich vermute nicht. - Ist der TreeWalker korrekt? Ich versuchte zuerst
NodeFilter.SHOW_TEXT
, aber es ging nicht in die<SPAN>
s, die das zitierte Material in einer Antwort enthalten. In ähnlicher Weise scheint es lustig zuFILTER_ACCEPT
jeden Knoten und dann manuell Cherry-Pick es später, aber ich hatte das gleiche Problem, wo, wenn ich einenSPAN
Knoten zurückgewiesen, würde der Walker nicht hineingehen. - Konsekutiv
<BR>
s brechen die naive Implementierung, weil es keinen#text
Knoten zwischen ihnen gibt. Also erkenne ich sie manuell und schiebe leere Zeilen auf mein Array. Ist es wirklich notwendig, so viel manuelle Arbeit zu unternehmen, um auf den Nachrichteninhalt zuzugreifen?