View module for the paged reader page, plus the canvas/spread helpers the paged engine is built on.
Summary
Functions
Fold a user's chapter page overrides into the natural image list.
Build a %Fresco.Canvas{} containing every page of the chapter
laid out side-by-side on a virtual canvas, so the paged reader
navigates purely by retargeting fresco's pan/zoom
(handle.fitImage("page-N")) — no reload, no DOM mutation.
JSON-encodes the chapter's image list for client-side use:
[{url, width, height}, ...] with proxied URLs. JS uses this to
build fresco sources for any page without re-hitting the server.
Returns the canonical list of "spread start" page numbers for a chapter in double-page mode. Page 1 is always its own start (solo first spread). Subsequent pages pair up unless one of the pair is wide (>1.2 aspect) or user-marked solo, in which case that page goes solo and pairing resumes after it.
daisyUI button class string for active/inactive switcher buttons.
URL for the same chapter+page with overridden flags — used by the settings toggles (direction, double-page) that require a server-side re-render (the canvas's page-X layout differs by direction).
Public delegate so the images API can build a JSON payload using the
SAME proxied URL the server-rendered canvas placed in data-src —
keeping the client's applyImageWindow swap-back a no-op identity
match instead of a cross-origin re-fetch.
True when the page at index n (1-based) is wider than it is tall
(likely a glued-together spread that should be shown solo).
Functions
Fold a user's chapter page overrides into the natural image list.
Returns {new_images, solo_set, inserted_set}:
new_images— image list with synthetic blanks spliced before eachinsert_blank_before.page_index(in natural coords). Each synthetic image carriessynthetic: true.solo_set— 1-based indices (in the new list) displayed alone in double-page mode (kind = "solo").inserted_set— 1-based indices (in the new list) of the synthetic blanks themselves, handed to the client for styling.
Overrides with page_index outside [1, length(images)] are
silently ignored — forgiving when a chapter's page count changes
upstream.
Build a %Fresco.Canvas{} containing every page of the chapter
laid out side-by-side on a virtual canvas, so the paged reader
navigates purely by retargeting fresco's pan/zoom
(handle.fitImage("page-N")) — no reload, no DOM mutation.
Pages are ordered along X by reading direction (RTL: page 1
rightmost). Each image carries id = "page-N". Single vs double
page is a fit decision, not a layout one. Existing annotations are
stashed under the canvas "etcher" extension for hydration.
JSON-encodes the chapter's image list for client-side use:
[{url, width, height}, ...] with proxied URLs. JS uses this to
build fresco sources for any page without re-hitting the server.
Returns the canonical list of "spread start" page numbers for a chapter in double-page mode. Page 1 is always its own start (solo first spread). Subsequent pages pair up unless one of the pair is wide (>1.2 aspect) or user-marked solo, in which case that page goes solo and pairing resumes after it.
daisyUI button class string for active/inactive switcher buttons.
URL for the same chapter+page with overridden flags — used by the settings toggles (direction, double-page) that require a server-side re-render (the canvas's page-X layout differs by direction).
Public delegate so the images API can build a JSON payload using the
SAME proxied URL the server-rendered canvas placed in data-src —
keeping the client's applyImageWindow swap-back a no-op identity
match instead of a cross-origin re-fetch.
True when the page at index n (1-based) is wider than it is tall
(likely a glued-together spread that should be shown solo).