summaryrefslogtreecommitdiff
path: root/slixmpp/plugins/xep_0394/stanza.py
blob: f15a9ba115afc38b7a592a2b9743ebdbfe735aac (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
"""
    Slixmpp: The Slick XMPP Library
    Copyright (C) 2017 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
    This file is part of Slixmpp.

    See the file LICENSE for copying permission.
"""

from slixmpp.xmlstream import ElementBase, register_stanza_plugin, ET


class Markup(ElementBase):
    namespace = 'urn:xmpp:markup:0'
    name = 'markup'
    plugin_attrib = 'markup'


class _FirstLevel(ElementBase):
    namespace = 'urn:xmpp:markup:0'
    interfaces = {'start', 'end'}

    def get_start(self):
        return int(self._get_attr('start'))

    def set_start(self, value):
        self._set_attr('start', '%d' % value)

    def get_end(self):
        return int(self._get_attr('end'))

    def set_end(self, value):
        self._set_attr('end', '%d' % value)

class Span(_FirstLevel):
    name = 'span'
    plugin_attrib = 'span'
    plugin_multi_attrib = 'spans'
    interfaces = {'start', 'end', 'types'}

    def get_types(self):
        types = []
        if self.xml.find('{urn:xmpp:markup:0}emphasis') is not None:
            types.append('emphasis')
        if self.xml.find('{urn:xmpp:markup:0}code') is not None:
            types.append('code')
        if self.xml.find('{urn:xmpp:markup:0}deleted') is not None:
            types.append('deleted')
        return types

    def set_types(self, value):
        del self['types']
        for type_ in value:
            if type_ == 'emphasis':
                self.xml.append(ET.Element('{urn:xmpp:markup:0}emphasis'))
            elif type_ == 'code':
                self.xml.append(ET.Element('{urn:xmpp:markup:0}code'))
            elif type_ == 'deleted':
                self.xml.append(ET.Element('{urn:xmpp:markup:0}deleted'))

    def det_types(self):
        for child in self.xml:
            self.xml.remove(child)


class _SpanType(ElementBase):
    namespace = 'urn:xmpp:markup:0'


class EmphasisType(_SpanType):
    name = 'emphasis'
    plugin_attrib = 'emphasis'


class CodeType(_SpanType):
    name = 'code'
    plugin_attrib = 'code'


class DeletedType(_SpanType):
    name = 'deleted'
    plugin_attrib = 'deleted'


class BlockCode(_FirstLevel):
    name = 'bcode'
    plugin_attrib = 'bcode'
    plugin_multi_attrib = 'bcodes'


class List(_FirstLevel):
    name = 'list'
    plugin_attrib = 'list'
    plugin_multi_attrib = 'lists'
    interfaces = {'start', 'end', 'li'}


class Li(ElementBase):
    namespace = 'urn:xmpp:markup:0'
    name = 'li'
    plugin_attrib = 'li'
    plugin_multi_attrib = 'lis'
    interfaces = {'start'}

    def get_start(self):
        return int(self._get_attr('start'))

    def set_start(self, value):
        self._set_attr('start', '%d' % value)


class BlockQuote(_FirstLevel):
    name = 'bquote'
    plugin_attrib = 'bquote'
    plugin_multi_attrib = 'bquotes'

register_stanza_plugin(Markup, Span, iterable=True)
register_stanza_plugin(Markup, BlockCode, iterable=True)
register_stanza_plugin(Markup, List, iterable=True)
register_stanza_plugin(Markup, BlockQuote, iterable=True)
register_stanza_plugin(Span, EmphasisType)
register_stanza_plugin(Span, CodeType)
register_stanza_plugin(Span, DeletedType)
register_stanza_plugin(List, Li, iterable=True)