diff --git a/kitty/fonts/render.py b/kitty/fonts/render.py index 245fa669e..d8f463672 100644 --- a/kitty/fonts/render.py +++ b/kitty/fonts/render.py @@ -25,8 +25,29 @@ else: current_faces = None +def coalesce_symbol_maps(maps): + if not maps: + return maps + items = tuple((k, maps[k]) for k in sorted(maps)) + ans = [items[0]] + + def merge(prev_item, item): + s, e = item[0] + pe = prev_item[0][1] + ans[-1] = ((prev_item[0][0], max(pe, e)), prev_item[1]) + + for item in items[1:]: + current_item = ans[-1] + if current_item[1] != item[1] or item[0][0] > current_item[0][1] + 1: + ans.append(item) + else: + merge(current_item, item) + + return dict(ans) + + def create_symbol_map(opts): - val = opts.symbol_map + val = coalesce_symbol_maps(opts.symbol_map) family_map = {} count = 0 for family in val.values(): diff --git a/kitty_tests/fonts.py b/kitty_tests/fonts.py index f5b59a611..cda77d640 100644 --- a/kitty_tests/fonts.py +++ b/kitty_tests/fonts.py @@ -11,7 +11,9 @@ from kitty.fast_data_types import ( test_render_line, test_sprite_position_for, wcwidth ) from kitty.fonts.box_drawing import box_chars -from kitty.fonts.render import render_string, setup_for_testing, shape_string +from kitty.fonts.render import ( + coalesce_symbol_maps, render_string, setup_for_testing, shape_string +) from . import BaseTest @@ -122,3 +124,7 @@ class Rendering(BaseTest): finally: sys.stderr = orig self.assertIn('LastResort', buf.getvalue()) + + def test_coalesce_symbol_maps(self): + q = {(2, 3): 'a', (4, 6): 'b', (5, 5): 'b', (7, 7): 'b', (9, 9): 'b', (1, 1): 'a'} + self.ae(coalesce_symbol_maps(q), {(1, 3): 'a', (4, 7): 'b', (9, 9): 'b'})