mirror of
https://github.com/bendtherules/ask262.git
synced 2026-08-18 21:31:46 +00:00
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:
@@ -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",
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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",
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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[] = [];
|
||||||
|
|||||||
Reference in New Issue
Block a user