mirror of
https://github.com/typst/typst
synced 2025-05-14 04:56:26 +08:00
38 lines
1.3 KiB
Rust
38 lines
1.3 KiB
Rust
use super::*;
|
|
use crate::layout::PadNode;
|
|
|
|
/// `pad`: Pad content at the sides.
|
|
///
|
|
/// # Positional parameters
|
|
/// - Padding for all sides: `padding`, of type `linear` relative to sides.
|
|
/// - Body: of type `template`.
|
|
///
|
|
/// # Named parameters
|
|
/// - Left padding: `left`, of type `linear` relative to parent width.
|
|
/// - Right padding: `right`, of type `linear` relative to parent width.
|
|
/// - Top padding: `top`, of type `linear` relative to parent height.
|
|
/// - Bottom padding: `bottom`, of type `linear` relative to parent height.
|
|
///
|
|
/// # Return value
|
|
/// A template that pads its region and sets the body into it.
|
|
pub fn pad(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
|
|
let all = args.eat(ctx);
|
|
let left = args.named(ctx, "left");
|
|
let top = args.named(ctx, "top");
|
|
let right = args.named(ctx, "right");
|
|
let bottom = args.named(ctx, "bottom");
|
|
let body = args.expect::<TemplateValue>(ctx, "body").unwrap_or_default();
|
|
|
|
let padding = Sides::new(
|
|
left.or(all).unwrap_or_default(),
|
|
top.or(all).unwrap_or_default(),
|
|
right.or(all).unwrap_or_default(),
|
|
bottom.or(all).unwrap_or_default(),
|
|
);
|
|
|
|
Value::template("pad", move |ctx| {
|
|
let child = ctx.exec_template_stack(&body).into();
|
|
ctx.push_into_stack(PadNode { padding, child });
|
|
})
|
|
}
|