blob: c6f96a136b6ebdb4b749cd9bd34481324a7062bb (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
use super::prelude::*;
/// `align`: Configure the alignment along the layouting axes.
pub fn align(ctx: &mut EvalContext, args: &mut Args) -> TypResult<Value> {
let first = args.find::<Align>();
let second = args.find::<Align>();
let body = args.find::<Template>();
let mut horizontal = args.named("horizontal")?;
let mut vertical = args.named("vertical")?;
for value in first.into_iter().chain(second) {
match value.axis() {
Some(SpecAxis::Horizontal) | None if horizontal.is_none() => {
horizontal = Some(value);
}
Some(SpecAxis::Vertical) | None if vertical.is_none() => {
vertical = Some(value);
}
_ => {}
}
}
let realign = |template: &mut Template| {
template.modify(move |style| {
if let Some(horizontal) = horizontal {
style.aligns.inline = horizontal;
}
if let Some(vertical) = vertical {
style.aligns.block = vertical;
}
});
if vertical.is_some() {
template.parbreak();
}
};
Ok(if let Some(body) = body {
let mut template = Template::new();
template.save();
realign(&mut template);
template += body;
template.restore();
Value::Template(template)
} else {
realign(&mut ctx.template);
Value::None
})
}
|