diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-03-12 14:16:59 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-03-12 14:16:59 +0100 |
| commit | c3acb491e38d333acff6897479f7dd9c86fba307 (patch) | |
| tree | 7bf33511e7631c2ebff1b1f438eeefba6e3ae6a2 /src/library | |
| parent | 584a43277dbfbdba834a2681afe63d10598db3f9 (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.rs | 7 | ||||
| -rw-r--r-- | src/library/pad.rs | 2 | ||||
| -rw-r--r-- | src/library/page.rs | 11 | ||||
| -rw-r--r-- | src/library/shapes.rs | 2 | ||||
| -rw-r--r-- | src/library/spacing.rs | 4 |
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); } |
