From 686e8529747d111ced409dfc96021d58d96688d9 Mon Sep 17 00:00:00 2001 From: chhsiao90 Date: Sat, 10 Sep 2016 13:45:58 +0800 Subject: [PATCH] Enhance pygments style integration --- gviewer/styles/default.py | 2 +- gviewer/styles/util.py | 42 +++++++++++++++++++++---------- gviewer/tests/styles/test_util.py | 30 +++++++++++----------- 3 files changed, 45 insertions(+), 29 deletions(-) diff --git a/gviewer/styles/default.py b/gviewer/styles/default.py index f90d947..e45e5a5 100644 --- a/gviewer/styles/default.py +++ b/gviewer/styles/default.py @@ -5,7 +5,7 @@ except: # pragma: no cover pygments_style = [] else: - pygments_style = palette_from_pygments(get_style_by_name("default").styles) + pygments_style = palette_from_pygments(get_style_by_name("default")) palette = [ ("header", "white,bold", "dark green"), diff --git a/gviewer/styles/util.py b/gviewer/styles/util.py index c8dec1c..9c52dc5 100644 --- a/gviewer/styles/util.py +++ b/gviewer/styles/util.py @@ -29,9 +29,25 @@ ]) +def palette_from_pygments(style): + palettes = dict() + for k, v in style.styles.iteritems(): + if v: + palettes[k] = _parse_pygments_style(v) + + for token, style in palettes.items(): + _enrich_pygments_style_subtypes(palettes, token, style) + + palettes_list = [] + for k, v in palettes.iteritems(): + palette = [k] + palette.extend(v) + palettes_list.append(palette) + return palettes_list + + class _PygmentsStyle(object): - def __init__(self, name): - self.name = name + def __init__(self): self.text_color = "default" self.bg_color = "default" self.styles = [] @@ -54,10 +70,10 @@ def update(self, value): def palette(self): if self.high_text_color: - return (self.name, ",".join(self.styles + [self.text_color]), + return (",".join(self.styles + [self.text_color]), self.bg_color, None, self.high_text_color, self.high_bg_color) else: - return (self.name, ",".join(self.styles + [self.text_color]), + return (",".join(self.styles + [self.text_color]), self.bg_color) @@ -82,15 +98,15 @@ def _parse_pygments_color(value): raise ValueError("not legal color code: {0}".format(value)) -def palette_from_pygments(styles): - palettes = [] - for k, v in styles.iteritems(): - palettes.append(_parse_pygments_style(k, v)) - return palettes - - -def _parse_pygments_style(style_name, style_value): - style = _PygmentsStyle(style_name) +def _parse_pygments_style(style_value): + style = _PygmentsStyle() for style_item in style_value.split(" "): style.update(style_item) return style.palette() + + +def _enrich_pygments_style_subtypes(palettes, token, style): + if token not in palettes: + palettes[token] = style + for child_token in token.subtypes: + _enrich_pygments_style_subtypes(palettes, child_token, style) diff --git a/gviewer/tests/styles/test_util.py b/gviewer/tests/styles/test_util.py index bcca4d4..ea969ab 100644 --- a/gviewer/tests/styles/test_util.py +++ b/gviewer/tests/styles/test_util.py @@ -8,60 +8,60 @@ class TestPygmentsStyle(unittest.TestCase): def test_default(self): - style = _PygmentsStyle("name") + style = _PygmentsStyle() self.assertEqual( style.palette(), - ("name", "default", "default")) + ("default", "default")) def test_text_color_16(self): - style = _PygmentsStyle("name") + style = _PygmentsStyle() style.update("#f00") self.assertEqual( style.palette(), - ("name", "light red", "default", None, "#f00", "default")) + ("light red", "default", None, "#f00", "default")) def test_text_color_256(self): - style = _PygmentsStyle("name") + style = _PygmentsStyle() style.update("#ff0000") self.assertEqual( style.palette(), - ("name", "light red", "default", None, "#f00", "default")) + ("light red", "default", None, "#f00", "default")) def test_bold(self): - style = _PygmentsStyle("name") + style = _PygmentsStyle() style.update("bold") self.assertEqual( style.palette(), - ("name", "bold,default", "default")) + ("bold,default", "default")) def test_text_bf_color_16(self): - style = _PygmentsStyle("name") + style = _PygmentsStyle() style.update("bg:#f00") style.update("#00f") self.assertEqual( style.palette(), - ("name", "light blue", "light red", None, "#00f", "#f00")) + ("light blue", "light red", None, "#00f", "#f00")) def test_text_bg_color_256(self): - style = _PygmentsStyle("name") + style = _PygmentsStyle() style.update("bg:#ff0000") style.update("#00ff00") self.assertEqual( style.palette(), - ("name", "light green", "light red", None, "#0f0", "#f00")) + ("light green", "light red", None, "#0f0", "#f00")) def test_text_bg_color_transparent(self): - style = _PygmentsStyle("name") + style = _PygmentsStyle() style.update("bg:") self.assertEqual( style.palette(), - ("name", "default", "default")) + ("default", "default")) class TestStylesUtil(unittest.TestCase): def test_palette_from_pygments(self): for style_name in get_all_styles(): - palette = palette_from_pygments(get_style_by_name(style_name).styles) + palette = palette_from_pygments(get_style_by_name(style_name)) self.assertIsNotNone(palette) self.assertIsInstance(palette, list) self.assertTrue(len(palette))