diff src/plugins/plugin_xep_0071.py @ 702:a25db3fe3959

plugin XEP-0071: rich messages management for sendMessage
author Goffi <goffi@goffi.org>
date Wed, 13 Nov 2013 14:03:16 +0100
parents 98b2400e17d6
children bfabeedbf32e
line wrap: on
line diff
--- a/src/plugins/plugin_xep_0071.py	Wed Nov 13 14:02:02 2013 +0100
+++ b/src/plugins/plugin_xep_0071.py	Wed Nov 13 14:03:16 2013 +0100
@@ -69,9 +69,10 @@
     def __init__(self, host):
         info(_("XHTML-IM plugin initialization"))
         self.host = host
-        txt_synt_plg = self.host.plugins["TEXT-SYNTAXES"]
-        txt_synt_plg.addSyntax(self.SYNTAX_XHTML_IM, lambda xhtml: xhtml, self.XHTML2XHTML_IM, [txt_synt_plg.OPT_HIDDEN])
+        self.synt_plg = self.host.plugins["TEXT-SYNTAXES"]
+        self.synt_plg.addSyntax(self.SYNTAX_XHTML_IM, lambda xhtml: xhtml, self.XHTML2XHTML_IM, [self.synt_plg.OPT_HIDDEN])
         host.trigger.add("MessageReceived", self.messageReceivedTrigger)
+        host.trigger.add("sendMessage", self.sendMessageTrigger)
 
     def getHandler(self, profile):
         return XEP_0071_handler(self)
@@ -86,11 +87,28 @@
         def converted(xhtml):
             data['extra']['xhtml'] = xhtml
             return data
-        txt_synt_plg = self.host.plugins["TEXT-SYNTAXES"]
-        d = txt_synt_plg.convert(body_elt.toXml(), self.SYNTAX_XHTML_IM, safe=True)
+        d = self.synt_plg.convert(body_elt.toXml(), self.SYNTAX_XHTML_IM, safe=True)
         d.addCallback(converted)
         return d
 
+    def _sendMessageAddRich(self, mess_data, profile):
+        """ Construct XHTML-IM node and add it XML element
+        @param mess_data: message data as sended by sendMessage callback
+        """
+        def syntax_converted(xhtml_im):
+            message_elt = mess_data['xml']
+            html_elt = message_elt.addElement('html', NS_XHTML_IM)
+            body_elt = html_elt.addElement('body', NS_XHTML)
+            body_elt.addRawXml(xhtml_im)
+            mess_data['extra']['xhtml'] = xhtml_im
+            return mess_data
+
+        rich = mess_data['extra'].pop('rich')
+        syntax = self.synt_plg.getCurrentSyntax(profile)
+        d = self.synt_plg.convert(rich, syntax, self.SYNTAX_XHTML_IM)
+        d.addCallback(syntax_converted)
+        return d
+
     def messageReceivedTrigger(self, message, post_treat, profile):
         """ Check presence of XHTML-IM in message
         """
@@ -104,6 +122,18 @@
             pass
         return True
 
+    def sendMessageTrigger(self, mess_data, treatments, profile):
+        """ Check presence of rich text in extra
+        """
+        try:
+            rich = mess_data['extra']['rich']
+            # OK, we have found rich text
+            treatments.addCallback(self._sendMessageAddRich, profile)
+        except KeyError:
+            # No rich text found
+            pass
+        return True
+
     def _purgeStyle(self, styles_raw):
         """ Remove unauthorised styles according to the XEP-0071
         @param styles_raw: raw styles (value of the style attribute)