[patchew-devel] [PATCH 8/9] ansi2html: add support for 16-color palette

  • From: Paolo Bonzini <pbonzini@xxxxxxxxxx>
  • To: patchew-devel@xxxxxxxxxxxxx
  • Date: Mon, 26 Feb 2018 12:27:21 +0100

This includes inverted and dimmed text.

Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
---
 patchew/logviewer.py     |  53 ++++++++++++++++
 static/css/ansi2html.css |  22 ++++++-
 tests/test_ansi2html.py  | 159 +++++++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 228 insertions(+), 6 deletions(-)

diff --git a/patchew/logviewer.py b/patchew/logviewer.py
index 8114eb6..e035d54 100644
--- a/patchew/logviewer.py
+++ b/patchew/logviewer.py
@@ -22,6 +22,8 @@ class ANSI2HTMLConverter(object):
     RE_OSC = r'].*?(?:\x1B\\|\x07)'
     RE_CONTROL = '\x1B(?:%s|%s|[^][])|\r\n|[\b\t\n\f\r]' % (RE_CSI, RE_OSC)
     RE = re.compile('(%s)|(%s)' % (RE_STRING, RE_CONTROL))
+    COLORS = [ "BLK", "RED", "GRN", "YEL", "BLU", "MAG", "CYN", "WHI",
+               "HIK", "HIR", "HIG", "HIY", "HIB", "HIM", "HIC", "HIW" ]
 
     ENTITIES = {
         '\x00' : '&#x2400;', '\x01' : '&#x2401;',  '\x02' : '&#x2402;',
@@ -41,12 +43,16 @@ class ANSI2HTMLConverter(object):
     def __init__(self, white_bg=False):
         self.class_to_id = {}
         self.id_to_class = []
+        self.default_fg = 0 if white_bg else 7
+        self.default_bg = 7 if white_bg else 0
         self.cur_class = self._class_to_id("")
         self.prefix = '<pre class="ansi">'
         self._reset()
         self._reset_attrs()
 
     def _reset_attrs(self):
+        self.fg = None
+        self.bg = None
         self.dim = 0
         self.bold = 0
         self.italic = 0
@@ -161,6 +167,22 @@ class ANSI2HTMLConverter(object):
                 self.inverse = 0
             elif arg == 29:
                 self.strike = 0
+        elif (arg >= 30 and arg <= 37) or (arg >= 91 and arg <= 96):
+            # we use light colors by default, so 31..36 and 91..96 are the same
+            self.fg = arg % 10
+        elif arg == 39:
+            self.fg = None
+        elif (arg >= 40 and arg <= 47) or (arg >= 101 and arg <= 106):
+            # we use light colors by default, so 31..36 and 91..96 are the same
+            self.bg = arg % 10
+        elif arg == 49:
+            self.bg = None
+        elif arg == 90 or arg == 97:
+            # the remaining light colors: dark grey and white
+            self.fg = arg - 82
+        elif arg == 100 or arg == 107:
+            # the remaining light colors: dark grey and white
+            self.bg = arg - 92
 
     def _class_to_id(self, html_class):
         class_id = self.class_to_id.get(html_class, None)
@@ -170,8 +192,39 @@ class ANSI2HTMLConverter(object):
             self.id_to_class.append(html_class)
         return class_id
 
+    def _map_color(self, color, default, dim):
+        # map a color assigned by _do_one_csi_m to an index in the COLORS array
+
+        color = color if color is not None else default
+        if dim:
+            # must be foreground color
+            # unlike vte which has a "very dark" grey, for simplicity
+            # dark grey remains dark grey
+            return 8 if color == default or color == 8 else color&~8
+        else:
+            # use light colors by default, except for black and light grey
+            # (but see bold case in _compute_class)
+            return color if color == 0 or color == 7 else color|8
+
     def _compute_class(self):
+        fg = self._map_color(self.fg, self.default_fg, self.dim)
+        bg = self._map_color(self.bg, self.default_bg, False)
+
+        # apply inverse now: "inverse dim" affects the *background* color!
+        if self.inverse:
+            fg, bg = bg, fg
+
+        # bold turns foreground light grey into white
+        if fg == 7 and not self.dim and self.bold:
+            fg = 15
+
+        # now compute CSS classes
         classes = []
+        if fg != self.default_fg:
+            classes.append(self.COLORS[fg])
+        if bg != self.default_bg:
+            classes.append('B' + self.COLORS[bg])
+
         if self.bold:
             classes.append('BOLD')
         if self.italic:
diff --git a/static/css/ansi2html.css b/static/css/ansi2html.css
index fa656a6..5435844 100644
--- a/static/css/ansi2html.css
+++ b/static/css/ansi2html.css
@@ -1,5 +1,5 @@
 /* For black and white background respectively: */
-.ansi {color:#e8e2d2}
+.ansi {color:#eee8d5}
 /* .ansi {color:#000} */
 
 .ansi>.BOLD {font-weight: bold}
@@ -7,3 +7,23 @@
 .ansi>.UND {text-decoration: underline}
 .ansi>.STR {text-decoration: line-through}
 .ansi>.UNDSTR {text-decoration: underline line-through}
+
+/* 16-color palette.  Default-intensity colors are based on Solarized,
+ * dimmed colors are just 2/3 of the default intensity.
+ */
+.ansi>.BLK  {color:#000000} .ansi>.BBLK {background-color:#000000}
+.ansi>.RED  {color:#93211f} .ansi>.BRED {background-color:#93211f}
+.ansi>.GRN  {color:#596600} .ansi>.BGRN {background-color:#596600}
+.ansi>.YEL  {color:#795b00} .ansi>.BYEL {background-color:#795b00}
+.ansi>.BLU  {color:#484b83} .ansi>.BBLU {background-color:#484b83}
+.ansi>.MAG  {color:#8d2457} .ansi>.BMAG {background-color:#8d2457}
+.ansi>.CYN  {color:#1c6b65} .ansi>.BCYN {background-color:#1c6b65}
+.ansi>.WHI  {color:#eee8d5} .ansi>.BWHI {background-color:#eee8d5}
+.ansi>.HIK  {color:#586e75} .ansi>.BHIK {background-color:#586e75}
+.ansi>.HIR  {color:#dc322f} .ansi>.BHIR {background-color:#dc322f}
+.ansi>.HIG  {color:#859900} .ansi>.BHIG {background-color:#859900}
+.ansi>.HIY  {color:#b58900} .ansi>.BHIY {background-color:#b58900}
+.ansi>.HIB  {color:#6c71c4} .ansi>.BHIB {background-color:#6c71c4}
+.ansi>.HIM  {color:#d33682} .ansi>.BHIM {background-color:#d33682}
+.ansi>.HIC  {color:#2aa198} .ansi>.BHIC {background-color:#2aa198}
+.ansi>.HIW  {color:#fdf6e3} .ansi>.BHIW {background-color:#fdf6e3}
diff --git a/tests/test_ansi2html.py b/tests/test_ansi2html.py
index f0ee0ad..b264d85 100644
--- a/tests/test_ansi2html.py
+++ b/tests/test_ansi2html.py
@@ -94,37 +94,186 @@ class ANSI2HTMLTest(unittest.TestCase):
         self.assertWhiteBg('A\x1b[0mBC', 'ABC')
         self.assertBlackBg('\x1b[30;41m', '')
         self.assertWhiteBg('\x1b[30;41m', '')
-        self.assertBlackBg('\x1b[1mABC', '<span class="BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[1mABC', '<span class="HIW BOLD">ABC</span>')
         self.assertWhiteBg('\x1b[1mABC', '<span class="BOLD">ABC</span>')
-        self.assertBlackBg('A\x1b[1mBC', 'A<span class="BOLD">BC</span>')
+        self.assertBlackBg('A\x1b[1mBC', 'A<span class="HIW BOLD">BC</span>')
         self.assertWhiteBg('A\x1b[1mBC', 'A<span class="BOLD">BC</span>')
-        self.assertBlackBg('\x1b[1mAB\x1b[0mC', '<span 
class="BOLD">AB</span>C')
+        self.assertBlackBg('\x1b[1mAB\x1b[0mC', '<span class="HIW 
BOLD">AB</span>C')
         self.assertWhiteBg('\x1b[1mAB\x1b[0mC', '<span 
class="BOLD">AB</span>C')
-        self.assertBlackBg('A\x1b[1mB\x1b[0mC', 'A<span 
class="BOLD">B</span>C')
+        self.assertBlackBg('A\x1b[1mB\x1b[0mC', 'A<span class="HIW 
BOLD">B</span>C')
         self.assertWhiteBg('A\x1b[1mB\x1b[0mC', 'A<span 
class="BOLD">B</span>C')
-        self.assertBlackBg('A\x1b[1mB\x1b[0m\x1b[1mC', 'A<span 
class="BOLD">BC</span>')
+        self.assertBlackBg('A\x1b[1mB\x1b[0m\x1b[1mC', 'A<span class="HIW 
BOLD">BC</span>')
         self.assertWhiteBg('A\x1b[1mB\x1b[0m\x1b[1mC', 'A<span 
class="BOLD">BC</span>')
 
+    # basic dim and dim+bold tests
+    def test_dim_bold(self):
+        self.assertBlackBg('\x1b[2mABC', '<span class="HIK">ABC</span>')
+        self.assertWhiteBg('\x1b[2mABC', '<span class="HIK">ABC</span>')
+        self.assertBlackBg('\x1b[2;1mABC', '<span class="HIK BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[2;1mABC', '<span class="HIK BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[1;21mABC', 'ABC')
+        self.assertWhiteBg('\x1b[1;21mABC', 'ABC')
+        self.assertBlackBg('\x1b[2;21mABC', 'ABC')
+        self.assertWhiteBg('\x1b[2;21mABC', 'ABC')
+        self.assertBlackBg('\x1b[1;22mABC', 'ABC')
+        self.assertWhiteBg('\x1b[1;22mABC', 'ABC')
+        self.assertBlackBg('\x1b[2;22mABC', 'ABC')
+        self.assertWhiteBg('\x1b[2;22mABC', 'ABC')
+
+    # background and foreground colors
+    def test_colors(self):
+        self.assertBlackBg('\x1b[31mABC', '<span class="HIR">ABC</span>')
+        self.assertWhiteBg('\x1b[31mABC', '<span class="HIR">ABC</span>')
+        self.assertBlackBg('\x1b[31;1mABC', '<span class="HIR 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[31;1mABC', '<span class="HIR 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[31;2mABC', '<span class="RED">ABC</span>')
+        self.assertWhiteBg('\x1b[31;2mABC', '<span class="RED">ABC</span>')
+        self.assertBlackBg('\x1b[31;2;1mABC', '<span class="RED 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[31;2;1mABC', '<span class="RED 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[31mAB\x1b[39mC', '<span 
class="HIR">AB</span>C')
+        self.assertWhiteBg('\x1b[31mAB\x1b[39mC', '<span 
class="HIR">AB</span>C')
+        self.assertBlackBg('\x1b[30mABC', '<span class="BLK">ABC</span>')
+        self.assertWhiteBg('\x1b[30mABC', 'ABC')
+        self.assertBlackBg('\x1b[30;1mABC', '<span class="BLK 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[30;1mABC', '<span class="BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[30;2mABC', '<span class="BLK">ABC</span>')
+        self.assertWhiteBg('\x1b[30;2mABC', '<span class="HIK">ABC</span>')
+        self.assertBlackBg('\x1b[30;2;1mABC', '<span class="BLK 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[30;2;1mABC', '<span class="HIK 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[37mABC', 'ABC')
+        self.assertWhiteBg('\x1b[37mABC', '<span class="WHI">ABC</span>')
+        self.assertBlackBg('\x1b[37;1mABC', '<span class="HIW 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[37;1mABC', '<span class="HIW 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[37;2mABC', '<span class="HIK">ABC</span>')
+        self.assertWhiteBg('\x1b[37;2mABC', '<span class="WHI">ABC</span>')
+        self.assertBlackBg('\x1b[37;2;1mABC', '<span class="HIK 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[37;2;1mABC', '<span class="WHI 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[46mABC', '<span class="BHIC">ABC</span>')
+        self.assertWhiteBg('\x1b[46mABC', '<span class="BHIC">ABC</span>')
+        self.assertBlackBg('\x1b[46mAB\x1b[49mC', '<span 
class="BHIC">AB</span>C')
+        self.assertWhiteBg('\x1b[46mAB\x1b[49mC', '<span 
class="BHIC">AB</span>C')
+        self.assertBlackBg('\x1b[46;31mABC', '<span class="HIR 
BHIC">ABC</span>')
+        self.assertWhiteBg('\x1b[46;31mABC', '<span class="HIR 
BHIC">ABC</span>')
+        self.assertBlackBg('\x1b[46;31;1mABC', '<span class="HIR BHIC 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[46;31;1mABC', '<span class="HIR BHIC 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[46;31;2mABC', '<span class="RED 
BHIC">ABC</span>')
+        self.assertWhiteBg('\x1b[46;31;2mABC', '<span class="RED 
BHIC">ABC</span>')
+        self.assertBlackBg('\x1b[46;31;2;1mABC', '<span class="RED BHIC 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[46;31;2;1mABC', '<span class="RED BHIC 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[46;37mABC', '<span class="BHIC">ABC</span>')
+        self.assertWhiteBg('\x1b[46;37mABC', '<span class="WHI 
BHIC">ABC</span>')
+        self.assertBlackBg('\x1b[46;37;1mABC', '<span class="HIW BHIC 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[46;37;1mABC', '<span class="HIW BHIC 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[46;37;2mABC', '<span class="HIK 
BHIC">ABC</span>')
+        self.assertWhiteBg('\x1b[46;37;2mABC', '<span class="WHI 
BHIC">ABC</span>')
+        self.assertBlackBg('\x1b[46;37;2;1mABC', '<span class="HIK BHIC 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[46;37;2;1mABC', '<span class="WHI BHIC 
BOLD">ABC</span>')
+
+    # more colors
+    def test_colors_extra(self):
+        self.assertBlackBg('\x1b[90mABC', '<span class="HIK">ABC</span>')
+        self.assertWhiteBg('\x1b[90mABC', '<span class="HIK">ABC</span>')
+        self.assertBlackBg('\x1b[90;1mABC', '<span class="HIK 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[90;1mABC', '<span class="HIK 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[90;2mABC', '<span class="HIK">ABC</span>')
+        self.assertWhiteBg('\x1b[90;2mABC', '<span class="HIK">ABC</span>')
+        self.assertBlackBg('\x1b[90;2;1mABC', '<span class="HIK 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[90;2;1mABC', '<span class="HIK 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[97;1mABC', '<span class="HIW 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[97;1mABC', '<span class="HIW 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[97;2mABC', 'ABC')
+        self.assertWhiteBg('\x1b[97;2mABC', '<span class="WHI">ABC</span>')
+        self.assertBlackBg('\x1b[97;2;1mABC', '<span class="BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[97;2;1mABC', '<span class="WHI 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[100mABC', '<span class="BHIK">ABC</span>')
+        self.assertWhiteBg('\x1b[100mABC', '<span class="BHIK">ABC</span>')
+
     # italic, underline, strikethrough
     def test_text_variants(self):
         self.assertBlackBg('\x1b[3mABC', '<span class="ITA">ABC</span>')
         self.assertWhiteBg('\x1b[3mABC', '<span class="ITA">ABC</span>')
+        self.assertBlackBg('\x1b[3;31mABC', '<span class="HIR ITA">ABC</span>')
+        self.assertWhiteBg('\x1b[3;31mABC', '<span class="HIR ITA">ABC</span>')
         self.assertBlackBg('\x1b[3mAB\x1b[23mC', '<span 
class="ITA">AB</span>C')
         self.assertWhiteBg('\x1b[3mAB\x1b[23mC', '<span 
class="ITA">AB</span>C')
+        self.assertBlackBg('\x1b[3;31mAB\x1b[23mC', '<span class="HIR 
ITA">AB</span><span class="HIR">C</span>')
+        self.assertWhiteBg('\x1b[3;31mAB\x1b[23mC', '<span class="HIR 
ITA">AB</span><span class="HIR">C</span>')
         self.assertBlackBg('\x1b[4mABC', '<span class="UND">ABC</span>')
         self.assertWhiteBg('\x1b[4mABC', '<span class="UND">ABC</span>')
+        self.assertBlackBg('\x1b[4;31mABC', '<span class="HIR UND">ABC</span>')
+        self.assertWhiteBg('\x1b[4;31mABC', '<span class="HIR UND">ABC</span>')
         self.assertBlackBg('\x1b[4mAB\x1b[24mC', '<span 
class="UND">AB</span>C')
         self.assertWhiteBg('\x1b[4mAB\x1b[24mC', '<span 
class="UND">AB</span>C')
+        self.assertBlackBg('\x1b[4;31mAB\x1b[24mC', '<span class="HIR 
UND">AB</span><span class="HIR">C</span>')
+        self.assertWhiteBg('\x1b[4;31mAB\x1b[24mC', '<span class="HIR 
UND">AB</span><span class="HIR">C</span>')
         self.assertBlackBg('\x1b[9mABC', '<span class="STR">ABC</span>')
         self.assertWhiteBg('\x1b[9mABC', '<span class="STR">ABC</span>')
         self.assertBlackBg('\x1b[9mAB\x1b[29mC', '<span 
class="STR">AB</span>C')
         self.assertWhiteBg('\x1b[9mAB\x1b[29mC', '<span 
class="STR">AB</span>C')
+        self.assertBlackBg('\x1b[9;31mAB\x1b[29mC', '<span class="HIR 
STR">AB</span><span class="HIR">C</span>')
+        self.assertWhiteBg('\x1b[9;31mAB\x1b[29mC', '<span class="HIR 
STR">AB</span><span class="HIR">C</span>')
+        self.assertBlackBg('\x1b[9;31mABC', '<span class="HIR STR">ABC</span>')
+        self.assertWhiteBg('\x1b[9;31mABC', '<span class="HIR STR">ABC</span>')
         self.assertBlackBg('\x1b[4;9mABC', '<span class="UNDSTR">ABC</span>')
         self.assertWhiteBg('\x1b[4;9mABC', '<span class="UNDSTR">ABC</span>')
+        self.assertBlackBg('\x1b[4;9;31mABC', '<span class="HIR 
UNDSTR">ABC</span>')
+        self.assertWhiteBg('\x1b[4;9;31mABC', '<span class="HIR 
UNDSTR">ABC</span>')
         self.assertBlackBg('\x1b[4;9mAB\x1b[24mC', '<span 
class="UNDSTR">AB</span><span class="STR">C</span>')
         self.assertWhiteBg('\x1b[4;9mAB\x1b[24mC', '<span 
class="UNDSTR">AB</span><span class="STR">C</span>')
         self.assertBlackBg('\x1b[4;9mAB\x1b[29mC', '<span 
class="UNDSTR">AB</span><span class="UND">C</span>')
         self.assertWhiteBg('\x1b[4;9mAB\x1b[29mC', '<span 
class="UNDSTR">AB</span><span class="UND">C</span>')
 
+    # invert
+    def test_invert(self):
+        self.assertBlackBg('\x1b[7mABC', '<span class="BLK BWHI">ABC</span>')
+        self.assertWhiteBg('\x1b[7mABC', '<span class="WHI BBLK">ABC</span>')
+        self.assertBlackBg('\x1b[7mABC\r', '<span class="BLK BWHI">ABC</span>')
+        self.assertWhiteBg('\x1b[7mABC\r', '<span class="WHI BBLK">ABC</span>')
+        self.assertBlackBg('\x1b[30;7mABC', '<span class="BLK">ABC</span>')
+        self.assertWhiteBg('\x1b[30;7mABC', '<span class="WHI 
BBLK">ABC</span>')
+        self.assertBlackBg('\x1b[30;1;7mABC', '<span class="BLK 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[30;1;7mABC', '<span class="HIW BBLK 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[37;7mABC', '<span class="BLK 
BWHI">ABC</span>')
+        self.assertWhiteBg('\x1b[37;7mABC', '<span class="WHI">ABC</span>')
+        self.assertBlackBg('\x1b[37;1;7mABC', '<span class="BLK BWHI 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[37;1;7mABC', '<span class="HIW 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[46;7mABC', '<span class="HIC 
BWHI">ABC</span>')
+        self.assertWhiteBg('\x1b[46;7mABC', '<span class="HIC 
BBLK">ABC</span>')
+        self.assertBlackBg('\x1b[46;1;7mABC', '<span class="HIC BWHI 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[46;1;7mABC', '<span class="HIC BBLK 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[46;31;7mABC', '<span class="HIC 
BHIR">ABC</span>')
+        self.assertWhiteBg('\x1b[46;31;7mABC', '<span class="HIC 
BHIR">ABC</span>')
+        self.assertBlackBg('\x1b[46;31;7mAB\x1b[27mC', '<span class="HIC 
BHIR">AB</span><span class="HIR BHIC">C</span>')
+        self.assertWhiteBg('\x1b[46;31;7mAB\x1b[27mC', '<span class="HIC 
BHIR">AB</span><span class="HIR BHIC">C</span>')
+        self.assertBlackBg('\x1b[36;47;1;7mABC', '<span class="HIW BHIC 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[36;47;1;7mABC', '<span class="HIW BHIC 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[36;47;2;7mABC', '<span 
class="BCYN">ABC</span>')
+        self.assertWhiteBg('\x1b[36;47;2;7mABC', '<span class="WHI 
BCYN">ABC</span>')
+        self.assertBlackBg('\x1b[36;47;2;1;7mABC', '<span class="BCYN 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[36;47;2;1;7mABC', '<span class="WHI BCYN 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[90;7mABC', '<span class="BLK 
BHIK">ABC</span>')
+        self.assertWhiteBg('\x1b[90;7mABC', '<span class="WHI 
BHIK">ABC</span>')
+        self.assertBlackBg('\x1b[90;1;7mABC', '<span class="BLK BHIK 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[90;1;7mABC', '<span class="HIW BHIK 
BOLD">ABC</span>')
+        self.assertBlackBg('\x1b[100;7mABC', '<span class="HIK 
BWHI">ABC</span>')
+        self.assertWhiteBg('\x1b[100;7mABC', '<span class="HIK 
BBLK">ABC</span>')
+        self.assertBlackBg('\x1b[100;1;7mABC', '<span class="HIK BWHI 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[100;1;7mABC', '<span class="HIK BBLK 
BOLD">ABC</span>')
+        # vte uses BHIK here??
+        self.assertBlackBg('\x1b[47;30;1;7mABC', '<span class="HIW 
BOLD">ABC</span>')
+        self.assertWhiteBg('\x1b[47;30;1;7mABC', '<span class="HIW BBLK 
BOLD">ABC</span>')
+
+    # combining cursor movement and formatting
+    def test_movement_and_formatting(self):
+        self.assertBlackBg('\x1b[42m\tabc', '        <span 
class="BHIG">abc</span>')
+        self.assertWhiteBg('\x1b[42m\tabc', '        <span 
class="BHIG">abc</span>')
+        self.assertBlackBg('abc\x1b[42m\x1b[1Kabc', '   <span 
class="BHIG">abc</span>')
+        self.assertWhiteBg('abc\x1b[42m\x1b[1Kabc', '   <span 
class="BHIG">abc</span>')
+        self.assertBlackBg('\x1b[7m\tabc', '        <span class="BLK 
BWHI">abc</span>')
+        self.assertWhiteBg('\x1b[7m\tabc', '        <span class="WHI 
BBLK">abc</span>')
+        self.assertBlackBg('abc\x1b[7m\x1b[1Kabc', '   <span class="BLK 
BWHI">abc</span>')
+        self.assertWhiteBg('abc\x1b[7m\x1b[1Kabc', '   <span class="WHI 
BBLK">abc</span>')
+
+
 if __name__ == '__main__':
     unittest.main()
-- 
2.14.3



Other related posts:

  • » [patchew-devel] [PATCH 8/9] ansi2html: add support for 16-color palette - Paolo Bonzini