from __future__ import annotations import pytest from mdpolish import Pipeline, RunStatus from mdpolish.modifiers import html_table_entity_unescape def transform(markdown: str): # type: ignore[no-untyped-def] return Pipeline([html_table_entity_unescape()]).transform(markdown) def test_unescapes_one_layer_only_in_strict_cell_text() -> None: markdown = ( '
&lt;5&gt;2 &amp; x <
' "\noutside &lt;" ) result = transform(markdown) assert result.status is RunStatus.SUCCESS assert result.output_markdown == ( '
<5>2 & x <
' "\noutside &lt;" ) assert len(result.changes) == 3 assert result.modifiers[0].version == "1.0.1" def test_multiple_tables_and_cells_report_source_order() -> None: markdown = "
&gt;
x
&lt;
" result = transform(markdown) assert result.output_markdown == "
>
x
<
" assert [change.span.start for change in result.changes] == sorted(change.span.start for change in result.changes) @pytest.mark.parametrize( "markdown", [ "outside &lt;", "
&lt;
", "
&lt;
", "
&lt;
", "
&lt;
", ], ) def test_non_strict_or_outside_content_is_preserved(markdown: str) -> None: assert transform(markdown).output_markdown == markdown @pytest.mark.parametrize( "markdown", [ "broken
&lt;
", "
&lt;
", ], ) def test_damaged_outer_table_does_not_expose_complete_inner_table(markdown: str) -> None: result = transform(markdown) assert result.status is RunStatus.SUCCESS assert result.output_markdown == markdown assert result.changes == () def test_fenced_table_is_not_protected_by_the_lexical_subset() -> None: markdown = "```html\n
&lt;
\n```" assert transform(markdown).output_markdown == "```html\n
<
\n```" def test_successful_output_is_idempotent() -> None: pipeline = Pipeline([html_table_entity_unescape()]) first = pipeline.transform("
&lt;
") assert first.output_markdown is not None assert pipeline.transform(first.output_markdown).changes == ()