summaryrefslogtreecommitdiff
path: root/src/xhtml.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/xhtml.py')
-rw-r--r--src/xhtml.py216
1 files changed, 186 insertions, 30 deletions
diff --git a/src/xhtml.py b/src/xhtml.py
index 8f629e3b..9bb2705d 100644
--- a/src/xhtml.py
+++ b/src/xhtml.py
@@ -22,12 +22,159 @@ from config import config
import logging
digits = '0123456789' # never trust the modules
+colors = {
+ 'aliceblue': 231,
+ 'antiquewhite': 231,
+ 'aqua': 51,
+ 'aquamarine': 122,
+ 'azure': 231,
+ 'beige': 231,
+ 'bisque': 230,
+ 'black': 232,
+ 'blanchedalmond': 230,
+ 'blue': 21,
+ 'blueviolet': 135,
+ 'brown': 124,
+ 'burlywood': 223,
+ 'cadetblue': 109,
+ 'chartreuse': 118,
+ 'chocolate': 172,
+ 'coral': 209,
+ 'cornflowerblue': 111,
+ 'cornsilk': 231,
+ 'crimson': 197,
+ 'cyan': 51,
+ 'darkblue': 19,
+ 'darkcyan': 37,
+ 'darkgoldenrod': 178,
+ 'darkgray': 247,
+ 'darkgreen': 28,
+ 'darkgrey': 247,
+ 'darkkhaki': 186,
+ 'darkmagenta': 127,
+ 'darkolivegreen': 65,
+ 'darkorange': 214,
+ 'darkorchid': 134,
+ 'darkred': 124,
+ 'darksalmon': 216,
+ 'darkseagreen': 151,
+ 'darkslateblue': 61,
+ 'darkslategray': 59,
+ 'darkslategrey': 59,
+ 'darkturquoise': 44,
+ 'darkviolet': 128,
+ 'deeppink': 199,
+ 'deepskyblue': 45,
+ 'dimgray': 241,
+ 'dimgrey': 241,
+ 'dodgerblue': 39,
+ 'firebrick': 160,
+ 'floralwhite': 231,
+ 'forestgreen': 34,
+ 'fuchsia': 201,
+ 'gainsboro': 252,
+ 'ghostwhite': 231,
+ 'gold': 226,
+ 'goldenrod': 214,
+ 'gray': 244,
+ 'green': 34,
+ 'greenyellow': 191,
+ 'grey': 244,
+ 'honeydew': 231,
+ 'hotpink': 212,
+ 'indianred': 174,
+ 'indigo': 55,
+ 'ivory': 231,
+ 'khaki': 229,
+ 'lavender': 231,
+ 'lavenderblush': 231,
+ 'lawngreen': 118,
+ 'lemonchiffon': 230,
+ 'lightblue': 195,
+ 'lightcoral': 217,
+ 'lightcyan': 231,
+ 'lightgoldenrodyellow': 230,
+ 'lightgray': 251,
+ 'lightgreen': 157,
+ 'lightgrey': 251,
+ 'lightpink': 224,
+ 'lightsalmon': 216,
+ 'lightseagreen': 43,
+ 'lightskyblue': 153,
+ 'lightslategray': 109,
+ 'lightslategrey': 109,
+ 'lightsteelblue': 189,
+ 'lightyellow': 231,
+ 'lime': 46,
+ 'limegreen': 77,
+ 'linen': 231,
+ 'magenta': 201,
+ 'maroon': 124,
+ 'mediumaquamarine': 115,
+ 'mediumblue': 20,
+ 'mediumorchid': 170,
+ 'mediumpurple': 141,
+ 'mediumseagreen': 78,
+ 'mediumslateblue': 105,
+ 'mediumspringgreen': 49,
+ 'mediumturquoise': 80,
+ 'mediumvioletred': 163,
+ 'midnightblue': 18,
+ 'mintcream': 231,
+ 'mistyrose': 231,
+ 'moccasin': 230,
+ 'navajowhite': 230,
+ 'navy': 19,
+ 'oldlace': 231,
+ 'olive': 142,
+ 'olivedrab': 106,
+ 'orange': 214,
+ 'orangered': 202,
+ 'orchid': 213,
+ 'palegoldenrod': 229,
+ 'palegreen': 157,
+ 'paleturquoise': 195,
+ 'palevioletred': 211,
+ 'papayawhip': 231,
+ 'peachpuff': 230,
+ 'peru': 179,
+ 'pink': 224,
+ 'plum': 219,
+ 'powderblue': 195,
+ 'purple': 127,
+ 'red': 196,
+ 'rosybrown': 181,
+ 'royalblue': 69,
+ 'saddlebrown': 130,
+ 'salmon': 216,
+ 'sandybrown': 216,
+ 'seagreen': 72,
+ 'seashell': 231,
+ 'sienna': 131,
+ 'silver': 250,
+ 'skyblue': 153,
+ 'slateblue': 104,
+ 'slategray': 109,
+ 'slategrey': 109,
+ 'snow': 231,
+ 'springgreen': 48,
+ 'steelblue': 74,
+ 'tan': 187,
+ 'teal': 37,
+ 'thistle': 225,
+ 'tomato': 209,
+ 'turquoise': 86,
+ 'violet': 219,
+ 'wheat': 230,
+ 'white': 255,
+ 'whitesmoke': 255,
+ 'yellow': 226,
+ 'yellowgreen': 149
+}
log = logging.getLogger(__name__)
-shell_colors_re = re.compile(r'(\[(?:\d+;)*(?:\d+m))')
-start_indent_re = re.compile(r'\[0;30m\[0;37m ')
-newline_indent_re = re.compile('\n\[0;37m ')
+whitespace_re = re.compile(r'\s+')
def get_body_from_message_stanza(message):
"""
@@ -41,31 +188,38 @@ def get_body_from_message_stanza(message):
return xhtml_to_poezio_colors(xhtml_body)
return message['body']
-
def xhtml_to_poezio_colors(text):
def parse_css(css):
- def get_color(string):
- if value == 'black':
- return 0
- if value == 'red':
- return 1
- if value == 'green':
- return 2
- if value == 'yellow':
- return 3
- if value == 'blue':
- return 4
- if value == 'magenta':
- return 5
- if value == 'cyan':
- return 6
- if value == 'white':
- return 7
- if value == 'default':
- return 8
+ def get_color(value):
+ if value[0] == '#':
+ value = value[1:]
+ length = len(value)
+ if length != 3 and length != 6:
+ return -1
+ value = int(value, 16)
+ if length == 6:
+ r = int(value >> 16)
+ g = int((value >> 8) & 0xff)
+ b = int(value & 0xff)
+ if r == g == b:
+ return 232 + int(r/10.6251)
+ div = 42.51
+ else:
+ r = int(value >> 8)
+ g = int((value >> 4) & 0xf)
+ b = int(value & 0xf)
+ if r == g == b:
+ return 232 + int(1.54*r)
+ div = 2.51
+ return 6*6*int(r/div) + 6*int(g/div) + int(b/div) + 16
+ if value in colors:
+ return colors[value]
+ return -1
shell = ''
rules = css.split(';')
for rule in rules:
+ if ':' not in rule:
+ continue
key, value = rule.split(':', 1)
key = key.strip()
value = value.strip()
@@ -73,7 +227,7 @@ def xhtml_to_poezio_colors(text):
if key == 'background-color':
pass#shell += '\x191'
elif key == 'color':
- shell += '\x19%d' % get_color(value)
+ shell += '\x19%d}' % get_color(value)
elif key == 'font-style':
shell += '\x19i'
elif key == 'font-weight':
@@ -89,13 +243,16 @@ def xhtml_to_poezio_colors(text):
shell += '\x19a'
return shell
+ def trim(string):
+ return re.sub(whitespace_re, ' ', string)
+
log.debug(text)
xml = ET.fromstring(text)
message = ''
for elem in xml.iter():
if elem.tag == '{http://www.w3.org/1999/xhtml}a':
if 'href' in elem.attrib and elem.attrib['href'] != elem.text:
- message += '\x19u%s\x19o (%s)' % (elem.attrib['href'], elem.text)
+ message += '\x19u%s\x19o (%s)' % (trim(elem.attrib['href']), trim(elem.text))
else:
message += '\x19u' + elem.text + '\x19o'
elif elem.tag == '{http://www.w3.org/1999/xhtml}blockquote':
@@ -109,8 +266,8 @@ def xhtml_to_poezio_colors(text):
elif elem.tag == '{http://www.w3.org/1999/xhtml}em':
message += '\x19i'
elif elem.tag == '{http://www.w3.org/1999/xhtml}img' and 'src' in elem.attrib:
- if elem.attrib['alt']:
- message += '%s (%s)' % (elem.attrib['src'], elem.attrib['alt'])
+ if 'alt' in elem.attrib:
+ message += '%s (%s)' % (trim(elem.attrib['src']), trim(elem.attrib['alt']))
else:
message += elem.attrib['src']
elif elem.tag == '{http://www.w3.org/1999/xhtml}li':
@@ -134,7 +291,7 @@ def xhtml_to_poezio_colors(text):
if (elem.text and elem.tag != '{http://www.w3.org/1999/xhtml}a'
and elem.tag != '{http://www.w3.org/1999/xhtml}br'
and elem.tag != '{http://www.w3.org/1999/xhtml}img'):
- message += elem.text
+ message += trim(elem.text)
if ('style' in elem.attrib and elem.tag != '{http://www.w3.org/1999/xhtml}br'
and elem.tag != '{http://www.w3.org/1999/xhtml}em'
@@ -156,7 +313,7 @@ def xhtml_to_poezio_colors(text):
message += ' [' + elem.attrib['title'] + ']'
if elem.tail:
- message += elem.tail
+ message += trim(elem.tail)
return message
@@ -223,7 +380,6 @@ def poezio_colors_to_html(string):
res += "</p></body>"
return res.replace('\n', '<br />')
-
def poezio_colors_to_xhtml(string):
"""
Generate a valid xhtml string from