From e48b1c0dae438bf4a0f138d1817290b8974abede Mon Sep 17 00:00:00 2001 From: Philip Okugbe <16838612+Philipinho@users.noreply.github.com> Date: Mon, 9 Dec 2024 15:08:25 +0000 Subject: [PATCH] fix: markdown math import (#529) * fix: markdown math block import * fix: block and inline math import * cleanup --- .../src/integrations/export/turndown-utils.ts | 2 +- .../integrations/import/utils/marked.utils.ts | 4 +- .../import/utils/math-block.marked.ts | 37 +++++++++++++ .../import/utils/math-inline.marked.ts | 55 +++++++++++++++++++ 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 apps/server/src/integrations/import/utils/math-block.marked.ts create mode 100644 apps/server/src/integrations/import/utils/math-inline.marked.ts diff --git a/apps/server/src/integrations/export/turndown-utils.ts b/apps/server/src/integrations/export/turndown-utils.ts index 8d46e661..c48ba364 100644 --- a/apps/server/src/integrations/export/turndown-utils.ts +++ b/apps/server/src/integrations/export/turndown-utils.ts @@ -117,7 +117,7 @@ function mathBlock(turndownService: TurndownService) { ); }, replacement: function (content: any, node: HTMLInputElement) { - return `\n$$${content}$$\n`; + return `\n$$\n${content}\n$$\n`; }, }); } diff --git a/apps/server/src/integrations/import/utils/marked.utils.ts b/apps/server/src/integrations/import/utils/marked.utils.ts index a34cb465..cfc7e6a9 100644 --- a/apps/server/src/integrations/import/utils/marked.utils.ts +++ b/apps/server/src/integrations/import/utils/marked.utils.ts @@ -1,5 +1,7 @@ import { marked } from 'marked'; import { calloutExtension } from './callout.marked'; +import { mathBlockExtension } from './math-block.marked'; +import { mathInlineExtension } from "./math-inline.marked"; marked.use({ renderer: { @@ -26,7 +28,7 @@ marked.use({ }, }); -marked.use({ extensions: [calloutExtension] }); +marked.use({ extensions: [calloutExtension, mathBlockExtension, mathInlineExtension] }); export async function markdownToHtml(markdownInput: string): Promise { const YAML_FONT_MATTER_REGEX = /^\s*---[\s\S]*?---\s*/; diff --git a/apps/server/src/integrations/import/utils/math-block.marked.ts b/apps/server/src/integrations/import/utils/math-block.marked.ts new file mode 100644 index 00000000..b2165a3b --- /dev/null +++ b/apps/server/src/integrations/import/utils/math-block.marked.ts @@ -0,0 +1,37 @@ +import { Token, marked } from 'marked'; + +interface MathBlockToken { + type: 'mathBlock'; + text: string; + raw: string; +} + +export const mathBlockExtension = { + name: 'mathBlock', + level: 'block', + start(src: string) { + return src.match(/\$\$/)?.index ?? -1; + }, + tokenizer(src: string): MathBlockToken | undefined { + const rule = /^\$\$(?!(\$))([\s\S]+?)\$\$/; + const match = rule.exec(src); + + if (match) { + return { + type: 'mathBlock', + raw: match[0], + text: match[2]?.trim(), + }; + } + }, + renderer(token: Token) { + const mathBlockToken = token as MathBlockToken; + // parse to prevent escaping slashes + const latex = marked + .parse(mathBlockToken.text) + .toString() + .replace(/<(\/)?p>/g, ''); + + return `
${latex}
`; + }, +}; diff --git a/apps/server/src/integrations/import/utils/math-inline.marked.ts b/apps/server/src/integrations/import/utils/math-inline.marked.ts new file mode 100644 index 00000000..e6eb978d --- /dev/null +++ b/apps/server/src/integrations/import/utils/math-inline.marked.ts @@ -0,0 +1,55 @@ +import { Token, marked } from 'marked'; + +interface MathInlineToken { + type: 'mathInline'; + text: string; + raw: string; +} + +const inlineMathRegex = /^\$(?!\s)(.+?)(?/g, ''); + + return `${latex}`; + }, +};