diff --git a/crates/typst-library/src/introspection/locator.rs b/crates/typst-library/src/introspection/locator.rs index 3ba3d6486..b4fbec18e 100644 --- a/crates/typst-library/src/introspection/locator.rs +++ b/crates/typst-library/src/introspection/locator.rs @@ -236,6 +236,7 @@ enum Resolved { } /// A type that generates unique sublocators. +#[derive(Clone)] pub struct SplitLocator<'a> { /// A local hash that incorporates all layers since the last memoization /// boundary. diff --git a/crates/typst-realize/src/lib.rs b/crates/typst-realize/src/lib.rs index b7a21e789..11a1affdb 100644 --- a/crates/typst-realize/src/lib.rs +++ b/crates/typst-realize/src/lib.rs @@ -24,8 +24,8 @@ use typst_library::layout::{ }; use typst_library::math::{EquationElem, Mathy}; use typst_library::model::{ - CiteElem, CiteGroup, DocumentElem, EnumElem, ListElem, ListItemLike, ListLike, - ParElem, ParbreakElem, TermsElem, + CiteElem, CiteGroup, DocumentElem, DocumentInfo, EnumElem, ListElem, ListItemLike, + ListLike, ParElem, ParbreakElem, TermsElem, }; use typst_library::routines::{Arenas, FragmentKind, Pair, RealizationKind}; use typst_library::text::{LinebreakElem, SmartQuoteElem, SpaceElem, TextElem}; @@ -41,6 +41,42 @@ pub fn realize<'a>( arenas: &'a Arenas, content: &'a Content, styles: StyleChain<'a>, +) -> SourceResult>> { + let mut doc_info = DocumentInfo::default(); + let mut frag_kind = FragmentKind::Block; + let _ = std::hint::black_box(realize_inner( + match kind { + RealizationKind::LayoutDocument { .. } => { + RealizationKind::LayoutDocument { info: &mut doc_info } + } + RealizationKind::LayoutFragment { .. } => { + RealizationKind::LayoutFragment { kind: &mut frag_kind } + } + RealizationKind::LayoutPar => RealizationKind::LayoutPar, + RealizationKind::HtmlDocument { is_inline, .. } => { + RealizationKind::HtmlDocument { info: &mut doc_info, is_inline } + } + RealizationKind::HtmlFragment { is_inline, .. } => { + RealizationKind::HtmlFragment { kind: &mut frag_kind, is_inline } + } + RealizationKind::Math => RealizationKind::Math, + }, + engine, + &mut locator.clone(), + arenas, + content, + styles, + )); + realize_inner(kind, engine, locator, arenas, content, styles) +} + +fn realize_inner<'a>( + kind: RealizationKind, + engine: &mut Engine, + locator: &mut SplitLocator, + arenas: &'a Arenas, + content: &'a Content, + styles: StyleChain<'a>, ) -> SourceResult>> { let mut s = State { engine,