diff --git a/changedetectionio/html_tools.py b/changedetectionio/html_tools.py index 0d8ce03c1..83ace3e25 100644 --- a/changedetectionio/html_tools.py +++ b/changedetectionio/html_tools.py @@ -782,10 +782,9 @@ def strip_ignore_text(content, wordlist, mode="content"): # Used for finding out what to highlight if mode == "line numbers": - return [i + 1 for i in ignored_lines] + return sorted(i + 1 for i in ignored_lines) - output_lines = set(range(len(lines))) - ignored_lines - return ''.join([lines[i] for i in output_lines]) + return ''.join([line for i, line in enumerate(lines) if i not in ignored_lines]) def cdata_in_document_to_text(html_content: str, render_anchor_tag_content=False) -> str: from xml.sax.saxutils import escape as xml_escape diff --git a/changedetectionio/tests/test_ignore_regex_text.py b/changedetectionio/tests/test_ignore_regex_text.py index 847a3e745..cdb6ccf25 100644 --- a/changedetectionio/tests/test_ignore_regex_text.py +++ b/changedetectionio/tests/test_ignore_regex_text.py @@ -85,3 +85,16 @@ def test_strip_regex_text_func(): content = "some text\n\nand other text\n" stripped_content = html_tools.strip_ignore_text(content, ignore_lines) assert content == stripped_content + + +def test_strip_regex_text_keeps_document_order(): + # Only a few lines surviving the strip must still come back in document order + content = ''.join(f"line{i}\n" for i in range(100)) + ignore_lines = [f"/^line{i}$/" for i in range(90)] + + stripped_content = html_tools.strip_ignore_text(content, ignore_lines) + assert stripped_content == "".join(f"line{i}\n" for i in range(90, 100)) + + # And the line numbers used for highlighting come back sorted too + stripped_content = html_tools.strip_ignore_text(content, ignore_lines, mode="line numbers") + assert stripped_content == list(range(1, 91))