From 77b92020c0301763d7b823c9a859fb20baf3a7c8 Mon Sep 17 00:00:00 2001 From: red person Date: Wed, 3 Jun 2026 08:17:02 +0300 Subject: [PATCH] Ignore non-string markdown table rows (#1648) --- static/js/markdown/tableRow.js | 3 ++- tests/test_markdown_table_row_js.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/static/js/markdown/tableRow.js b/static/js/markdown/tableRow.js index 5cdd8c0..ef09cea 100644 --- a/static/js/markdown/tableRow.js +++ b/static/js/markdown/tableRow.js @@ -10,7 +10,8 @@ // cells too, so "| a | | c |" collapsed to 2 columns and misaligned with the // header. export function splitTableRow(row) { - return (row || '') + const text = typeof row === 'string' ? row : ''; + return text .replace(/^\s*\|/, '') .replace(/\|\s*$/, '') .split('|') diff --git a/tests/test_markdown_table_row_js.py b/tests/test_markdown_table_row_js.py index a089154..0e94d2f 100644 --- a/tests/test_markdown_table_row_js.py +++ b/tests/test_markdown_table_row_js.py @@ -45,3 +45,20 @@ def test_rows_without_outer_pipes(): @pytest.mark.skipif(not _HAS_NODE, reason="node binary not on PATH") def test_header_row_unaffected(): assert _split("| h1 | h2 | h3 |") == ["h1", "h2", "h3"] + + +@pytest.mark.skipif(not _HAS_NODE, reason="node binary not on PATH") +def test_non_string_row_falls_back_to_empty_cell(): + js = f""" + import {{ splitTableRow }} from '{_HELPER.as_posix()}'; + console.log(JSON.stringify([ + splitTableRow(null), + splitTableRow({{"bad": "row"}}) + ])); + """ + proc = subprocess.run( + ["node", "--input-type=module"], + input=js, capture_output=True, text=True, cwd=str(_REPO), timeout=30, + ) + assert proc.returncode == 0, proc.stderr + assert json.loads(proc.stdout.strip()) == [[""], [""]]