2009-03-20 5 views
4

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 zu FILTER_ACCEPT jeden Knoten und dann manuell Cherry-Pick es später, aber ich hatte das gleiche Problem, wo, wenn ich einen SPAN 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?

Antwort

5

Nun, läuten nicht alle gleichzeitig!

Ich postete dies als mozilla.dev.extensions thread und es gab einige fruchtbare Diskussion. Ich habe in Venkman herumgespielt und die Lösung ist, meine DOM/DHTML-Gewohnheiten wegzuwerfen und in die richtige API zu schreiben.

var editor = window.gMsgCompose.editor; 

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

Jetzt text hat die Klar Version des E-Mail-Körper besteht.