summaryrefslogtreecommitdiff
path: root/slixmpp/plugins/xep_0071/stanza.py
blob: bd3236e85556f12615bb9a05c765737b9fc08a87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

# 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.stanza import Message
from slixmpp.util import unicode
from slixmpp.xmlstream import ElementBase, ET, register_stanza_plugin, 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