# -*- coding: utf-8 -*- """ Created : 2021-07-30 @author: Eric Lapouyade """ import six try: from html import escape except ImportError: # cgi.escape is deprecated in python 3.7 from cgi import escape class RichText(object): """ class to generate Rich Text when using templates variables This is much faster than using Subdoc class, but this only for texts INSIDE an existing paragraph. """ def __init__(self, text=None, **text_prop): self.xml = '' if text: self.add(text, **text_prop) def add(self, text, style=None, color=None, highlight=None, size=None, subscript=None, superscript=None, bold=False, italic=False, underline=False, strike=False, font=None, url_id=None): # If a RichText is added if isinstance(text, RichText): self.xml += text.xml return # If not a string : cast to string (ex: int, dict etc...) if not isinstance(text, (six.text_type, six.binary_type)): text = six.text_type(text) if not isinstance(text, six.text_type): text = text.decode('utf-8', errors='ignore') text = escape(text) prop = u'' if style: prop += u'' % style if color: if color[0] == '#': color = color[1:] prop += u'' % color if highlight: if highlight[0] == '#': highlight = highlight[1:] prop += u'' % highlight if size: prop += u'' % size prop += u'' % size if subscript: prop += u'' if superscript: prop += u'' if bold: prop += u'' if italic: prop += u'' if underline: if underline not in ['single', 'double', 'thick', 'dotted', 'dash', 'dotDash', 'dotDotDash', 'wave']: underline = 'single' prop += u'' % underline if strike: prop += u'' if font: prop += (u'' .format(font=font)) xml = u'' if prop: xml += u'%s' % prop xml += u'%s' % text if url_id: xml = (u'%s' % (url_id, xml)) self.xml += xml def __unicode__(self): return self.xml def __str__(self): return self.xml def __html__(self): return self.xml R = RichText