From 2eef735556b261b8c95399a2e20efb00d2935a45 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Sat, 2 Dec 2023 18:01:26 +0000 Subject: [PATCH] Colourise spaces properly. It showed up in that error report, and it would have been nasty copy-pasting as well. --- text.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/text.py b/text.py index 4c0e473..710dc12 100644 --- a/text.py +++ b/text.py @@ -143,18 +143,19 @@ class Media: class Paragraph: def __init__(self): self.words = [] + self.space_colours = [] self.unfinished_word = ColouredString('') def render(self, width): # For the moment, greedy algorithm. We can worry about cleverness later line, space = ColouredString(''), ColouredString('') - for word in self.words: + for word, space_colour in zip(self.words, self.space_colours): if line != "" and (line + space + word).width >= width: yield line line, space = ColouredString(''), ColouredString('') line += space + word - space = ColouredString(' ') + space = ColouredString(' ', space_colour) if line.width >= width: # FIXME: wrap explicitly? @@ -167,15 +168,16 @@ class Paragraph: def empty(self): return len(self.words) == 0 - def end_word(self): + def end_word(self, space_colour=' '): if len(self.unfinished_word) > 0: self.words.append(self.unfinished_word) + self.space_colours.append(space_colour) self.unfinished_word = ColouredString('') def add(self, text): for c in text: if str(c) == ' ': - self.end_word() + self.end_word(ColouredString(c).c) else: self.unfinished_word += c @@ -317,13 +319,13 @@ class RenderTests(unittest.TestCase): html = "

Test of some literal code

" self.assertEqual(self.parse_html(html), [ ColouredString('Test of some literal code', - ' ccccccc cccc'), + ' cccccccccccc'), ]) html = "

Test of some strong text

" self.assertEqual(self.parse_html(html), [ ColouredString('Test of some strong text', - ' ssssss ssss'), + ' sssssssssss'), ]) html = """

Test of a #hashtag

""" @@ -342,7 +344,7 @@ class RenderTests(unittest.TestCase): html = """

Test of some unsupported HTML tags

""" self.assertEqual(self.parse_html(html), [ ColouredString('Unsupported markup tags: ', - '!!!!!!!!!!! !!!!!! !!!!! !!!!!!!!! !!!!!!!!!!'), + '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'), ColouredString(''), ColouredString('Test of some unsupported HTML tags'), ]) @@ -353,9 +355,9 @@ class RenderTests(unittest.TestCase): ColouredString('https://a.b/c', 'MMMMMMMMMMMMM'), ColouredString(' foo foo foo', - ' mmm mmm mmm'), + ' mmmmmmmmmmm'), ColouredString(' foo foo foo', - ' mmm mmm mmm'), + ' mmmmmmmmmmm'), ColouredString(' foo', ' mmm'), ColouredString(''), @@ -364,11 +366,11 @@ class RenderTests(unittest.TestCase): ColouredString('https://a.b/c', 'MMMMMMMMMMMMM'), ColouredString(' foo foo', - ' mmm mmm'), + ' mmmmmmm'), ColouredString(' foo foo', - ' mmm mmm'), + ' mmmmmmm'), ColouredString(' foo foo', - ' mmm mmm'), + ' mmmmmmm'), ColouredString(' foo', ' mmm'), ColouredString(''), -- 2.30.2