From a2f0896c2accc09ae1eb73089b5a74a9d7f60e12 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 14 Mar 2025 19:50:26 +0200 Subject: [PATCH] feat(import/markdown): collapse unnecessary whitespace when importing --- src/services/import/markdown.spec.ts | 18 ++++++++++++++++++ src/services/import/markdown.ts | 14 +++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/services/import/markdown.spec.ts b/src/services/import/markdown.spec.ts index 623ad7e41..9c22667cd 100644 --- a/src/services/import/markdown.spec.ts +++ b/src/services/import/markdown.spec.ts @@ -56,4 +56,22 @@ describe("markdown", () => { `, "What's new") expect(result).toBe(`\n

Hi there

\n`); }); + + it("trims unnecessary whitespace", () => { + const input = `\ +## Heading 1 + +Title + +\`\`\` +code block 1 +second line 2 +\`\`\` +`; + const expected = `\ +

Heading 1

Title

code block 1
+second line 2
`; + expect(markdownService.renderToHtml(input, "Troubleshooting")).toBe(expected); + }); + }); diff --git a/src/services/import/markdown.ts b/src/services/import/markdown.ts index 8969357c3..f64ce295a 100644 --- a/src/services/import/markdown.ts +++ b/src/services/import/markdown.ts @@ -1,6 +1,7 @@ "use strict"; import { parse, Renderer, type Tokens } from "marked"; +import { minify as minifyHtml } from "html-minifier"; const renderer = new Renderer({ async: false }); renderer.code = ({ text, lang, escaped }: Tokens.Code) => { @@ -17,12 +18,19 @@ import importUtils from "./utils.js"; import { getMimeTypeFromHighlightJs, MIME_TYPE_AUTO, normalizeMimeTypeForCKEditor } from "./mime_type_definitions.js"; function renderToHtml(content: string, title: string) { - const html = parse(content, { + let html = parse(content, { async: false, renderer: renderer }) as string; - const h1Handled = importUtils.handleH1(html, title); // h1 handling needs to come before sanitization - return htmlSanitizer.sanitize(h1Handled); + + // h1 handling needs to come before sanitization + html = importUtils.handleH1(html, title); + html = htmlSanitizer.sanitize(html); + html = minifyHtml(html, { + collapseWhitespace: true + }); + + return html; } function getNormalizedMimeFromMarkdownLanguage(language: string | undefined) {