diff --git a/server/models/helpers/DocumentHelper.test.ts b/server/models/helpers/DocumentHelper.test.ts
index 6bca0e689a..d829c1ce91 100644
--- a/server/models/helpers/DocumentHelper.test.ts
+++ b/server/models/helpers/DocumentHelper.test.ts
@@ -694,6 +694,62 @@ This is a [test paragraph](https://example.net)`,
expect(result).not.toMatch(/```abap\n/);
});
+ it("should export math blocks inside table cells on a single line", async () => {
+ const document = await buildDocument({
+ content: {
+ type: "doc",
+ content: [
+ {
+ type: "table",
+ content: [
+ {
+ type: "tr",
+ content: [
+ {
+ type: "th",
+ attrs: { colspan: 1, rowspan: 1 },
+ content: [
+ {
+ type: "paragraph",
+ content: [{ type: "text", text: "Header" }],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ type: "tr",
+ content: [
+ {
+ type: "td",
+ attrs: { colspan: 1, rowspan: 1 },
+ content: [
+ {
+ type: "math_block",
+ content: [
+ { type: "text", text: "a | b\n\\frac{1}{2}" },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ });
+ const result = await DocumentHelper.toMarkdown(document, {
+ includeTitle: false,
+ });
+ // Math blocks inside tables should use
tags rather than literal
+ // newlines that would break the table row structure, with pipes and
+ // backslashes escaped so the content cannot break out of the column.
+ expect(result).toContain("$$
a \\| b
\\\\frac{1}{2}
$$");
+ // The block content must not introduce raw newlines inside the table.
+ expect(result).not.toMatch(/\$\$\n/);
+ });
+
it("should include collection title by default", async () => {
const collection = await buildCollection({
name: "Test Collection",