import type { BlockHandler } from "./handler.type.js"; import { ITEM_SEPARATOR } from "./identify.js"; import { isLooseList, renderItemContent, serializeItemTail, splitItemHead } from "./list-item.js"; export const listHandler = { render(raw: string, attrs?: Record): string { const ordered = attrs?.["list-type"] === "ordered"; const tag = ordered ? "ol" : "ul"; // A non-numeric `start` previously emitted `start="NaN"`. const parsedStart = parseInt(attrs?.start ?? "1", 10); const startNum = Number.isNaN(parsedStart) ? 1 : parsedStart; const startAttr = ordered && startNum !== 1 ? ` start="${startNum}"` : ""; const items = raw.split(ITEM_SEPARATOR); const loose = isLooseList(items); const inner = items.map((itemRaw) => `
  • ${renderItemContent(itemRaw, loose)}
  • `).join(""); return `<${tag}${startAttr}>${inner}`; }, serialize(raw: string, attrs?: Record): string { const ordered = attrs?.["list-type"] === "ordered"; const startNum = parseInt(attrs?.start ?? "1", 10); const items = raw.split(ITEM_SEPARATOR); const lines: string[] = []; let num = startNum; for (const itemRaw of items) { const marker = ordered ? `${num++}. ` : "- "; const [head, tail] = splitItemHead(itemRaw); lines.push(marker + head); lines.push(...serializeItemTail(tail, head)); } return lines.join("\n"); }, } satisfies BlockHandler;