summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-03-27 21:52:39 +0100
committerLaurenz <laurmaedje@gmail.com>2021-03-27 21:52:39 +0100
commit57ca9628c14378e8816a8a1f1530ae69c2269907 (patch)
tree01c4dfa7be25047b3f50fc7a186b03d2cd3394b7 /src/library
parent76fc4cca62f5b955200b2c62cc85b69eea491ece (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.rs2
-rw-r--r--src/library/image.rs2
-rw-r--r--src/library/lang.rs2
-rw-r--r--src/library/markup.rs10
-rw-r--r--src/library/pad.rs2
-rw-r--r--src/library/page.rs6
-rw-r--r--src/library/par.rs2
-rw-r--r--src/library/shapes.rs8
-rw-r--r--src/library/spacing.rs2
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);
}
})
}