fix(export/markdown): double slashes breaking math expressions (closes #1649)

This commit is contained in:
Elian Doran 2025-04-08 12:06:46 +03:00
parent d03ee26408
commit 3a1f1ceedb
No known key found for this signature in database
2 changed files with 18 additions and 9 deletions

View File

@ -278,14 +278,14 @@ describe("Markdown export", () => {
}); });
it("converts inline math expressions into proper Markdown syntax", () => { it("converts inline math expressions into proper Markdown syntax", () => {
const html = /*html*/`<p>The equation is&nbsp;<span class="math-tex">\\(e=mc^{2}\\)</span>.</p>`; const html = /*html*/String.raw`<span class="math-tex">\(H(X, Y) = \sum_{i=1}^{M} \sum_{j=1}^{L} p(x_i, y_j) \log_2 \frac{1}{p(x_i, y_j)} = - \sum_{i=1}^{M} \sum_{j=1}^{L} p(x_i, y_j) \log_2 p(x_i, y_j) \frac{\text{bits}}{\text{symbol}}\)</span></span>`;
const expected = `The equation is\u00a0$e=mc^{2}$.`; const expected = String.raw`$H(X, Y) = \sum_{i=1}^{M} \sum_{j=1}^{L} p(x_i, y_j) \log_2 \frac{1}{p(x_i, y_j)} = - \sum_{i=1}^{M} \sum_{j=1}^{L} p(x_i, y_j) \log_2 p(x_i, y_j) \frac{\text{bits}}{\text{symbol}}$`;
expect(markdownExportService.toMarkdown(html)).toBe(expected); expect(markdownExportService.toMarkdown(html)).toBe(expected);
}); });
it("converts display math expressions into proper Markdown syntax", () => { it("converts display math expressions into proper Markdown syntax", () => {
const html = /*html*/`<span class="math-tex">\\[\sqrt{x^{2}+1}\\]</span>`; const html = /*html*/String.raw`<span class="math-tex">\[H(X, Y) = \sum_{i=1}^{M} \sum_{j=1}^{L} p(x_i, y_j) \log_2 \frac{1}{p(x_i, y_j)} = - \sum_{i=1}^{M} \sum_{j=1}^{L} p(x_i, y_j) \log_2 p(x_i, y_j) \frac{\text{bits}}{\text{symbol}}\]</span></span>`;
const expected = `$$\sqrt{x^{2}+1}$$`; const expected = String.raw`$$H(X, Y) = \sum_{i=1}^{M} \sum_{j=1}^{L} p(x_i, y_j) \log_2 \frac{1}{p(x_i, y_j)} = - \sum_{i=1}^{M} \sum_{j=1}^{L} p(x_i, y_j) \log_2 p(x_i, y_j) \frac{\text{bits}}{\text{symbol}}$$`;
expect(markdownExportService.toMarkdown(html)).toBe(expected); expect(markdownExportService.toMarkdown(html)).toBe(expected);
}); });

View File

@ -208,19 +208,28 @@ function buildFigureFilter(): Rule {
} }
function buildMathFilter(): Rule { function buildMathFilter(): Rule {
const MATH_INLINE_PREFIX = "\\(";
const MATH_INLINE_SUFFIX = "\\)";
const MATH_DISPLAY_PREFIX = "\\[";
const MATH_DISPLAY_SUFFIX = "\\]";
return { return {
filter(node) { filter(node) {
return node.nodeName === "SPAN" && node.classList.contains("math-tex"); return node.nodeName === "SPAN" && node.classList.contains("math-tex");
}, },
replacement(content) { replacement(_, node) {
// We have to use the raw HTML text, otherwise the content is escaped too much.
const content = (node as HTMLElement).innerText;
// Inline math // Inline math
if (content.startsWith("\\\\(") && content.endsWith("\\\\)")) { if (content.startsWith(MATH_INLINE_PREFIX) && content.endsWith(MATH_INLINE_SUFFIX)) {
return `$${content.substring(3, content.length - 3)}$`; return `$${content.substring(MATH_INLINE_PREFIX.length, content.length - MATH_INLINE_SUFFIX.length)}$`;
} }
// Display math // Display math
if (content.startsWith(String.raw`\\\[`) && content.endsWith(String.raw`\\\]`)) { if (content.startsWith(MATH_DISPLAY_PREFIX) && content.endsWith(MATH_DISPLAY_SUFFIX)) {
return `$$${content.substring(4, content.length - 4)}$$`; return `$$${content.substring(MATH_DISPLAY_PREFIX.length, content.length - MATH_DISPLAY_SUFFIX.length)}$$`;
} }
// Unknown. // Unknown.