1#![allow(unused)]
2
3use std::hash::{Hash, Hasher};
4use std::num::NonZeroUsize;
5
6use comemo::{Tracked, TrackedMut};
7use typst_syntax::Span;
8use typst_utils::LazyHash;
9
10use crate::diag::SourceResult;
11use crate::engine::{Engine, Route, Sink, Traced};
12use crate::foundations::{
13 Args, Cast, Closure, Content, Context, Func, Packed, Scope, StyleChain, Styles, Value,
14};
15use crate::introspection::{Introspector, Locator, SplitLocator};
16use crate::layout::{
17 Abs, BoxElem, ColumnsElem, Fragment, Frame, GridElem, InlineItem, MoveElem, PadElem,
18 PagedDocument, Region, Regions, Rel, RepeatElem, RotateElem, ScaleElem, Size,
19 SkewElem, StackElem,
20};
21use crate::math::EquationElem;
22use crate::model::{DocumentInfo, EnumElem, ListElem, TableElem};
23use crate::visualize::{
24 CircleElem, CurveElem, EllipseElem, ImageElem, LineElem, PathElem, PolygonElem,
25 RectElem, SquareElem,
26};
27use crate::World;
28
29macro_rules! routines {
31 ($(
32 $(#[$attr:meta])*
33 fn $name:ident $(<$($time:lifetime),*>)? ($($args:tt)*) -> $ret:ty
34 )*) => {
35 pub struct Routines {
41 $(
42 $(#[$attr])*
43 pub $name: $(for<$($time),*>)? fn ($($args)*) -> $ret
44 ),*
45 }
46
47 impl Hash for Routines {
48 fn hash<H: Hasher>(&self, _: &mut H) {}
49 }
50 };
51}
52
53routines! {
54 fn eval_string(
56 routines: &Routines,
57 world: Tracked<dyn World + '_>,
58 string: &str,
59 span: Span,
60 mode: EvalMode,
61 scope: Scope,
62 ) -> SourceResult<Value>
63
64 fn eval_closure(
66 func: &Func,
67 closure: &LazyHash<Closure>,
68 routines: &Routines,
69 world: Tracked<dyn World + '_>,
70 introspector: Tracked<Introspector>,
71 traced: Tracked<Traced>,
72 sink: TrackedMut<Sink>,
73 route: Tracked<Route>,
74 context: Tracked<Context>,
75 args: Args,
76 ) -> SourceResult<Value>
77
78 fn realize<'a>(
80 kind: RealizationKind,
81 engine: &mut Engine,
82 locator: &mut SplitLocator,
83 arenas: &'a Arenas,
84 content: &'a Content,
85 styles: StyleChain<'a>,
86 ) -> SourceResult<Vec<Pair<'a>>>
87
88 fn layout_fragment(
90 engine: &mut Engine,
91 content: &Content,
92 locator: Locator,
93 styles: StyleChain,
94 regions: Regions,
95 ) -> SourceResult<Fragment>
96
97 fn layout_frame(
99 engine: &mut Engine,
100 content: &Content,
101 locator: Locator,
102 styles: StyleChain,
103 region: Region,
104 ) -> SourceResult<Frame>
105
106 fn layout_list(
108 elem: &Packed<ListElem>,
109 engine: &mut Engine,
110 locator: Locator,
111 styles: StyleChain,
112 regions: Regions,
113 ) -> SourceResult<Fragment>
114
115 fn layout_enum(
117 elem: &Packed<EnumElem>,
118 engine: &mut Engine,
119 locator: Locator,
120 styles: StyleChain,
121 regions: Regions,
122 ) -> SourceResult<Fragment>
123
124 fn layout_grid(
126 elem: &Packed<GridElem>,
127 engine: &mut Engine,
128 locator: Locator,
129 styles: StyleChain,
130 regions: Regions,
131 ) -> SourceResult<Fragment>
132
133 fn layout_table(
135 elem: &Packed<TableElem>,
136 engine: &mut Engine,
137 locator: Locator,
138 styles: StyleChain,
139 regions: Regions,
140 ) -> SourceResult<Fragment>
141
142 fn layout_stack(
144 elem: &Packed<StackElem>,
145 engine: &mut Engine,
146 locator: Locator,
147 styles: StyleChain,
148 regions: Regions,
149 ) -> SourceResult<Fragment>
150
151 fn layout_columns(
153 elem: &Packed<ColumnsElem>,
154 engine: &mut Engine,
155 locator: Locator,
156 styles: StyleChain,
157 regions: Regions,
158 ) -> SourceResult<Fragment>
159
160 fn layout_move(
162 elem: &Packed<MoveElem>,
163 engine: &mut Engine,
164 locator: Locator,
165 styles: StyleChain,
166 region: Region,
167 ) -> SourceResult<Frame>
168
169 fn layout_rotate(
171 elem: &Packed<RotateElem>,
172 engine: &mut Engine,
173 locator: Locator,
174 styles: StyleChain,
175 region: Region,
176 ) -> SourceResult<Frame>
177
178 fn layout_scale(
180 elem: &Packed<ScaleElem>,
181 engine: &mut Engine,
182 locator: Locator,
183 styles: StyleChain,
184 region: Region,
185 ) -> SourceResult<Frame>
186
187 fn layout_skew(
189 elem: &Packed<SkewElem>,
190 engine: &mut Engine,
191 locator: Locator,
192 styles: StyleChain,
193 region: Region,
194 ) -> SourceResult<Frame>
195
196 fn layout_repeat(
198 elem: &Packed<RepeatElem>,
199 engine: &mut Engine,
200 locator: Locator,
201 styles: StyleChain,
202 region: Region,
203 ) -> SourceResult<Frame>
204
205 fn layout_pad(
207 elem: &Packed<PadElem>,
208 engine: &mut Engine,
209 locator: Locator,
210 styles: StyleChain,
211 regions: Regions,
212 ) -> SourceResult<Fragment>
213
214 fn layout_line(
216 elem: &Packed<LineElem>,
217 _: &mut Engine,
218 _: Locator,
219 styles: StyleChain,
220 region: Region,
221 ) -> SourceResult<Frame>
222
223 fn layout_curve(
225 elem: &Packed<CurveElem>,
226 _: &mut Engine,
227 _: Locator,
228 styles: StyleChain,
229 region: Region,
230 ) -> SourceResult<Frame>
231
232 fn layout_path(
234 elem: &Packed<PathElem>,
235 _: &mut Engine,
236 _: Locator,
237 styles: StyleChain,
238 region: Region,
239 ) -> SourceResult<Frame>
240
241 fn layout_polygon(
243 elem: &Packed<PolygonElem>,
244 _: &mut Engine,
245 _: Locator,
246 styles: StyleChain,
247 region: Region,
248 ) -> SourceResult<Frame>
249
250 fn layout_rect(
252 elem: &Packed<RectElem>,
253 engine: &mut Engine,
254 locator: Locator,
255 styles: StyleChain,
256 region: Region,
257 ) -> SourceResult<Frame>
258
259 fn layout_square(
261 elem: &Packed<SquareElem>,
262 engine: &mut Engine,
263 locator: Locator,
264 styles: StyleChain,
265 region: Region,
266 ) -> SourceResult<Frame>
267
268 fn layout_ellipse(
270 elem: &Packed<EllipseElem>,
271 engine: &mut Engine,
272 locator: Locator,
273 styles: StyleChain,
274 region: Region,
275 ) -> SourceResult<Frame>
276
277 fn layout_circle(
279 elem: &Packed<CircleElem>,
280 engine: &mut Engine,
281 locator: Locator,
282 styles: StyleChain,
283 region: Region,
284 ) -> SourceResult<Frame>
285
286 fn layout_image(
288 elem: &Packed<ImageElem>,
289 engine: &mut Engine,
290 locator: Locator,
291 styles: StyleChain,
292 region: Region,
293 ) -> SourceResult<Frame>
294
295 fn layout_equation_inline(
297 elem: &Packed<EquationElem>,
298 engine: &mut Engine,
299 locator: Locator,
300 styles: StyleChain,
301 region: Size,
302 ) -> SourceResult<Vec<InlineItem>>
303
304 fn layout_equation_block(
306 elem: &Packed<EquationElem>,
307 engine: &mut Engine,
308 locator: Locator,
309 styles: StyleChain,
310 regions: Regions,
311 ) -> SourceResult<Fragment>
312}
313
314#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Cast)]
316pub enum EvalMode {
317 Code,
319 Markup,
321 Math,
323}
324
325pub enum RealizationKind<'a> {
327 LayoutDocument(&'a mut DocumentInfo),
330 LayoutFragment(&'a mut FragmentKind),
334 LayoutPar,
336 HtmlDocument(&'a mut DocumentInfo),
339 HtmlFragment(&'a mut FragmentKind),
343 Math,
345}
346
347impl RealizationKind<'_> {
348 pub fn is_html(&self) -> bool {
350 matches!(self, Self::HtmlDocument(_) | Self::HtmlFragment(_))
351 }
352
353 pub fn is_fragment(&self) -> bool {
355 matches!(self, Self::LayoutFragment(_) | Self::HtmlFragment(_))
356 }
357
358 pub fn as_document_mut(&mut self) -> Option<&mut DocumentInfo> {
360 match self {
361 Self::LayoutDocument(info) | Self::HtmlDocument(info) => Some(*info),
362 _ => None,
363 }
364 }
365
366 pub fn as_fragment_mut(&mut self) -> Option<&mut FragmentKind> {
368 match self {
369 Self::LayoutFragment(kind) | Self::HtmlFragment(kind) => Some(*kind),
370 _ => None,
371 }
372 }
373}
374
375#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
377pub enum FragmentKind {
378 Inline,
381 Block,
384}
385
386#[derive(Default)]
390pub struct Arenas {
391 pub content: typed_arena::Arena<Content>,
393 pub styles: typed_arena::Arena<Styles>,
395 pub bump: bumpalo::Bump,
397}
398
399pub type Pair<'a> = (&'a Content, StyleChain<'a>);