diff options
| author | Laurenz <laurmaedje@gmail.com> | 2024-01-17 21:50:35 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2024-01-17 21:53:20 +0100 |
| commit | 6ac71eeaf7b68dab07f75bd1a480810481fa9b73 (patch) | |
| tree | d452e7323200fe56d61a34b91c8b98826d60978c /crates/typst-svg/src | |
| parent | 50741209a8f4c5e91d35281eb44b7425b3d022b2 (diff) | |
Add `Page` struct
To get rid of the Meta hack where numbering and things like that are stored in the frame.
Diffstat (limited to 'crates/typst-svg/src')
| -rw-r--r-- | crates/typst-svg/src/lib.rs | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/crates/typst-svg/src/lib.rs b/crates/typst-svg/src/lib.rs index bb451cbe..035ec330 100644 --- a/crates/typst-svg/src/lib.rs +++ b/crates/typst-svg/src/lib.rs @@ -11,6 +11,7 @@ use typst::layout::{ Abs, Angle, Axes, Frame, FrameItem, FrameKind, GroupItem, Point, Quadrant, Ratio, Size, Transform, }; +use typst::model::Document; use typst::text::{Font, TextItem}; use typst::util::hash128; use typst::visualize::{ @@ -35,24 +36,33 @@ pub fn svg(frame: &Frame) -> String { renderer.finalize() } -/// Export multiple frames into a single SVG file. +/// Export a document with potentially multiple pages into a single SVG file. /// /// The padding will be added around and between the individual frames. -pub fn svg_merged(frames: &[Frame], padding: Abs) -> String { +pub fn svg_merged(document: &Document, padding: Abs) -> String { let width = 2.0 * padding - + frames.iter().map(|frame| frame.width()).max().unwrap_or_default(); - let height = padding + frames.iter().map(|page| page.height() + padding).sum::<Abs>(); - let size = Size::new(width, height); + + document + .pages + .iter() + .map(|page| page.frame.width()) + .max() + .unwrap_or_default(); + let height = padding + + document + .pages + .iter() + .map(|page| page.frame.height() + padding) + .sum::<Abs>(); let mut renderer = SVGRenderer::new(); - renderer.write_header(size); + renderer.write_header(Size::new(width, height)); let [x, mut y] = [padding; 2]; - for frame in frames { + for page in &document.pages { let ts = Transform::translate(x, y); - let state = State::new(frame.size(), Transform::identity()); - renderer.render_frame(state, ts, frame); - y += frame.height() + padding; + let state = State::new(page.frame.size(), Transform::identity()); + renderer.render_frame(state, ts, &page.frame); + y += page.frame.height() + padding; } renderer.finalize() |
