From 8dd9644c135c60d32fbb5a44e362d57d429bf931 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 1 Sep 2024 17:22:54 +0200 Subject: [PATCH] Fix issue with overlapping formatting (#2012) --- novelwriter/core/tokenizer.py | 5 +++-- tests/test_core/test_core_tokenizer.py | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/novelwriter/core/tokenizer.py b/novelwriter/core/tokenizer.py index 6e420f5d..36d42eb8 100644 --- a/novelwriter/core/tokenizer.py +++ b/novelwriter/core/tokenizer.py @@ -1150,8 +1150,9 @@ class Tokenizer(ABC): formats = [] for pos, n, fmt, key in reversed(sorted(temp, key=lambda x: x[0])): if fmt > 0: - result = result[:pos] + result[pos+n:] - formats = [(p-n, f, k) for p, f, k in formats] + if n > 0: + result = result[:pos] + result[pos+n:] + formats = [(p-n if p > pos else p, f, k) for p, f, k in formats] formats.insert(0, (pos, fmt, key)) return result, formats diff --git a/tests/test_core/test_core_tokenizer.py b/tests/test_core/test_core_tokenizer.py index 2932fe45..30d06906 100644 --- a/tests/test_core/test_core_tokenizer.py +++ b/tests/test_core/test_core_tokenizer.py @@ -1161,6 +1161,24 @@ def testCoreToken_Dialogue(mockGUI): Tokenizer.A_NONE )] + # Special Cases + # ============= + + # Dialogue + formatting on same index (Issue #2012) + tokens._text = "[i]\u201cDialogue text.\u201d[/i]\n" + tokens.tokenizeText() + assert tokens._tokens == [( + Tokenizer.T_TEXT, 0, + "\u201cDialogue text.\u201d", + [ + (0, Tokenizer.FMT_I_B, ""), + (0, Tokenizer.FMT_DL_B, ""), + (16, Tokenizer.FMT_I_E, ""), + (16, Tokenizer.FMT_DL_E, ""), + ], + Tokenizer.A_NONE + )] + @pytest.mark.core def testCoreToken_SpecialFormat(mockGUI):