More sensible LayoutRoot

This commit is contained in:
Laurenz 2022-11-22 20:52:58 +01:00
parent ea2a1525f0
commit c2749f7615
5 changed files with 28 additions and 15 deletions

View File

@ -49,20 +49,25 @@ use crate::text::{
#[capability] #[capability]
pub trait LayoutRoot { pub trait LayoutRoot {
/// Layout into one frame per page. /// Layout into one frame per page.
fn layout_root(&self, world: Tracked<dyn World>) -> SourceResult<Vec<Frame>>; fn layout_root(
&self,
world: Tracked<dyn World>,
styles: StyleChain,
) -> SourceResult<Vec<Frame>>;
} }
impl LayoutRoot for Content { impl LayoutRoot for Content {
#[comemo::memoize] #[comemo::memoize]
fn layout_root(&self, world: Tracked<dyn World>) -> SourceResult<Vec<Frame>> { fn layout_root(
let styles = StyleChain::with_root(&world.config().styles); &self,
world: Tracked<dyn World>,
styles: StyleChain,
) -> SourceResult<Vec<Frame>> {
let scratch = Scratch::default(); let scratch = Scratch::default();
let mut builder = Builder::new(world, &scratch, true); let mut builder = Builder::new(world, &scratch, true);
builder.accept(self, styles)?; builder.accept(self, styles)?;
let (doc, shared) = builder.into_doc(styles)?; let (doc, shared) = builder.into_doc(styles)?;
doc.layout(world, shared) doc.layout_root(world, shared)
} }
} }

View File

@ -154,7 +154,7 @@ pub fn styles() -> StyleMap {
/// Construct the standard lang item mapping. /// Construct the standard lang item mapping.
pub fn items() -> LangItems { pub fn items() -> LangItems {
LangItems { LangItems {
root: |world, content| content.layout_root(world), root: |content, world, styles| content.layout_root(world, styles),
em: |styles| styles.get(text::TextNode::SIZE), em: |styles| styles.get(text::TextNode::SIZE),
dir: |styles| styles.get(text::TextNode::DIR), dir: |styles| styles.get(text::TextNode::DIR),
space: || text::SpaceNode.pack(), space: || text::SpaceNode.pack(),

View File

@ -1,13 +1,16 @@
use crate::layout::PageNode; use crate::layout::{LayoutRoot, PageNode};
use crate::prelude::*; use crate::prelude::*;
/// A sequence of page runs. /// A sequence of page runs.
#[derive(Hash)] #[derive(Hash)]
pub struct DocNode(pub StyleVec<PageNode>); pub struct DocNode(pub StyleVec<PageNode>);
impl DocNode { #[node(LayoutRoot)]
impl DocNode {}
impl LayoutRoot for DocNode {
/// Layout the document into a sequence of frames, one per page. /// Layout the document into a sequence of frames, one per page.
pub fn layout( fn layout_root(
&self, &self,
world: Tracked<dyn World>, world: Tracked<dyn World>,
styles: StyleChain, styles: StyleChain,

View File

@ -49,7 +49,7 @@ use comemo::{Prehashed, Track};
use crate::diag::{FileResult, SourceResult}; use crate::diag::{FileResult, SourceResult};
use crate::font::{Font, FontBook}; use crate::font::{Font, FontBook};
use crate::frame::Frame; use crate::frame::Frame;
use crate::model::{LangItems, Route, Scope, StyleMap}; use crate::model::{LangItems, Route, Scope, StyleChain, StyleMap};
use crate::syntax::{Source, SourceId}; use crate::syntax::{Source, SourceId};
use crate::util::Buffer; use crate::util::Buffer;
@ -62,10 +62,12 @@ pub fn typeset(
world: &(dyn World + 'static), world: &(dyn World + 'static),
main: SourceId, main: SourceId,
) -> SourceResult<Vec<Frame>> { ) -> SourceResult<Vec<Frame>> {
crate::model::set_lang_items(world.config().items); let config = world.config();
crate::model::set_lang_items(config.items);
let route = Route::default(); let route = Route::default();
let module = model::eval(world.track(), route.track(), main)?; let module = model::eval(world.track(), route.track(), main)?;
item!(root)(world.track(), &module.content) let styles = StyleChain::with_root(&config.styles);
item!(root)(&module.content, world.track(), styles)
} }
/// The environment in which typesetting occurs. /// The environment in which typesetting occurs.

View File

@ -42,8 +42,11 @@ macro_rules! item {
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct LangItems { pub struct LangItems {
/// The root layout function. /// The root layout function.
pub root: pub root: fn(
fn(world: Tracked<dyn World>, document: &Content) -> SourceResult<Vec<Frame>>, content: &Content,
world: Tracked<dyn World>,
styles: StyleChain,
) -> SourceResult<Vec<Frame>>,
/// Access the em size. /// Access the em size.
pub em: fn(StyleChain) -> Abs, pub em: fn(StyleChain) -> Abs,
/// Access the text direction. /// Access the text direction.