//! The standard library. //! //! Call [`new`] to obtain a [`Scope`] containing all standard library //! definitions. pub mod align; pub mod columns; pub mod container; pub mod deco; pub mod flow; pub mod grid; pub mod heading; pub mod hidden; pub mod image; pub mod link; pub mod list; pub mod pad; pub mod page; pub mod par; pub mod place; pub mod shape; pub mod spacing; pub mod stack; pub mod table; pub mod text; pub mod transform; pub mod utility; pub use self::image::*; pub use align::*; pub use columns::*; pub use container::*; pub use deco::*; pub use flow::*; pub use grid::*; pub use heading::*; pub use hidden::*; pub use link::*; pub use list::*; pub use pad::*; pub use page::*; pub use par::*; pub use place::*; pub use shape::*; pub use spacing::*; pub use stack::*; pub use table::*; pub use text::*; pub use transform::*; pub use utility::*; macro_rules! prelude { ($($reexport:item)*) => { /// Helpful imports for creating library functionality. pub mod prelude { $(#[doc(no_inline)] $reexport)* } }; } prelude! { pub use std::fmt::{self, Debug, Formatter}; pub use std::num::NonZeroUsize; pub use std::rc::Rc; pub use std::hash::Hash; pub use typst_macros::class; pub use crate::diag::{At, TypResult}; pub use crate::eval::{ Args, Construct, EvalContext, Node, Property, Scope, Set, Smart, StyleChain, StyleMap, Styled, Value, }; pub use crate::frame::*; pub use crate::geom::*; pub use crate::layout::{ Constrain, Constrained, Constraints, Layout, LayoutContext, PackedNode, Regions, }; pub use crate::syntax::{Span, Spanned}; pub use crate::util::{EcoString, OptionExt}; } use prelude::*; /// Construct a scope containing all standard library definitions. pub fn new() -> Scope { let mut std = Scope::new(); // Structure and semantics. std.def_class::("page"); std.def_class::("pagebreak"); std.def_class::("par"); std.def_class::("parbreak"); std.def_class::("linebreak"); std.def_class::("text"); std.def_class::("strong"); std.def_class::("emph"); std.def_class::>("underline"); std.def_class::>("strike"); std.def_class::>("overline"); std.def_class::("link"); std.def_class::("heading"); std.def_class::>("list"); std.def_class::>("enum"); std.def_class::("table"); std.def_class::("image"); std.def_class::>("rect"); std.def_class::>("square"); std.def_class::>("ellipse"); std.def_class::>("circle"); // Layout. std.def_class::("h"); std.def_class::("v"); std.def_class::("box"); std.def_class::("block"); std.def_class::("align"); std.def_class::("pad"); std.def_class::("place"); std.def_class::>("move"); std.def_class::>("scale"); std.def_class::>("rotate"); std.def_class::("hide"); std.def_class::("stack"); std.def_class::("grid"); std.def_class::("columns"); std.def_class::("colbreak"); // Utility functions. std.def_func("assert", assert); std.def_func("type", type_); std.def_func("repr", repr); std.def_func("join", join); std.def_func("int", int); std.def_func("float", float); std.def_func("str", str); std.def_func("abs", abs); std.def_func("min", min); std.def_func("max", max); std.def_func("even", even); std.def_func("odd", odd); std.def_func("range", range); std.def_func("rgb", rgb); std.def_func("lower", lower); std.def_func("upper", upper); std.def_func("len", len); std.def_func("sorted", sorted); // Predefined colors. // TODO: More colors. std.def_const("white", RgbaColor::WHITE); std.def_const("black", RgbaColor::BLACK); std.def_const("eastern", RgbaColor::new(0x23, 0x9D, 0xAD, 0xFF)); std.def_const("conifer", RgbaColor::new(0x9f, 0xEB, 0x52, 0xFF)); std.def_const("forest", RgbaColor::new(0x43, 0xA1, 0x27, 0xFF)); // Other constants. std.def_const("ltr", Dir::LTR); std.def_const("rtl", Dir::RTL); std.def_const("ttb", Dir::TTB); std.def_const("btt", Dir::BTT); std.def_const("left", Align::Left); std.def_const("center", Align::Center); std.def_const("right", Align::Right); std.def_const("top", Align::Top); std.def_const("horizon", Align::Horizon); std.def_const("bottom", Align::Bottom); std.def_const("serif", FontFamily::Serif); std.def_const("sans-serif", FontFamily::SansSerif); std.def_const("monospace", FontFamily::Monospace); std } dynamic! { Dir: "direction", } castable! { usize, Expected: "non-negative integer", Value::Int(int) => int.try_into().map_err(|_| "must be at least zero")?, } castable! { NonZeroUsize, Expected: "positive integer", Value::Int(int) => int .try_into() .and_then(usize::try_into) .map_err(|_| "must be positive")?, } castable! { Paint, Expected: "color", Value::Color(color) => Paint::Solid(color), } castable! { String, Expected: "string", Value::Str(string) => string.into(), } castable! { PackedNode, Expected: "node", Value::Node(node) => node.into_block(), }