summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2020-10-19 13:05:54 +0200
committerLaurenz <laurmaedje@gmail.com>2020-10-19 13:05:54 +0200
commitee38c6aa9adefe4ca3ddc4aef22a216d7fb4c048 (patch)
tree47aeb7f620785c59cd0436adb929436b4aa98955 /src/library
parent91e512069396f1de616ec2b0fe0cd31a76e7f2e9 (diff)
Allow configuration of directions in page and box ↗
Diffstat (limited to 'src/library')
-rw-r--r--src/library/align.rs8
-rw-r--r--src/library/boxed.rs4
-rw-r--r--src/library/font.rs2
-rw-r--r--src/library/page.rs14
4 files changed, 21 insertions, 7 deletions
diff --git a/src/library/align.rs b/src/library/align.rs
index a54925f0..4f4a1750 100644
--- a/src/library/align.rs
+++ b/src/library/align.rs
@@ -17,7 +17,6 @@ use std::fmt::{self, Display, Formatter};
/// There may not be two alignment specifications for the same axis.
pub fn align(mut args: Args, ctx: &mut EvalContext) -> Value {
let snapshot = ctx.state.clone();
-
let body = args.find::<SynTree>();
let first = args.get::<_, Spanned<AlignArg>>(ctx, 0);
let second = args.get::<_, Spanned<AlignArg>>(ctx, 1);
@@ -33,13 +32,14 @@ pub fn align(mut args: Args, ctx: &mut EvalContext) -> Value {
.chain(ver.into_iter().map(|align| (Some(SpecAxis::Vertical), align)));
let align = dedup_aligns(ctx, iter);
- if align.main != ctx.state.align.main {
+ let ends_par = align.main != ctx.state.align.main;
+ ctx.state.align = align;
+
+ if ends_par {
ctx.end_par_group();
ctx.start_par_group();
}
- ctx.state.align = align;
-
if let Some(body) = body {
body.eval(ctx);
ctx.state = snapshot;
diff --git a/src/library/boxed.rs b/src/library/boxed.rs
index 3d7214ae..1ec17d88 100644
--- a/src/library/boxed.rs
+++ b/src/library/boxed.rs
@@ -9,10 +9,12 @@ use crate::prelude::*;
/// - `height`: The height of the box (length or relative to parent's height).
pub fn boxed(mut args: Args, ctx: &mut EvalContext) -> Value {
let snapshot = ctx.state.clone();
-
let body = args.find::<SynTree>().unwrap_or_default();
let width = args.get::<_, Linear>(ctx, "width");
let height = args.get::<_, Linear>(ctx, "height");
+ let main = args.get::<_, Spanned<Dir>>(ctx, "main");
+ let cross = args.get::<_, Spanned<Dir>>(ctx, "cross");
+ ctx.set_flow(Gen::new(main, cross));
args.done(ctx);
let flow = ctx.state.flow;
diff --git a/src/library/font.rs b/src/library/font.rs
index bb84f06b..5de0a953 100644
--- a/src/library/font.rs
+++ b/src/library/font.rs
@@ -53,7 +53,6 @@ use crate::prelude::*;
/// ```
pub fn font(mut args: Args, ctx: &mut EvalContext) -> Value {
let snapshot = ctx.state.clone();
-
let body = args.find::<SynTree>();
if let Some(linear) = args.find::<Linear>() {
@@ -67,7 +66,6 @@ pub fn font(mut args: Args, ctx: &mut EvalContext) -> Value {
let mut needs_flattening = false;
let list: Vec<_> = args.find_all::<StringLike>().map(|s| s.to_lowercase()).collect();
-
if !list.is_empty() {
Rc::make_mut(&mut ctx.state.font.families).list = list;
needs_flattening = true;
diff --git a/src/library/page.rs b/src/library/page.rs
index efb40f10..05709865 100644
--- a/src/library/page.rs
+++ b/src/library/page.rs
@@ -17,6 +17,9 @@ use crate::prelude::*;
/// - `bottom`: The bottom margin (length or relative to height).
/// - `flip`: Flips custom or paper-defined width and height (boolean).
pub fn page(mut args: Args, ctx: &mut EvalContext) -> Value {
+ let snapshot = ctx.state.clone();
+ let body = args.find::<SynTree>();
+
if let Some(paper) = args.find::<Paper>() {
ctx.state.page.class = paper.class;
ctx.state.page.size = paper.size();
@@ -57,8 +60,19 @@ pub fn page(mut args: Args, ctx: &mut EvalContext) -> Value {
std::mem::swap(&mut size.width, &mut size.height);
}
+ let main = args.get::<_, Spanned<Dir>>(ctx, "main");
+ let cross = args.get::<_, Spanned<Dir>>(ctx, "cross");
+ ctx.set_flow(Gen::new(main, cross));
+
args.done(ctx);
+ if let Some(body) = body {
+ ctx.end_page_group();
+ ctx.start_page_group(true);
+ body.eval(ctx);
+ ctx.state = snapshot;
+ }
+
ctx.end_page_group();
ctx.start_page_group(false);