diff --git a/src/services/export/markdown.spec.ts b/src/services/export/markdown.spec.ts
index 74c6a9600..a344d975f 100644
--- a/src/services/export/markdown.spec.ts
+++ b/src/services/export/markdown.spec.ts
@@ -289,4 +289,30 @@ describe("Markdown export", () => {
expect(markdownExportService.toMarkdown(html)).toBe(expected);
});
+ it("does not generate additional spacing when exporting lists with paragraph", () => {
+ const html = trimIndentation`\
+
+ `;
+ const expected = trimIndentation`\
+ * [@JYC333](https://github.com/JYC333) made their first contribution in [#294](https://github.com/TriliumNext/Notes/pull/294)
+ * [Note Tooltip isn't removed when clicking on internal trilium link in read-only mode](https://github.com/TriliumNext/Notes/issues/375)
+ * [Calendar dropdown won't close if click/right-click other button that open notes from launcher bar](https://github.com/TriliumNext/Notes/issues/384)`;
+ expect(markdownExportService.toMarkdown(html)).toBe(expected);
+ });
+
});
diff --git a/src/services/export/markdown.ts b/src/services/export/markdown.ts
index e524a6274..c4c71eee2 100644
--- a/src/services/export/markdown.ts
+++ b/src/services/export/markdown.ts
@@ -46,6 +46,7 @@ function toMarkdown(content: string) {
instance.addRule("inlineLink", buildInlineLinkFilter());
instance.addRule("figure", buildFigureFilter());
instance.addRule("math", buildMathFilter());
+ instance.addRule("li-1", buildListItemFilter());
instance.use(gfm);
instance.keep([ "kbd" ]);
}
@@ -207,6 +208,27 @@ function buildFigureFilter(): Rule {
}
}
+// Keep in line with https://github.com/mixmark-io/turndown/blob/master/src/commonmark-rules.js.
+function buildListItemFilter(): Rule {
+ return {
+ filter: "li",
+ replacement(content, node, options) {
+ content = content
+ .trim()
+ .replace(/\n/gm, '\n ') // indent
+ let prefix = options.bulletListMarker + ' '
+ const parent = node.parentNode as HTMLElement;
+ if (parent.nodeName === 'OL') {
+ var start = parent.getAttribute('start')
+ var index = Array.prototype.indexOf.call(parent.children, node)
+ prefix = (start ? Number(start) + index : index + 1) + '. '
+ }
+ const result = prefix + content + (node.nextSibling && !/\n$/.test(content) ? '\n' : '');
+ return result;
+ }
+ }
+}
+
function buildMathFilter(): Rule {
const MATH_INLINE_PREFIX = "\\(";
const MATH_INLINE_SUFFIX = "\\)";
diff --git a/src/services/import/markdown.spec.ts b/src/services/import/markdown.spec.ts
index f1ca4971d..429e61b67 100644
--- a/src/services/import/markdown.spec.ts
+++ b/src/services/import/markdown.spec.ts
@@ -208,4 +208,22 @@ second line 2- Hello
{
+ const input = trimIndentation`\
+ ### 🐞 Bugfixes
+
+ * [v0.90.4 docker does not read USER\_UID and USER\_GID from environment](https://github.com/TriliumNext/Notes/issues/331)
+ * [Invalid CSRF token on Android phone](https://github.com/TriliumNext/Notes/issues/318)
+ * [Excess spacing in lists](https://github.com/TriliumNext/Notes/issues/341)`;
+ const expected = [
+ /*html*/`🐞 Bugfixes
`,
+ /*html*/``
+ ].join("");
+ expect(markdownService.renderToHtml(input, "Title")).toStrictEqual(expected);
+ });
+
});