59 lines
1.3 KiB
Rust
59 lines
1.3 KiB
Rust
use crate::prelude::*;
|
|
|
|
/// # Repeat
|
|
/// Repeats content to fill a line.
|
|
///
|
|
/// This can be useful when implementing a custom index, reference, or outline.
|
|
///
|
|
/// Space may be inserted between the instances of the body parameter, so be
|
|
/// sure to include negative space if you need the instances to overlap.
|
|
///
|
|
/// ## Example
|
|
/// ```example
|
|
/// Sign on the dotted line: #repeat[.]
|
|
///
|
|
/// #set text(10pt)
|
|
/// #v(8pt, weak: true)
|
|
/// #align(right)[
|
|
/// Berlin, the 22nd of December, 2022
|
|
/// ]
|
|
/// ```
|
|
///
|
|
/// ## Parameters
|
|
/// - body: `Content` (positional, required)
|
|
/// The content to repeat.
|
|
///
|
|
/// ## Category
|
|
/// layout
|
|
#[func]
|
|
#[capable(Layout, Inline)]
|
|
#[derive(Debug, Hash)]
|
|
pub struct RepeatNode(pub Content);
|
|
|
|
#[node]
|
|
impl RepeatNode {
|
|
fn construct(_: &Vm, args: &mut Args) -> SourceResult<Content> {
|
|
Ok(Self(args.expect("body")?).pack())
|
|
}
|
|
|
|
fn field(&self, name: &str) -> Option<Value> {
|
|
match name {
|
|
"body" => Some(Value::Content(self.0.clone())),
|
|
_ => None,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Layout for RepeatNode {
|
|
fn layout(
|
|
&self,
|
|
vt: &mut Vt,
|
|
styles: StyleChain,
|
|
regions: Regions,
|
|
) -> SourceResult<Fragment> {
|
|
self.0.layout(vt, styles, regions)
|
|
}
|
|
}
|
|
|
|
impl Inline for RepeatNode {}
|