feat(lists): alternate markdown list markers by nesting depth

Ordered lists switch between `1.` (even depth) and `A.` (odd depth).
Unordered lists switch between `-` (even depth) and `*` (odd depth).
Makes nested list structure visually distinct in extracted text.
This commit is contained in:
2026-04-06 13:39:43 +05:30
parent 2c0ccee5e1
commit a2c8bd31c6
3 changed files with 40 additions and 16 deletions
+3 -3
View File
@@ -334,8 +334,8 @@ describe("HTMLTextSplitter", () => {
const html = [ const html = [
'<pre class="list-markdown">', '<pre class="list-markdown">',
"1. First", "1. First",
" 1. Nested 1", " A. Nested 1",
" 2. Nested 2", " B. Nested 2",
"2. Second", "2. Second",
"</pre>", "</pre>",
].join("\n"); ].join("\n");
@@ -343,7 +343,7 @@ describe("HTMLTextSplitter", () => {
const chunks = await splitter.splitText(html); const chunks = await splitter.splitText(html);
expect(chunks).toEqual([ expect(chunks).toEqual([
"1. First\n 1. Nested 1\n 2. Nested 2\n2. Second", "1. First\n A. Nested 1\n B. Nested 2\n2. Second",
]); ]);
}); });
}); });
+12 -12
View File
@@ -105,8 +105,8 @@ describe("formatHTMLForIngestion", () => {
expect(lines).toEqual([ expect(lines).toEqual([
"- Item 1", "- Item 1",
"- Item 2", "- Item 2",
" 1. Subitem 1", " A. Subitem 1",
" 2. Subitem 2", " B. Subitem 2",
]); ]);
}); });
@@ -140,10 +140,10 @@ describe("formatHTMLForIngestion", () => {
expect(lines).toEqual([ expect(lines).toEqual([
"1. First", "1. First",
"2. Second", "2. Second",
" - Alpha", " * Alpha",
" 1. Deep 1", " 1. Deep 1",
" 2. Deep 2", " 2. Deep 2",
" - Beta", " * Beta",
]); ]);
}); });
@@ -172,8 +172,8 @@ describe("formatHTMLForIngestion", () => {
.filter((l) => l.length > 0); .filter((l) => l.length > 0);
expect(lines).toEqual([ expect(lines).toEqual([
"- Item", "- Item",
" 1. Ordered sub", " A. Ordered sub",
" - Unordered sub", " * Unordered sub",
]); ]);
}); });
@@ -257,8 +257,8 @@ describe("formatHTMLForIngestion", () => {
.filter((l) => l.length > 0); .filter((l) => l.length > 0);
expect(lines).toEqual([ expect(lines).toEqual([
"1. First", "1. First",
" 1. Nested 1", " A. Nested 1",
" 2. Nested 2", " B. Nested 2",
"2. Second", "2. Second",
]); ]);
}); });
@@ -351,10 +351,10 @@ describe("formatHTMLForIngestion", () => {
expect(lines).toEqual([ expect(lines).toEqual([
"1. First", "1. First",
"2. Second", "2. Second",
" - Alpha", " * Alpha",
" 1. Deep 1", " 1. Deep 1",
" 2. Deep 2", " 2. Deep 2",
" - Beta", " * Beta",
]); ]);
}); });
@@ -379,8 +379,8 @@ describe("formatHTMLForIngestion", () => {
.filter((l) => l.length > 0); .filter((l) => l.length > 0);
expect(lines).toEqual([ expect(lines).toEqual([
"1. First", "1. First",
" 1. Nested 1", " A. Nested 1",
" 2. Nested 2", " B. Nested 2",
"2. Second", "2. Second",
]); ]);
}); });
+25 -1
View File
@@ -128,6 +128,30 @@ export function convertBlockCodeToMarkdown(
}); });
} }
/**
* Returns the markdown list item prefix based on list type and nesting depth.
* Alternates markers to visually distinguish nesting levels:
* - Ordered lists: `1.` at even depth, `A.` at odd depth
* - Unordered lists: `-` at even depth, `*` at odd depth
*
* @param isOrdered - Whether the list is ordered (ol) or unordered (ul)
* @param depth - Nesting depth (0 = top-level)
* @param index - Zero-based item index within its list
* @returns Prefix string like "1. ", "A. ", "- ", or "* "
*/
function getListItemPrefix(
isOrdered: boolean,
depth: number,
index: number,
): string {
if (isOrdered) {
return depth % 2 === 0
? `${index + 1}. `
: `${String.fromCharCode(65 + index)}. `;
}
return depth % 2 === 0 ? "- " : "* ";
}
function listToMarkdown( function listToMarkdown(
$: cheerio.CheerioAPI, $: cheerio.CheerioAPI,
elem: any, elem: any,
@@ -139,7 +163,7 @@ function listToMarkdown(
const lines: string[] = []; const lines: string[] = [];
$elem.children("li").each((i, li) => { $elem.children("li").each((i, li) => {
const prefix = isOrdered ? `${i + 1}. ` : "- "; const prefix = getListItemPrefix(isOrdered, depth, i);
const $li = $(li); const $li = $(li);
const nestedLists: string[] = []; const nestedLists: string[] = [];