mirror of
https://github.com/priyanshujain/margin.git
synced 2026-10-02 19:17:03 +00:00
perf(preview): add per-chapter Typst compile inputs
This commit is contained in:
1 parent
8b9a7081f7
commit
29e8842847
1 file changed
+26
-2
+26
-2
@@ -143,7 +143,7 @@ function imageExtension(dataUrl: string): string {
|
|||||||
return kind === "jpeg" ? "jpg" : kind;
|
return kind === "jpeg" ? "jpg" : kind;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function extractImages(book: Book): { images: ImageInput[]; paths: Map<string, string> } {
|
function collectImages(contents: JSONContent[]): { images: ImageInput[]; paths: Map<string, string> } {
|
||||||
const paths = new Map<string, string>();
|
const paths = new Map<string, string>();
|
||||||
const images: ImageInput[] = [];
|
const images: ImageInput[] = [];
|
||||||
|
|
||||||
@@ -159,10 +159,14 @@ export function extractImages(book: Book): { images: ImageInput[]; paths: Map<st
|
|||||||
(node.content ?? []).forEach(visit);
|
(node.content ?? []).forEach(visit);
|
||||||
};
|
};
|
||||||
|
|
||||||
book.chapters.forEach((chapter) => visit(chapter.content));
|
contents.forEach(visit);
|
||||||
return { images, paths };
|
return { images, paths };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function extractImages(book: Book): { images: ImageInput[]; paths: Map<string, string> } {
|
||||||
|
return collectImages(book.chapters.map((chapter) => chapter.content));
|
||||||
|
}
|
||||||
|
|
||||||
export function bookToTypst(book: Book, paths: Map<string, string> = new Map()): string {
|
export function bookToTypst(book: Book, paths: Map<string, string> = new Map()): string {
|
||||||
const meta = book.metadata;
|
const meta = book.metadata;
|
||||||
const front = `#set page(numbering: none)
|
const front = `#set page(numbering: none)
|
||||||
@@ -186,3 +190,23 @@ export function bookToPdfInputs(book: Book): { source: string; images: ImageInpu
|
|||||||
const { images, paths } = extractImages(book);
|
const { images, paths } = extractImages(book);
|
||||||
return { source: bookToTypst(book, paths), images };
|
return { source: bookToTypst(book, paths), images };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function chapterToTypst(book: Book, index: number, paths: Map<string, string>): 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 };
|
||||||
|
}
|
||||||
Reference in new issue
Block a user