2009-03-20 9 views
4

J'essaye d'écrire une extension Thunderbird qui vous permettra de composer un message mais il traitera le texte du message avant de l'envoyer. J'ai donc besoin d'accéder au contenu en texte brut du corps de l'e-mail.Comment accéder au contenu du message dans la fenêtre de composition du message de Thunderbird?

Voici ce que j'ai jusqu'à présent, tout comme un code de test dans la console développeur Extension 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]); 
} 

J'aimerais savoir si je suis sur la bonne voie. J'ai aussi quelques questions spécifiques:

  • Est-ce que doc.textContent n'a pas vraiment de nouvelle ligne? Comme c'est stupide? J'espère que c'est juste un bug avec la console Javascript mais je ne pense pas.
  • Est-ce que le TreeWalker est correct? J'ai d'abord essayé NodeFilter.SHOW_TEXT mais il n'a pas traversé dans les <SPAN> qui contiennent le matériel cité dans une réponse. De même, il semble drôle de FILTER_ACCEPT tous les nœuds, puis manuellement le sélectionner plus tard, mais j'ai eu le même problème où si je rejetais un nœud SPAN, le marcheur ne rentrait pas à l'intérieur.
  • consécutifs <BR> s rompent la mise en œuvre naïve parce qu'il n'y a pas de noeud #text entre eux. Donc, je les détecte manuellement et pousse les lignes vides sur mon tableau. Est-il vraiment nécessaire de faire autant de travail manuel pour accéder au contenu du message?

Répondre

5

Eh bien, ne pas tout le monde carillon à la fois!

J'ai posté cela comme un mozilla.dev.extensions thread et il y avait une discussion fructueuse. J'ai joué dans Venkman et la solution est de jeter mes habitudes DOM/DHTML et écrire à l'API correcte.

var editor = window.gMsgCompose.editor; 

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

Maintenant text a la version texte du corps e-mail étant composé.

Questions connexes