Split pushed text at newlines ✂

This commit is contained in:
Laurenz 2021-02-21 11:43:25 +01:00
parent 4d42c79b16
commit de37a056ed
5 changed files with 24 additions and 13 deletions

View File

@ -9,6 +9,7 @@ use crate::geom::{ChildAlign, Dir, Gen, LayoutDirs, Length, Linear, Sides, Size}
use crate::layout::{
Expansion, Node, NodePad, NodePages, NodePar, NodeSpacing, NodeStack, NodeText, Tree,
};
use crate::parse::is_newline;
/// The context for execution.
#[derive(Debug)]
@ -217,7 +218,7 @@ impl<'a> ExecContext<'a> {
}
}
/// Push a normal space.
/// Push a normal word space.
pub fn push_space(&mut self) {
let em = self.state.font.font_size();
self.push(NodeSpacing {
@ -226,10 +227,20 @@ impl<'a> ExecContext<'a> {
});
}
/// Push a text node.
pub fn push_text(&mut self, text: impl Into<String>) {
let node = self.make_text_node(text.into());
self.push(node);
/// Push text into the context.
///
/// The text is split into lines at newlines.
pub fn push_text(&mut self, text: &str) {
let mut newline = false;
for line in text.split_terminator(is_newline) {
if newline {
self.apply_linebreak();
}
let node = self.make_text_node(line.into());
self.push(node);
newline = true;
}
}
/// Construct a text node from the given string based on the active text

View File

@ -139,17 +139,17 @@ impl Exec for Value {
fn exec(&self, ctx: &mut ExecContext) {
match self {
Value::None => {}
Value::Int(v) => ctx.push_text(pretty(v)),
Value::Float(v) => ctx.push_text(pretty(v)),
Value::Str(s) => ctx.push_text(s),
Value::Template(template) => template.exec(ctx),
Value::Int(v) => ctx.push_text(&pretty(v)),
Value::Float(v) => ctx.push_text(&pretty(v)),
Value::Str(v) => ctx.push_text(v),
Value::Template(v) => v.exec(ctx),
Value::Error => {}
other => {
// For values which can't be shown "naturally", we print
// the representation in monospace.
let prev = Rc::clone(&ctx.state.font.families);
ctx.apply_monospace();
ctx.push_text(pretty(other));
ctx.push_text(&pretty(other));
ctx.state.font.families = prev;
}
}
@ -168,8 +168,8 @@ impl Exec for TemplateNode {
fn exec(&self, ctx: &mut ExecContext) {
match self {
Self::Tree { tree, map } => tree.exec_with_map(ctx, &map),
Self::Str(s) => ctx.push_text(s),
Self::Func(func) => func.exec(ctx),
Self::Str(v) => ctx.push_text(v),
Self::Func(v) => v.exec(ctx),
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@ -11,7 +11,7 @@ Sometimes there is no box.
// Empty box with fixed width and height.
#box(width: 6cm, height: 12pt, color: #CB4CED)
// Not visiblem, but creates a gap between the boxes above and below.
// Not visible, but creates a gap between the boxes above and below.
#box(width: 2in, color: #ff0000)
// These are in a row!