Realize twice

This commit is contained in:
Laurenz 2025-07-18 17:35:56 +02:00
parent 34f17f695b
commit a606f4d796
2 changed files with 39 additions and 2 deletions

View File

@ -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.

View File

@ -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<Vec<Pair<'a>>> {
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<Vec<Pair<'a>>> {
let mut s = State {
engine,