summaryrefslogtreecommitdiff
path: root/crates/typst-svg/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2024-01-17 21:50:35 +0100
committerLaurenz <laurmaedje@gmail.com>2024-01-17 21:53:20 +0100
commit6ac71eeaf7b68dab07f75bd1a480810481fa9b73 (patch)
treed452e7323200fe56d61a34b91c8b98826d60978c /crates/typst-svg/src
parent50741209a8f4c5e91d35281eb44b7425b3d022b2 (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.rs30
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()