diff --git a/src/export/typst.ts b/src/export/typst.ts index 6dac22c..6649927 100644 --- a/src/export/typst.ts +++ b/src/export/typst.ts @@ -143,7 +143,7 @@ function imageExtension(dataUrl: string): string { return kind === "jpeg" ? "jpg" : kind; } -export function extractImages(book: Book): { images: ImageInput[]; paths: Map } { +function collectImages(contents: JSONContent[]): { images: ImageInput[]; paths: Map } { const paths = new Map(); const images: ImageInput[] = []; @@ -159,10 +159,14 @@ export function extractImages(book: Book): { images: ImageInput[]; paths: Map visit(chapter.content)); + contents.forEach(visit); return { images, paths }; } +export function extractImages(book: Book): { images: ImageInput[]; paths: Map } { + return collectImages(book.chapters.map((chapter) => chapter.content)); +} + export function bookToTypst(book: Book, paths: Map = new Map()): string { const meta = book.metadata; const front = `#set page(numbering: none) @@ -186,3 +190,23 @@ export function bookToPdfInputs(book: Book): { source: string; images: ImageInpu const { images, paths } = extractImages(book); return { source: bookToTypst(book, paths), images }; } + +function chapterToTypst(book: Book, index: number, paths: Map): string { + const chapter = book.chapters[index]; + const opener = `#chapteropener(${str(String(index + 1))}, [${esc(chapter.title || "Untitled")}])`; + return `${preamble(book)} + +#set page(numbering: "1") +#counter(page).update(1) + +${opener} + +${chapterBody(chapter.content, paths)} +`; +} + +export function chapterToPdfInputs(book: Book, index: number): { source: string; images: ImageInput[] } { + const chapter = book.chapters[index]; + const { images, paths } = collectImages([chapter.content]); + return { source: chapterToTypst(book, index, paths), images }; +}