diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-06-08 19:31:07 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-08 19:31:07 +0200 |
| commit | cd5a14bc240b21f8f538ff7fc1d116d23611d6c5 (patch) | |
| tree | f4b8a7e8a941f8653d5061d2f7acc0bfd8d92b13 /src/library/layout | |
| parent | b905048d4bb497252028df6d21b525fefb6b64c3 (diff) | |
| parent | 72d3f3fffabe6872eb7839585bea925b89aac6a4 (diff) | |
Merge pull request #75 from typst/semantics
Frame Role and PDF outline
Diffstat (limited to 'src/library/layout')
| -rw-r--r-- | src/library/layout/flow.rs | 7 | ||||
| -rw-r--r-- | src/library/layout/grid.rs | 16 | ||||
| -rw-r--r-- | src/library/layout/page.rs | 26 | ||||
| -rw-r--r-- | src/library/layout/stack.rs | 7 |
4 files changed, 47 insertions, 9 deletions
diff --git a/src/library/layout/flow.rs b/src/library/layout/flow.rs index 6193a68f..f779c8b1 100644 --- a/src/library/layout/flow.rs +++ b/src/library/layout/flow.rs @@ -182,7 +182,12 @@ impl FlowLayouter { let frames = node.layout(ctx, &self.regions, styles)?; let len = frames.len(); - for (i, frame) in frames.into_iter().enumerate() { + for (i, mut frame) in frames.into_iter().enumerate() { + // Set the generic block role. + if frame.role().map_or(true, Role::is_weak) { + Arc::make_mut(&mut frame).apply_role(Role::GenericBlock); + } + // Grow our size, shrink the region and save the frame for later. let size = frame.size; self.used.y += size.y; diff --git a/src/library/layout/grid.rs b/src/library/layout/grid.rs index 4cad9de6..2d6eb259 100644 --- a/src/library/layout/grid.rs +++ b/src/library/layout/grid.rs @@ -450,6 +450,7 @@ impl<'a> GridLayouter<'a> { /// Layout a row with fixed height and return its frame. fn layout_single_row(&mut self, height: Length, y: usize) -> TypResult<Frame> { let mut output = Frame::new(Size::new(self.used.x, height)); + let mut pos = Point::zero(); for (x, &rcol) in self.rcols.iter().enumerate() { @@ -464,6 +465,14 @@ impl<'a> GridLayouter<'a> { let pod = Regions::one(size, base, Spec::splat(true)); let frame = node.layout(self.ctx, &pod, self.styles)?.remove(0); + match frame.role() { + Some(Role::ListLabel | Role::ListItemBody) => { + output.apply_role(Role::ListItem) + } + Some(Role::TableCell) => output.apply_role(Role::TableRow), + _ => {} + } + output.push_frame(pos, frame); } @@ -505,6 +514,13 @@ impl<'a> GridLayouter<'a> { // Push the layouted frames into the individual output frames. let frames = node.layout(self.ctx, &pod, self.styles)?; for (output, frame) in outputs.iter_mut().zip(frames) { + match frame.role() { + Some(Role::ListLabel | Role::ListItemBody) => { + output.apply_role(Role::ListItem) + } + Some(Role::TableCell) => output.apply_role(Role::TableRow), + _ => {} + } output.push_frame(pos, frame); } } diff --git a/src/library/layout/page.rs b/src/library/layout/page.rs index 8435e510..115a1923 100644 --- a/src/library/layout/page.rs +++ b/src/library/layout/page.rs @@ -110,16 +110,28 @@ impl PageNode { let pad = padding.resolve(styles).relative_to(size); let pw = size.x - pad.left - pad.right; let py = size.y - pad.bottom; - for (marginal, pos, area) in [ - (header, Point::with_x(pad.left), Size::new(pw, pad.top)), - (footer, Point::new(pad.left, py), Size::new(pw, pad.bottom)), - (foreground, Point::zero(), size), - (background, Point::zero(), size), + for (role, marginal, pos, area) in [ + ( + Role::Header, + header, + Point::with_x(pad.left), + Size::new(pw, pad.top), + ), + ( + Role::Footer, + footer, + Point::new(pad.left, py), + Size::new(pw, pad.bottom), + ), + (Role::Foreground, foreground, Point::zero(), size), + (Role::Background, background, Point::zero(), size), ] { if let Some(content) = marginal.resolve(ctx, page)? { let pod = Regions::one(area, area, Spec::splat(true)); - let sub = content.layout(ctx, &pod, styles)?.remove(0); - if std::ptr::eq(marginal, background) { + let mut sub = content.layout(ctx, &pod, styles)?.remove(0); + Arc::make_mut(&mut sub).apply_role(role); + + if role == Role::Background { Arc::make_mut(frame).prepend_frame(pos, sub); } else { Arc::make_mut(frame).push_frame(pos, sub); diff --git a/src/library/layout/stack.rs b/src/library/layout/stack.rs index 828ff8e3..9c2cbccd 100644 --- a/src/library/layout/stack.rs +++ b/src/library/layout/stack.rs @@ -194,7 +194,12 @@ impl<'a> StackLayouter<'a> { let frames = node.layout(ctx, &self.regions, styles)?; let len = frames.len(); - for (i, frame) in frames.into_iter().enumerate() { + for (i, mut frame) in frames.into_iter().enumerate() { + // Set the generic block role. + if frame.role().map_or(true, Role::is_weak) { + Arc::make_mut(&mut frame).apply_role(Role::GenericBlock); + } + // Grow our size, shrink the region and save the frame for later. let size = frame.size.to_gen(self.axis); self.used.main += size.main; |
