Skip to content
Back to top

# Source code for slixmpp.plugins.xep_0071.stanza

    # Slixmpp: The Slick XMPP Library
    # Copyright (C) 2012  Nathanael C. Fritz
    # This file is part of Slixmpp.
    # See the file LICENSE for copying permission.
    from slixmpp.util import unicode
    from slixmpp.xmlstream import ElementBase, ET, tostring

    XHTML_NS = 'http://www.w3.org/1999/xhtml'

    class XHTML_IM(ElementBase):

        namespace = 'http://jabber.org/protocol/xhtml-im'
        name = 'html'
        interfaces = {'body'}
        lang_interfaces = {'body'}
        plugin_attrib = name

        def set_body(self, content, lang=None):
            if lang is None:
                lang = self.get_lang()
            self.del_body(lang)
            if lang == '*':
                for sublang, subcontent in content.items():
                    self.set_body(subcontent, sublang)
            else:
                if isinstance(content, type(ET.Element('test'))):
                    content = unicode(ET.tostring(content))
                else:
                    content = unicode(content)
                header = '<body xmlns="%s"' % XHTML_NS
                if lang:
                    header = '%s xml:lang="%s"' % (header, lang)
                content = '%s>%s</body>' % (header, content)
                xhtml = ET.fromstring(content)
                self.xml.append(xhtml)

        def get_body(self, lang=None):
            """Return the contents of the HTML body."""
            if lang is None:
                lang = self.get_lang()

            bodies = self.xml.findall('{%s}body' % XHTML_NS)

            if lang == '*':
                result = {}
                for body in bodies:
                    body_lang = body.attrib.get('{%s}lang' % self.xml_ns, '')
                    body_result = []
                    body_result.append(body.text if body.text else '')
                    for child in body:
                        body_result.append(tostring(child, xmlns=XHTML_NS))
                    body_result.append(body.tail if body.tail else '')
                    result[body_lang] = ''.join(body_result)
                return result
            else:
                for body in bodies:
                    if body.attrib.get('{%s}lang' % self.xml_ns, self.get_lang()) == lang:
                        result = []
                        result.append(body.text if body.text else '')
                        for child in body:
                            result.append(tostring(child, xmlns=XHTML_NS))
                        result.append(body.tail if body.tail else '')
                        return ''.join(result)
            return ''

        def del_body(self, lang=None):
            if lang is None:
                lang = self.get_lang()
            bodies = self.xml.findall('{%s}body' % XHTML_NS)
            for body in bodies:
                if body.attrib.get('{%s}lang' % self.xml_ns, self.get_lang()) == lang:
                    self.xml.remove(body)
                    return