diff options
Diffstat (limited to 'src/xhtml.py')
-rw-r--r-- | src/xhtml.py | 216 |
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 |