Add automatic chapter page breaks to Full Book

This commit is contained in:
avi 2026-08-18 09:05:05 -05:00
commit ebbb424ee5
4 changed files with 144 additions and 7 deletions

View file

@ -245,6 +245,33 @@ const BOOK2_DIR = __BOOKDIR2_VALUE__;
out.fullBookStatsOk =
statsEl.textContent === `words: ${words} · chars: ${expectedAssembled.length}`;
// --- chapter page breaks in Full Book ---
// Each chapter after the first gets a "chapter-break" marker on its first
// rendered line (a CSS border on screen, break-before: page when printed).
// The first chapter must never be marked, so no blank page precedes it.
const chapterBreakLines = () =>
Array.from(document.querySelectorAll("#fullBookHost .cm-line.chapter-break"));
const allContentLines = () =>
Array.from(document.querySelectorAll("#fullBookHost .cm-content .cm-line"));
const fbBreaks = chapterBreakLines();
const firstLine = allContentLines()[0];
out.chapterBreakCount = fbBreaks.length;
out.chapterBreakCountOk = fbBreaks.length === 2; // 3 chapters -> 2 breaks
out.firstChapterUnmarked = !!firstLine && !firstLine.classList.contains("chapter-break");
out.breaksAtChapterStarts =
fbBreaks.length === 2 &&
fbBreaks.every((el) => {
const t = el.textContent;
return t.startsWith("# Beta") || t.startsWith("# Gamma");
});
// print rules must be present in the stylesheet (fetch the raw CSS because
// Chromium's CSSOM normalizes the page-break-before alias into break-before)
const rawCss = await (await fetch("./index.css")).text();
out.printBreakRule = /break-before\s*:\s*page/.test(rawCss);
out.printBreakFallback = /page-break-before\s*:\s*always/.test(rawCss);
out.printBreakScoped = /#fullBookHost\s+\.cm-line\.chapter-break/.test(rawCss);
document.getElementById("copyAllBtn").click();
await new Promise((r) => setTimeout(r, 200));
const clip = await window.folio.getClipboardText();
@ -303,6 +330,18 @@ const BOOK2_DIR = __BOOKDIR2_VALUE__;
assembledGAB.includes("Alpha body text") &&
assembledGAB.includes("Beta body without heading");
// chapter breaks follow the reordered manuscript: still exactly 2 breaks,
// now marking Alpha and Beta (Gamma is first, so it stays unmarked)
const fbBreaksReordered = chapterBreakLines();
out.fbBreaksAfterReorder = fbBreaksReordered.map((el) => el.textContent);
out.fbBreakAfterReorderOk =
fbBreaksReordered.length === 2 &&
fbBreaksReordered.every((el) => {
const t = el.textContent;
return t.startsWith("# Alpha") || t.startsWith("# Beta");
}) &&
!allContentLines()[0].classList.contains("chapter-break");
// switching between an individual chapter and Full Book never shows stale data
document.querySelector("#chapterList .chapter-row").click();
await new Promise((r) => setTimeout(r, 200));
@ -392,6 +431,12 @@ const BOOK2_DIR = __BOOKDIR2_VALUE__;
"fullBookShown",
"assembledOk",
"fullBookStatsOk",
"chapterBreakCountOk",
"firstChapterUnmarked",
"breaksAtChapterStarts",
"printBreakRule",
"printBreakFallback",
"printBreakScoped",
"copyAllOk",
"copyStatusShown",
"fullBookSelectAllOk",
@ -399,6 +444,7 @@ const BOOK2_DIR = __BOOKDIR2_VALUE__;
"reorderOk",
"fbAfterReorderOk",
"fbHasAllContent",
"fbBreakAfterReorderOk",
"fbNoStale",
"fbLayoutOk",
"reopenPersists",