summaryrefslogtreecommitdiff
path: root/slixmpp/plugins/xep_0394/stanza.py
diff options
context:
space:
mode:
Diffstat (limited to 'slixmpp/plugins/xep_0394/stanza.py')
-rw-r--r--slixmpp/plugins/xep_0394/stanza.py123
1 files changed, 123 insertions, 0 deletions
diff --git a/slixmpp/plugins/xep_0394/stanza.py b/slixmpp/plugins/xep_0394/stanza.py
new file mode 100644
index 00000000..f15a9ba1
--- /dev/null
+++ b/slixmpp/plugins/xep_0394/stanza.py
@@ -0,0 +1,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)