summaryrefslogtreecommitdiff
path: root/src/library/layout
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-06-08 19:31:07 +0200
committerGitHub <noreply@github.com>2022-06-08 19:31:07 +0200
commitcd5a14bc240b21f8f538ff7fc1d116d23611d6c5 (patch)
treef4b8a7e8a941f8653d5061d2f7acc0bfd8d92b13 /src/library/layout
parentb905048d4bb497252028df6d21b525fefb6b64c3 (diff)
parent72d3f3fffabe6872eb7839585bea925b89aac6a4 (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.rs7
-rw-r--r--src/library/layout/grid.rs16
-rw-r--r--src/library/layout/page.rs26
-rw-r--r--src/library/layout/stack.rs7
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;