






















@@ -22,6 +22,8 @@ type MarkdownToken = {
2222children?: MarkdownToken[];
2323attrs?: [string, string][];
2424attrGet?: (name: string) => string | null;
25+hidden?: boolean;
26+level?: number;
2527};
26282729export type MarkdownStyle =
@@ -262,16 +264,36 @@ function closeStyle(state: RenderState, style: MarkdownStyle) {
262264}
263265}
264266265-function appendParagraphSeparator(state: RenderState) {
266-if (state.env.listStack.length > 0) {
267-return;
268-}
267+function appendParagraphSeparator(state: RenderState, token?: MarkdownToken) {
269268if (state.table) {
270269return;
271270} // Don't add paragraph separators inside tables
271+if (state.env.listStack.length > 0) {
272+const directListParagraphLevel = state.env.listStack.length * 2;
273+if (
274+token?.type !== "paragraph_close" ||
275+token.hidden ||
276+token.level !== directListParagraphLevel
277+) {
278+return;
279+}
280+}
272281state.text += "\n\n";
273282}
274283284+function appendTopLevelListSeparator(state: RenderState) {
285+const trailingNewlines = state.text.match(/\n*$/)?.[0].length ?? 0;
286+if (trailingNewlines < 2) {
287+state.text += "\n";
288+}
289+}
290+291+function appendNestedListSeparator(state: RenderState) {
292+if (!state.text.endsWith("\n")) {
293+state.text += "\n";
294+}
295+}
296+275297function appendListPrefix(state: RenderState) {
276298const stack = state.env.listStack;
277299const top = stack[stack.length - 1];
@@ -636,7 +658,7 @@ function renderTokens(tokens: MarkdownToken[], state: RenderState): void {
636658appendText(state, "\n");
637659break;
638660case "paragraph_close":
639-appendParagraphSeparator(state);
661+appendParagraphSeparator(state, token);
640662break;
641663case "heading_open":
642664if (state.headingStyle === "bold") {
@@ -661,20 +683,20 @@ function renderTokens(tokens: MarkdownToken[], state: RenderState): void {
661683case "bullet_list_open":
662684// Add newline before nested list starts (so nested items appear on new line)
663685if (state.env.listStack.length > 0) {
664-state.text += "\n";
686+appendNestedListSeparator(state);
665687}
666688state.env.listStack.push({ type: "bullet", index: 0 });
667689break;
668690case "bullet_list_close":
669691state.env.listStack.pop();
670692if (state.env.listStack.length === 0) {
671-state.text += "\n";
693+appendTopLevelListSeparator(state);
672694}
673695break;
674696case "ordered_list_open": {
675697// Add newline before nested list starts (so nested items appear on new line)
676698if (state.env.listStack.length > 0) {
677-state.text += "\n";
699+appendNestedListSeparator(state);
678700}
679701const start = Number(getAttr(token, "start") ?? "1");
680702state.env.listStack.push({ type: "ordered", index: start - 1 });
@@ -683,7 +705,7 @@ function renderTokens(tokens: MarkdownToken[], state: RenderState): void {
683705case "ordered_list_close":
684706state.env.listStack.pop();
685707if (state.env.listStack.length === 0) {
686-state.text += "\n";
708+appendTopLevelListSeparator(state);
687709}
688710break;
689711case "list_item_open":
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。