mirror of
https://github.com/typst/typst
synced 2025-05-14 04:56:26 +08:00
55 lines
1.7 KiB
Rust
55 lines
1.7 KiB
Rust
use crate::prelude::*;
|
|
|
|
/// Measure the layouted size of content.
|
|
///
|
|
/// The `measure` function lets you determine the layouted size of content.
|
|
/// Note that an infinite space is assumed, therefore the measured height/width
|
|
/// may not necessarily match the final height/width of the measured content.
|
|
/// If you want to measure in the current layout dimensions, you can combined
|
|
/// `measure` and [`layout`]($func/layout).
|
|
///
|
|
/// The same content can have a different size depending on the styles that
|
|
/// are active when it is layouted. For example, in the example below
|
|
/// `[#content]` is of course bigger when we increase the font size.
|
|
///
|
|
/// ```example
|
|
/// #let content = [Hello!]
|
|
/// #content
|
|
/// #set text(14pt)
|
|
/// #content
|
|
/// ```
|
|
///
|
|
/// To do a meaningful measurement, you therefore first need to retrieve the
|
|
/// active styles with the [`style`]($func/style) function. You can then pass
|
|
/// them to the `measure` function.
|
|
///
|
|
/// ```example
|
|
/// #let thing(body) = style(styles => {
|
|
/// let size = measure(body, styles)
|
|
/// [Width of "#body" is #size.width]
|
|
/// })
|
|
///
|
|
/// #thing[Hey] \
|
|
/// #thing[Welcome]
|
|
/// ```
|
|
///
|
|
/// The measure function returns a dictionary with the entries `width` and
|
|
/// `height`, both of type [`length`]($type/length).
|
|
///
|
|
/// Display: Measure
|
|
/// Category: layout
|
|
/// Returns: dictionary
|
|
#[func]
|
|
pub fn measure(
|
|
/// The content whose size to measure.
|
|
content: Content,
|
|
/// The styles with which to layout the content.
|
|
styles: Styles,
|
|
) -> Value {
|
|
let pod = Regions::one(Axes::splat(Abs::inf()), Axes::splat(false));
|
|
let styles = StyleChain::new(&styles);
|
|
let frame = content.measure(&mut vm.vt, styles, pod)?.into_frame();
|
|
let Size { x, y } = frame.size();
|
|
dict! { "width" => x, "height" => y }.into()
|
|
}
|