diff --git a/src/services/export/md.ts b/src/services/export/md.ts index 4669dd68e..3d80d0f15 100644 --- a/src/services/export/md.ts +++ b/src/services/export/md.ts @@ -5,35 +5,37 @@ import turndownPluginGfm from "joplin-turndown-plugin-gfm"; let instance: TurndownService | null = null; +const fencedCodeBlockFilter: TurndownService.Rule = { + filter: function (node, options) { + return ( + options.codeBlockStyle === 'fenced' && + node.nodeName === 'PRE' && + node.firstChild !== null && + node.firstChild.nodeName === 'CODE' + ) + }, + + replacement: function (content, node, options) { + if (!node.firstChild || !("getAttribute" in node.firstChild) || typeof node.firstChild.getAttribute !== "function") { + return content; + } + + const className = node.firstChild.getAttribute('class') || '' + const language = rewriteLanguageTag((className.match(/language-(\S+)/) || [null, ''])[1]); + + return ( + '\n\n' + options.fence + language + '\n' + + node.firstChild.textContent + + '\n' + options.fence + '\n\n' + ) + } +}; + function toMarkdown(content: string) { if (instance === null) { instance = new TurndownService({ codeBlockStyle: 'fenced' }); - instance.addRule('fencedCodeBlock', { - filter: function (node, options) { - return ( - options.codeBlockStyle === 'fenced' && - node.nodeName === 'PRE' && - node.firstChild !== null && - node.firstChild.nodeName === 'CODE' - ) - }, - - replacement: function (content, node, options) { - if (!node.firstChild || !("getAttribute" in node.firstChild) || typeof node.firstChild.getAttribute !== "function") { - return content; - } - - var className = node.firstChild.getAttribute('class') || '' - var language = (className.match(/language-(\S+)/) || [null, ''])[1]; - language = rewriteLanguageTag(language); - - return ( - '\n\n' + options.fence + language + '\n' + - node.firstChild.textContent + - '\n' + options.fence + '\n\n' - ) - } - }) + // Filter is heavily based on: https://github.com/mixmark-io/turndown/issues/274#issuecomment-458730974 + instance.addRule('fencedCodeBlock', fencedCodeBlockFilter); instance.use(turndownPluginGfm.gfm); } @@ -41,6 +43,10 @@ function toMarkdown(content: string) { } function rewriteLanguageTag(source: string) { + if (!source) { + return source; + } + if (source === "text-x-trilium-auto") { return ""; }