summaryrefslogtreecommitdiff
path: root/crates/typst-library/src/routines.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2024-10-27 19:04:55 +0100
committerGitHub <noreply@github.com>2024-10-27 18:04:55 +0000
commitbe7cfc85d08c545abfac08098b7b33b4bd71f37e (patch)
treef4137fa2aaa57babae1f7603a9b2ed7e688f43d8 /crates/typst-library/src/routines.rs
parentb8034a343831e8609aec2ec81eb7eeda57aa5d81 (diff)
Split out four new crates (#5302)
Diffstat (limited to 'crates/typst-library/src/routines.rs')
-rw-r--r--crates/typst-library/src/routines.rs368
1 files changed, 368 insertions, 0 deletions
diff --git a/crates/typst-library/src/routines.rs b/crates/typst-library/src/routines.rs
new file mode 100644
index 00000000..6b78b7fb
--- /dev/null
+++ b/crates/typst-library/src/routines.rs
@@ -0,0 +1,368 @@
+#![allow(unused)]
+
+use std::hash::{Hash, Hasher};
+use std::num::NonZeroUsize;
+
+use comemo::{Tracked, TrackedMut};
+use typst_syntax::Span;
+use typst_utils::LazyHash;
+
+use crate::diag::SourceResult;
+use crate::engine::{Engine, Route, Sink, Traced};
+use crate::foundations::{
+ Args, Cast, Closure, Content, Context, Func, Packed, Scope, StyleChain, StyleVec,
+ Styles, Value,
+};
+use crate::introspection::{Introspector, Locator, SplitLocator};
+use crate::layout::{
+ Abs, BoxElem, ColumnsElem, Fragment, Frame, GridElem, InlineItem, MoveElem, PadElem,
+ Region, Regions, Rel, RepeatElem, RotateElem, ScaleElem, Size, SkewElem, StackElem,
+};
+use crate::math::EquationElem;
+use crate::model::{Document, DocumentInfo, EnumElem, ListElem, TableElem};
+use crate::visualize::{
+ CircleElem, EllipseElem, ImageElem, LineElem, PathElem, PolygonElem, RectElem,
+ SquareElem,
+};
+use crate::World;
+
+/// Defines the `Routines` struct.
+macro_rules! routines {
+ ($(
+ $(#[$attr:meta])*
+ fn $name:ident $(<$($time:lifetime),*>)? ($($args:tt)*) -> $ret:ty
+ )*) => {
+ /// Defines implementation of various Typst compiler routines as a table
+ /// of function pointers.
+ ///
+ /// This is essentially dynamic linking and done to allow for crate
+ /// splitting.
+ pub struct Routines {
+ $(
+ $(#[$attr])*
+ pub $name: $(for<$($time),*>)? fn ($($args)*) -> $ret
+ ),*
+ }
+
+ impl Hash for Routines {
+ fn hash<H: Hasher>(&self, _: &mut H) {}
+ }
+ };
+}
+
+routines! {
+ /// Evaluates a string as code and return the resulting value.
+ fn eval_string(
+ routines: &Routines,
+ world: Tracked<dyn World + '_>,
+ string: &str,
+ span: Span,
+ mode: EvalMode,
+ scope: Scope,
+ ) -> SourceResult<Value>
+
+ /// Call the closure in the context with the arguments.
+ fn eval_closure(
+ func: &Func,
+ closure: &LazyHash<Closure>,
+ routines: &Routines,
+ world: Tracked<dyn World + '_>,
+ introspector: Tracked<Introspector>,
+ traced: Tracked<Traced>,
+ sink: TrackedMut<Sink>,
+ route: Tracked<Route>,
+ context: Tracked<Context>,
+ args: Args,
+ ) -> SourceResult<Value>
+
+ /// Realizes content into a flat list of well-known, styled items.
+ fn realize<'a>(
+ kind: RealizationKind,
+ engine: &mut Engine,
+ locator: &mut SplitLocator,
+ arenas: &'a Arenas,
+ content: &'a Content,
+ styles: StyleChain<'a>,
+ ) -> SourceResult<Vec<Pair<'a>>>
+
+ /// Layout content into a document.
+ fn layout_document(
+ engine: &mut Engine,
+ content: &Content,
+ styles: StyleChain,
+ ) -> SourceResult<Document>
+
+ /// Lays out content into multiple regions.
+ fn layout_fragment(
+ engine: &mut Engine,
+ content: &Content,
+ locator: Locator,
+ styles: StyleChain,
+ regions: Regions,
+ ) -> SourceResult<Fragment>
+
+ /// Lays out content into a single region, producing a single frame.
+ fn layout_frame(
+ engine: &mut Engine,
+ content: &Content,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out inline content.
+ fn layout_inline(
+ engine: &mut Engine,
+ children: &StyleVec,
+ locator: Locator,
+ styles: StyleChain,
+ consecutive: bool,
+ region: Size,
+ expand: bool,
+ ) -> SourceResult<Fragment>
+
+ /// Lays out a [`BoxElem`].
+ fn layout_box(
+ elem: &Packed<BoxElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Size,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`ListElem`].
+ fn layout_list(
+ elem: &Packed<ListElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ regions: Regions,
+ ) -> SourceResult<Fragment>
+
+ /// Lays out an [`EnumElem`].
+ fn layout_enum(
+ elem: &Packed<EnumElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ regions: Regions,
+ ) -> SourceResult<Fragment>
+
+ /// Lays out a [`GridElem`].
+ fn layout_grid(
+ elem: &Packed<GridElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ regions: Regions,
+ ) -> SourceResult<Fragment>
+
+ /// Lays out a [`TableElem`].
+ fn layout_table(
+ elem: &Packed<TableElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ regions: Regions,
+ ) -> SourceResult<Fragment>
+
+ /// Lays out a [`StackElem`].
+ fn layout_stack(
+ elem: &Packed<StackElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ regions: Regions,
+ ) -> SourceResult<Fragment>
+
+ /// Lays out a [`ColumnsElem`].
+ fn layout_columns(
+ elem: &Packed<ColumnsElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ regions: Regions,
+ ) -> SourceResult<Fragment>
+
+ /// Lays out a [`MoveElem`].
+ fn layout_move(
+ elem: &Packed<MoveElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`RotateElem`].
+ fn layout_rotate(
+ elem: &Packed<RotateElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`ScaleElem`].
+ fn layout_scale(
+ elem: &Packed<ScaleElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`SkewElem`].
+ fn layout_skew(
+ elem: &Packed<SkewElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`RepeatElem`].
+ fn layout_repeat(
+ elem: &Packed<RepeatElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`PadElem`].
+ fn layout_pad(
+ elem: &Packed<PadElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ regions: Regions,
+ ) -> SourceResult<Fragment>
+
+ /// Lays out a [`LineElem`].
+ fn layout_line(
+ elem: &Packed<LineElem>,
+ _: &mut Engine,
+ _: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`PathElem`].
+ fn layout_path(
+ elem: &Packed<PathElem>,
+ _: &mut Engine,
+ _: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`PolygonElem`].
+ fn layout_polygon(
+ elem: &Packed<PolygonElem>,
+ _: &mut Engine,
+ _: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`RectElem`].
+ fn layout_rect(
+ elem: &Packed<RectElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`SquareElem`].
+ fn layout_square(
+ elem: &Packed<SquareElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`EllipseElem`].
+ fn layout_ellipse(
+ elem: &Packed<EllipseElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out a [`CircleElem`].
+ fn layout_circle(
+ elem: &Packed<CircleElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out an [`ImageElem`].
+ fn layout_image(
+ elem: &Packed<ImageElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Region,
+ ) -> SourceResult<Frame>
+
+ /// Lays out an [`EquationElem`] in a paragraph.
+ fn layout_equation_inline(
+ elem: &Packed<EquationElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ region: Size,
+ ) -> SourceResult<Vec<InlineItem>>
+
+ /// Lays out an [`EquationElem`] in a flow.
+ fn layout_equation_block(
+ elem: &Packed<EquationElem>,
+ engine: &mut Engine,
+ locator: Locator,
+ styles: StyleChain,
+ regions: Regions,
+ ) -> SourceResult<Fragment>
+}
+
+/// In which mode to evaluate a string.
+#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Cast)]
+pub enum EvalMode {
+ /// Evaluate as code, as after a hash.
+ Code,
+ /// Evaluate as markup, like in a Typst file.
+ Markup,
+ /// Evaluate as math, as in an equation.
+ Math,
+}
+
+/// Defines what kind of realization we are performing.
+pub enum RealizationKind<'a> {
+ /// This the root realization for the document. Requires a mutable reference
+ /// to document metadata that will be filled from `set document` rules.
+ Root(&'a mut DocumentInfo),
+ /// A nested realization in a container (e.g. a `block`).
+ Container,
+ /// A realization within math.
+ Math,
+}
+
+/// Temporary storage arenas for lifetime extension during realization.
+///
+/// Must be kept live while the content returned from realization is processed.
+#[derive(Default)]
+pub struct Arenas {
+ /// A typed arena for owned content.
+ pub content: typed_arena::Arena<Content>,
+ /// A typed arena for owned styles.
+ pub styles: typed_arena::Arena<Styles>,
+ /// An untyped arena for everything that is `Copy`.
+ pub bump: bumpalo::Bump,
+}
+
+/// A pair of content and a style chain that applies to it.
+pub type Pair<'a> = (&'a Content, StyleChain<'a>);