diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-03-27 21:52:39 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-03-27 21:52:39 +0100 |
| commit | 57ca9628c14378e8816a8a1f1530ae69c2269907 (patch) | |
| tree | 01c4dfa7be25047b3f50fc7a186b03d2cd3394b7 /src/library | |
| parent | 76fc4cca62f5b955200b2c62cc85b69eea491ece (diff) | |
Better space coalescing logic 🌧
This creates a smaller state machine helper type for softness coalescing, which does not own the resulting nodes. While this creates a bit more duplication in stack and par builder, it makes it a lot easier to integrate additional logic into the paragraph builder.
Furthermore:
- Line breaks are now "hard", that is, not coalesced with each other.
- Text nodes with equal style are now merged allowing for example `f{}i` to form a ligature.
Diffstat (limited to 'src/library')
| -rw-r--r-- | src/library/align.rs | 2 | ||||
| -rw-r--r-- | src/library/image.rs | 2 | ||||
| -rw-r--r-- | src/library/lang.rs | 2 | ||||
| -rw-r--r-- | src/library/markup.rs | 10 | ||||
| -rw-r--r-- | src/library/pad.rs | 2 | ||||
| -rw-r--r-- | src/library/page.rs | 6 | ||||
| -rw-r--r-- | src/library/par.rs | 2 | ||||
| -rw-r--r-- | src/library/shapes.rs | 8 | ||||
| -rw-r--r-- | src/library/spacing.rs | 2 |
9 files changed, 18 insertions, 18 deletions
diff --git a/src/library/align.rs b/src/library/align.rs index d5811bf4..ccb25b34 100644 --- a/src/library/align.rs +++ b/src/library/align.rs @@ -52,7 +52,7 @@ pub fn align(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { if let Some(vertical) = vertical { ctx.state.aligns.main = vertical.to_align(Dir::TTB); if ctx.state.aligns.main != snapshot.aligns.main { - ctx.push_linebreak(); + ctx.parbreak(); } } diff --git a/src/library/image.rs b/src/library/image.rs index 020f7d50..ed7b2268 100644 --- a/src/library/image.rs +++ b/src/library/image.rs @@ -23,7 +23,7 @@ pub fn image(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { let loaded = ctx.env.resources.load(&path.v, ImageResource::parse); if let Some((res, img)) = loaded { let dimensions = img.buf.dimensions(); - ctx.push_into_par(ImageNode { res, dimensions, width, height }); + ctx.push(ImageNode { res, dimensions, width, height }); } else { ctx.diag(error!(path.span, "failed to load image")); } diff --git a/src/library/lang.rs b/src/library/lang.rs index 79015c7d..1248b707 100644 --- a/src/library/lang.rs +++ b/src/library/lang.rs @@ -32,7 +32,7 @@ pub fn lang(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { } } - ctx.push_parbreak(); + ctx.parbreak(); }) } diff --git a/src/library/markup.rs b/src/library/markup.rs index d7d750ea..ac2356a9 100644 --- a/src/library/markup.rs +++ b/src/library/markup.rs @@ -14,7 +14,7 @@ use crate::syntax::{HeadingNode, RawNode}; /// A template that inserts a line break. pub fn linebreak(_: &mut EvalContext, _: &mut FuncArgs) -> Value { Value::template(Node::LINEBREAK, move |ctx| { - ctx.push_linebreak(); + ctx.linebreak(); }) } @@ -24,7 +24,7 @@ pub fn linebreak(_: &mut EvalContext, _: &mut FuncArgs) -> Value { /// A template that inserts a paragraph break. pub fn parbreak(_: &mut EvalContext, _: &mut FuncArgs) -> Value { Value::template(Node::PARBREAK, move |ctx| { - ctx.push_parbreak(); + ctx.parbreak(); }) } @@ -118,7 +118,7 @@ pub fn heading(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { body.exec(ctx); ctx.state = snapshot; - ctx.push_parbreak(); + ctx.parbreak(); }) } @@ -155,7 +155,7 @@ pub fn raw(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { Value::template(Node::RAW, move |ctx| { if block { - ctx.push_parbreak(); + ctx.parbreak(); } let snapshot = ctx.state.clone(); @@ -164,7 +164,7 @@ pub fn raw(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { ctx.state = snapshot; if block { - ctx.push_parbreak(); + ctx.parbreak(); } }) } diff --git a/src/library/pad.rs b/src/library/pad.rs index d6b69007..7c422239 100644 --- a/src/library/pad.rs +++ b/src/library/pad.rs @@ -32,6 +32,6 @@ pub fn pad(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { Value::template("pad", move |ctx| { let child = ctx.exec_group(&body).into(); - ctx.push_into_par(PadNode { padding, child }); + ctx.push(PadNode { padding, child }); }) } diff --git a/src/library/page.rs b/src/library/page.rs index fb3542ed..7b8557be 100644 --- a/src/library/page.rs +++ b/src/library/page.rs @@ -83,13 +83,13 @@ pub fn page(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { std::mem::swap(&mut page.size.width, &mut page.size.height); } - ctx.finish_page(false, true, span); + ctx.pagebreak(false, true, span); if let Some(body) = &body { // TODO: Restrict body to a single page? body.exec(ctx); ctx.state = snapshot; - ctx.finish_page(true, false, span); + ctx.pagebreak(true, false, span); } }) } @@ -101,6 +101,6 @@ pub fn page(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { pub fn pagebreak(_: &mut EvalContext, args: &mut FuncArgs) -> Value { let span = args.span; Value::template("pagebreak", move |ctx| { - ctx.finish_page(true, true, span); + ctx.pagebreak(true, true, span); }) } diff --git a/src/library/par.rs b/src/library/par.rs index cf2549bf..92fc20e8 100644 --- a/src/library/par.rs +++ b/src/library/par.rs @@ -27,6 +27,6 @@ pub fn par(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { ctx.state.par.word_spacing = word_spacing; } - ctx.push_parbreak(); + ctx.parbreak(); }) } diff --git a/src/library/shapes.rs b/src/library/shapes.rs index 6f9e6677..6c6a2f0b 100644 --- a/src/library/shapes.rs +++ b/src/library/shapes.rs @@ -63,13 +63,13 @@ fn rect_impl( let node = FixedNode { width, height, aspect, child }; if let Some(color) = fill { - ctx.push_into_par(BackgroundNode { + ctx.push(BackgroundNode { shape: BackgroundShape::Rect, fill: Fill::Color(color), child: node.into(), }); } else { - ctx.push_into_par(node); + ctx.push(node); } }) } @@ -146,13 +146,13 @@ fn ellipse_impl( }; if let Some(color) = fill { - ctx.push_into_par(BackgroundNode { + ctx.push(BackgroundNode { shape: BackgroundShape::Ellipse, fill: Fill::Color(color), child: node.into(), }); } else { - ctx.push_into_par(node); + ctx.push(node); } }) } diff --git a/src/library/spacing.rs b/src/library/spacing.rs index 6a67a653..36cd88fb 100644 --- a/src/library/spacing.rs +++ b/src/library/spacing.rs @@ -32,7 +32,7 @@ fn spacing_impl( Value::template(name, move |ctx| { if let Some(linear) = spacing { let amount = linear.resolve(ctx.state.font.resolve_size()); - ctx.push_spacing(axis, amount, 0); + ctx.push_spacing(axis, amount); } }) } |
