feat(export/md): rewrite language tag to a more common syntax

This commit is contained in:
Elian Doran 2024-12-17 23:35:08 +02:00
parent ba95caaf6d
commit eee21f3741
No known key found for this signature in database
2 changed files with 56 additions and 0 deletions

View File

@ -0,0 +1,24 @@
import markdownExportService from "../../../src/services/export/md.js";
import { trimIndentation } from "../../support/utils.js";
describe("Markdown export", () => {
it("trims language tag for code blocks", () => {
const html = trimIndentation`\
<p>A diff:</p>
<pre><code class="language-text-x-diff">Hello
-world
+worldy
</code></pre>`;
const expected = trimIndentation`\
A diff:
\`\`\`diff
Hello
-world
+worldy
\`\`\``;
expect(markdownExportService.toMarkdown(html)).toBe(expected);
});
});

View File

@ -8,12 +8,44 @@ let instance: TurndownService | null = null;
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'
)
}
})
instance.use(turndownPluginGfm.gfm);
}
return instance.turndown(content);
}
function rewriteLanguageTag(source: string) {
return source
.split("-")
.at(-1);
}
export default {
toMarkdown
};