diff --git a/src/services/export/markdown.spec.ts b/src/services/export/markdown.spec.ts index a344d975f..37e9bd82a 100644 --- a/src/services/export/markdown.spec.ts +++ b/src/services/export/markdown.spec.ts @@ -315,4 +315,10 @@ describe("Markdown export", () => { expect(markdownExportService.toMarkdown(html)).toBe(expected); }); + it("preserves include note", () => { + const html = /*html*/`
 
`; + const expected = /*markdown*/`
 
`; + expect(markdownExportService.toMarkdown(html)).toBe(expected); + }); + }); diff --git a/src/services/export/markdown.ts b/src/services/export/markdown.ts index c4c71eee2..8f6e3fa00 100644 --- a/src/services/export/markdown.ts +++ b/src/services/export/markdown.ts @@ -37,7 +37,15 @@ function toMarkdown(content: string) { if (instance === null) { instance = new TurndownService({ headingStyle: "atx", - codeBlockStyle: "fenced" + codeBlockStyle: "fenced", + blankReplacement(content, node, options) { + if (node.nodeName === "SECTION" && (node as HTMLElement).classList.contains("include-note")) { + return (node as HTMLElement).outerHTML; + } + + // Original implementation as per https://github.com/mixmark-io/turndown/blob/master/src/turndown.js. + return ("isBlock" in node && node.isBlock) ? '\n\n' : '' + } }); // Filter is heavily based on: https://github.com/mixmark-io/turndown/issues/274#issuecomment-458730974 instance.addRule("fencedCodeBlock", fencedCodeBlockFilter); @@ -46,7 +54,7 @@ function toMarkdown(content: string) { instance.addRule("inlineLink", buildInlineLinkFilter()); instance.addRule("figure", buildFigureFilter()); instance.addRule("math", buildMathFilter()); - instance.addRule("li-1", buildListItemFilter()); + instance.addRule("li", buildListItemFilter()); instance.use(gfm); instance.keep([ "kbd" ]); }