summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-03-12 14:16:59 +0100
committerLaurenz <laurmaedje@gmail.com>2021-03-12 14:16:59 +0100
commitc3acb491e38d333acff6897479f7dd9c86fba307 (patch)
tree7bf33511e7631c2ebff1b1f438eeefba6e3ae6a2 /src/library
parent584a43277dbfbdba834a2681afe63d10598db3f9 (diff)
Refactor execution context 🏗
- The execution context is a lot more structured: Instead of a magic stack of arbitrary objects there are static objects for pages, stacks and paragraphs - Page softness/keeping mechanic is now a lot simpler than before
Diffstat (limited to 'src/library')
-rw-r--r--src/library/align.rs7
-rw-r--r--src/library/pad.rs2
-rw-r--r--src/library/page.rs11
-rw-r--r--src/library/shapes.rs2
-rw-r--r--src/library/spacing.rs4
5 files changed, 9 insertions, 17 deletions
diff --git a/src/library/align.rs b/src/library/align.rs
index 07566f2d..98feb3ef 100644
--- a/src/library/align.rs
+++ b/src/library/align.rs
@@ -89,15 +89,14 @@ pub fn align(ctx: &mut EvalContext, args: &mut ValueArgs) -> Value {
}
}
- // If `had_center` wasn't flushed by now, it's the only argument and then we
- // default to applying it to the cross axis.
+ // If `had_center` wasn't flushed by now, it's the only argument and
+ // then we default to applying it to the cross axis.
if had_center {
ctx.state.aligns.cross = Align::Center;
}
if ctx.state.aligns.main != snapshot.aligns.main {
- ctx.end_par_group();
- ctx.start_par_group();
+ ctx.push_linebreak();
}
if let Some(body) = &body {
diff --git a/src/library/pad.rs b/src/library/pad.rs
index 0bf93093..ba28bf8e 100644
--- a/src/library/pad.rs
+++ b/src/library/pad.rs
@@ -29,7 +29,7 @@ pub fn pad(ctx: &mut EvalContext, args: &mut ValueArgs) -> Value {
Value::template("pad", move |ctx| {
let snapshot = ctx.state.clone();
- let child = ctx.exec(&body);
+ let child = ctx.exec(&body).into();
ctx.push(NodePad { padding, child });
ctx.state = snapshot;
diff --git a/src/library/page.rs b/src/library/page.rs
index 4ab92b31..963ab913 100644
--- a/src/library/page.rs
+++ b/src/library/page.rs
@@ -83,25 +83,20 @@ pub fn page(ctx: &mut EvalContext, args: &mut ValueArgs) -> Value {
}
ctx.set_dirs(Gen::new(main, cross));
+ ctx.finish_page(false, Softness::Hard);
- let mut softness = ctx.end_page_group(|_| false);
if let Some(body) = &body {
// TODO: Restrict body to a single page?
- ctx.start_page_group(Softness::Hard);
body.exec(ctx);
- ctx.end_page_group(|s| s == Softness::Hard);
- softness = Softness::Soft;
ctx.state = snapshot;
+ ctx.finish_page(true, Softness::Soft);
}
-
- ctx.start_page_group(softness);
})
}
/// `pagebreak`: Start a new page.
pub fn pagebreak(_: &mut EvalContext, _: &mut ValueArgs) -> Value {
Value::template("pagebreak", move |ctx| {
- ctx.end_page_group(|_| true);
- ctx.start_page_group(Softness::Hard);
+ ctx.finish_page(true, Softness::Hard);
})
}
diff --git a/src/library/shapes.rs b/src/library/shapes.rs
index 9c466318..254a2285 100644
--- a/src/library/shapes.rs
+++ b/src/library/shapes.rs
@@ -31,7 +31,7 @@ pub fn box_(ctx: &mut EvalContext, args: &mut ValueArgs) -> Value {
ctx.set_dirs(Gen::new(main, cross));
- let child = ctx.exec(&body);
+ let child = ctx.exec(&body).into();
let fixed = NodeFixed { width, height, child };
if let Some(color) = color {
ctx.push(NodeBackground {
diff --git a/src/library/spacing.rs b/src/library/spacing.rs
index 624890e9..3cc718b2 100644
--- a/src/library/spacing.rs
+++ b/src/library/spacing.rs
@@ -25,9 +25,7 @@ fn spacing(ctx: &mut EvalContext, args: &mut ValueArgs, axis: SpecAxis) -> Value
let amount = linear.resolve(ctx.state.font.font_size());
let spacing = NodeSpacing { amount, softness: Softness::Hard };
if axis == ctx.state.dirs.main.axis() {
- ctx.end_par_group();
- ctx.push(spacing);
- ctx.start_par_group();
+ ctx.push_into_stack(spacing);
} else {
ctx.push(spacing);
}