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' : '␀', '\x01' : '␁', '\x02' : '␂',
@@ -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