From ca3df70e2a5069832d7d2135967674c34a155442 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 19 Mar 2021 13:32:12 +0100 Subject: [PATCH] =?UTF-8?q?Add=20basic=20paragraph=20function=20?= =?UTF-8?q?=F0=9F=93=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allows to change: - (paragraph) spacing - leading - word-spacing --- src/library/mod.rs | 3 +++ src/library/par.rs | 41 ++++++++++++++++++++++++++++++++ tests/ref/library/paragraph.png | Bin 0 -> 4170 bytes tests/typ/library/paragraph.typ | 13 ++++++++++ 4 files changed, 57 insertions(+) create mode 100644 src/library/par.rs create mode 100644 tests/ref/library/paragraph.png create mode 100644 tests/typ/library/paragraph.typ diff --git a/src/library/mod.rs b/src/library/mod.rs index 453eab26b..e813a138d 100644 --- a/src/library/mod.rs +++ b/src/library/mod.rs @@ -9,6 +9,7 @@ mod font; mod image; mod pad; mod page; +mod par; mod shapes; mod spacing; @@ -18,6 +19,7 @@ pub use base::*; pub use font::*; pub use pad::*; pub use page::*; +pub use par::*; pub use shapes::*; pub use spacing::*; @@ -50,6 +52,7 @@ pub fn new() -> Scope { set!(func: "pad", pad); set!(func: "page", page); set!(func: "pagebreak", pagebreak); + set!(func: "paragraph", paragraph); set!(func: "rect", rect); set!(func: "repr", repr); set!(func: "rgb", rgb); diff --git a/src/library/par.rs b/src/library/par.rs new file mode 100644 index 000000000..8242bfdcf --- /dev/null +++ b/src/library/par.rs @@ -0,0 +1,41 @@ +use super::*; + +/// `paragraph`: Configure paragraphs. +/// +/// # Named parameters +/// - Paragraph spacing: `spacing`, of type `linear` relative to current font size. +/// - Line leading: `leading`, of type `linear` relative to current font size. +/// - Word spacing: `word-spacing`, of type `linear` relative to current font size. +/// +/// # Return value +/// A template that configures paragraph properties. The effect is scoped to the +/// body if present. +pub fn paragraph(ctx: &mut EvalContext, args: &mut ValueArgs) -> Value { + let spacing = args.get(ctx, "spacing"); + let leading = args.get(ctx, "leading"); + let word_spacing = args.get(ctx, "word-spacing"); + let body = args.find::(ctx); + + Value::template("paragraph", move |ctx| { + let snapshot = ctx.state.clone(); + + if let Some(spacing) = spacing { + ctx.state.par.spacing = spacing; + } + + if let Some(leading) = leading { + ctx.state.par.leading = leading; + } + + if let Some(word_spacing) = word_spacing { + ctx.state.par.word_spacing = word_spacing; + } + + ctx.push_parbreak(); + + if let Some(body) = &body { + body.exec(ctx); + ctx.state = snapshot; + } + }) +} diff --git a/tests/ref/library/paragraph.png b/tests/ref/library/paragraph.png new file mode 100644 index 0000000000000000000000000000000000000000..bf38bdf8ccdb000dc1bfb2cd79f6c69db0ad896d GIT binary patch literal 4170 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