From bf59c08a0a601eeac4354c505cab15e65601c8e8 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sat, 12 Nov 2022 23:25:54 +0100 Subject: [PATCH] New interaction model --- library/src/core/behave.rs | 128 +++++++++++++++++ library/src/{ => core}/ext.rs | 27 ++-- library/src/core/mod.rs | 7 + library/src/layout/columns.rs | 12 +- library/src/layout/container.rs | 16 ++- library/src/layout/flow.rs | 95 +++---------- library/src/layout/mod.rs | 228 +++++-------------------------- library/src/layout/place.rs | 8 +- library/src/layout/spacing.rs | 105 +++++++++++--- library/src/lib.rs | 3 +- library/src/prelude.rs | 20 ++- library/src/structure/heading.rs | 13 +- library/src/text/mod.rs | 16 ++- library/src/text/par.rs | 126 +++++++---------- tests/ref/text/indent.png | Bin 46495 -> 46139 bytes 15 files changed, 409 insertions(+), 395 deletions(-) create mode 100644 library/src/core/behave.rs rename library/src/{ => core}/ext.rs (81%) create mode 100644 library/src/core/mod.rs diff --git a/library/src/core/behave.rs b/library/src/core/behave.rs new file mode 100644 index 000000000..29d5dc490 --- /dev/null +++ b/library/src/core/behave.rs @@ -0,0 +1,128 @@ +//! Node interaction. + +use typst::model::{capability, Content, StyleChain, StyleVec, StyleVecBuilder}; + +/// How a node interacts with other nodes. +#[capability] +pub trait Behave: 'static + Send + Sync { + /// The node's interaction behaviour. + fn behaviour(&self) -> Behaviour; + + /// Whether this weak node is larger than a previous one and thus picked as + /// the maximum when the levels are the same. + #[allow(unused_variables)] + fn larger(&self, prev: &Content) -> bool { + false + } +} + +/// How a node interacts with other nodes in a stream. +#[derive(Debug, Copy, Clone, Eq, PartialEq)] +pub enum Behaviour { + /// A weak node which only survives when a supportive node is before and + /// after it. Furthermore, per consecutive run of weak nodes, only one + /// survives: The one with the lowest weakness level (or the larger one if + /// there is a tie). + Weak(u8), + /// A node that enables adjacent weak nodes to exist. The default. + Supportive, + /// A node that destroys adjacent weak nodes. + Destructive, + /// A node that does not interact at all with other node, having the + /// same effect as if it didn't exist. + Ignorant, +} + +/// A wrapper around a [`StyleVecBuilder`] that allows items to interact. +pub struct BehavedBuilder<'a> { + /// The internal builder. + builder: StyleVecBuilder<'a, Content>, + /// Staged weak and ignorant items that we can't yet commit to the builder. + /// The option is `Some(_)` for weak items and `None` for ignorant items. + staged: Vec<(Content, Behaviour, StyleChain<'a>)>, + /// What the last non-ignorant item was. + last: Behaviour, +} + +impl<'a> BehavedBuilder<'a> { + /// Create a new style-vec builder. + pub fn new() -> Self { + Self { + builder: StyleVecBuilder::new(), + staged: vec![], + last: Behaviour::Destructive, + } + } + + /// Whether the builder is empty. + pub fn is_empty(&self) -> bool { + self.builder.is_empty() && self.staged.is_empty() + } + + /// Push an item into the sequence. + pub fn push(&mut self, item: Content, styles: StyleChain<'a>) { + let interaction = item + .to::() + .map_or(Behaviour::Supportive, Behave::behaviour); + + match interaction { + Behaviour::Weak(level) => { + if matches!(self.last, Behaviour::Weak(_)) { + let item = item.to::().unwrap(); + let i = self.staged.iter().position(|prev| { + let Behaviour::Weak(prev_level) = prev.1 else { return false }; + level < prev_level + || (level == prev_level && item.larger(&prev.0)) + }); + let Some(i) = i else { return }; + self.staged.remove(i); + } + + if self.last != Behaviour::Destructive { + self.staged.push((item, interaction, styles)); + self.last = interaction; + } + } + Behaviour::Supportive => { + self.flush(true); + self.builder.push(item, styles); + self.last = interaction; + } + Behaviour::Destructive => { + self.flush(false); + self.builder.push(item, styles); + self.last = interaction; + } + Behaviour::Ignorant => { + self.staged.push((item, interaction, styles)); + } + } + } + + /// Iterate over the contained items. + pub fn items(&self) -> impl DoubleEndedIterator { + self.builder.items().chain(self.staged.iter().map(|(item, ..)| item)) + } + + /// Return the finish style vec and the common prefix chain. + pub fn finish(mut self) -> (StyleVec, StyleChain<'a>) { + self.flush(false); + self.builder.finish() + } + + /// Push the staged items, filtering out weak items if `supportive` is + /// false. + fn flush(&mut self, supportive: bool) { + for (item, interaction, styles) in self.staged.drain(..) { + if supportive || interaction == Behaviour::Ignorant { + self.builder.push(item, styles); + } + } + } +} + +impl<'a> Default for BehavedBuilder<'a> { + fn default() -> Self { + Self::new() + } +} diff --git a/library/src/ext.rs b/library/src/core/ext.rs similarity index 81% rename from library/src/ext.rs rename to library/src/core/ext.rs index 0735dc181..44479e9d4 100644 --- a/library/src/ext.rs +++ b/library/src/core/ext.rs @@ -1,4 +1,5 @@ -use super::*; +//! Extension traits. + use crate::prelude::*; /// Additional methods on content. @@ -33,31 +34,31 @@ pub trait ContentExt { impl ContentExt for Content { fn strong(self) -> Self { - text::StrongNode(self).pack() + crate::text::StrongNode(self).pack() } fn emph(self) -> Self { - text::EmphNode(self).pack() + crate::text::EmphNode(self).pack() } fn underlined(self) -> Self { - text::DecoNode::<{ text::UNDERLINE }>(self).pack() + crate::text::DecoNode::<{ crate::text::UNDERLINE }>(self).pack() } fn boxed(self, sizing: Axes>>) -> Self { - layout::BoxNode { sizing, child: self }.pack() + crate::layout::BoxNode { sizing, child: self }.pack() } fn aligned(self, aligns: Axes>) -> Self { - layout::AlignNode { aligns, child: self }.pack() + crate::layout::AlignNode { aligns, child: self }.pack() } fn padded(self, padding: Sides>) -> Self { - layout::PadNode { padding, child: self }.pack() + crate::layout::PadNode { padding, child: self }.pack() } fn moved(self, delta: Axes>) -> Self { - layout::MoveNode { delta, child: self }.pack() + crate::layout::MoveNode { delta, child: self }.pack() } fn filled(self, fill: Paint) -> Self { @@ -73,16 +74,16 @@ impl ContentExt for Content { pub trait StyleMapExt { /// Set a font family composed of a preferred family and existing families /// from a style chain. - fn set_family(&mut self, preferred: text::FontFamily, existing: StyleChain); + fn set_family(&mut self, preferred: crate::text::FontFamily, existing: StyleChain); } impl StyleMapExt for StyleMap { - fn set_family(&mut self, preferred: text::FontFamily, existing: StyleChain) { + fn set_family(&mut self, preferred: crate::text::FontFamily, existing: StyleChain) { self.set( - text::TextNode::FAMILY, - text::FallbackList( + crate::text::TextNode::FAMILY, + crate::text::FallbackList( std::iter::once(preferred) - .chain(existing.get(text::TextNode::FAMILY).0.iter().cloned()) + .chain(existing.get(crate::text::TextNode::FAMILY).0.iter().cloned()) .collect(), ), ); diff --git a/library/src/core/mod.rs b/library/src/core/mod.rs new file mode 100644 index 000000000..6cafa9fc8 --- /dev/null +++ b/library/src/core/mod.rs @@ -0,0 +1,7 @@ +//! Central definitions for the standard library. + +mod behave; +mod ext; + +pub use behave::*; +pub use ext::*; diff --git a/library/src/layout/columns.rs b/library/src/layout/columns.rs index 2faa6329b..ec9510d8d 100644 --- a/library/src/layout/columns.rs +++ b/library/src/layout/columns.rs @@ -104,10 +104,20 @@ pub struct ColbreakNode { pub weak: bool, } -#[node] +#[node(Behave)] impl ColbreakNode { fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { let weak = args.named("weak")?.unwrap_or(false); Ok(Self { weak }.pack()) } } + +impl Behave for ColbreakNode { + fn behaviour(&self) -> Behaviour { + if self.weak { + Behaviour::Weak(1) + } else { + Behaviour::Destructive + } + } +} diff --git a/library/src/layout/container.rs b/library/src/layout/container.rs index 22a9e02eb..20d80cbac 100644 --- a/library/src/layout/container.rs +++ b/library/src/layout/container.rs @@ -66,19 +66,25 @@ pub struct BlockNode(pub Content); impl BlockNode { /// The spacing between the previous and this block. #[property(skip)] - pub const ABOVE: VNode = VNode::weak(Em::new(1.2).into()); + pub const ABOVE: VNode = VNode::block_spacing(Em::new(1.2).into()); /// The spacing between this and the following block. #[property(skip)] - pub const BELOW: VNode = VNode::weak(Em::new(1.2).into()); + pub const BELOW: VNode = VNode::block_spacing(Em::new(1.2).into()); fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { Ok(Self(args.eat()?.unwrap_or_default()).pack()) } fn set(...) { - let spacing = args.named("spacing")?.map(VNode::weak); - styles.set_opt(Self::ABOVE, args.named("above")?.map(VNode::strong).or(spacing)); - styles.set_opt(Self::BELOW, args.named("below")?.map(VNode::strong).or(spacing)); + let spacing = args.named("spacing")?.map(VNode::block_spacing); + styles.set_opt( + Self::ABOVE, + args.named("above")?.map(VNode::block_around).or(spacing), + ); + styles.set_opt( + Self::BELOW, + args.named("below")?.map(VNode::block_around).or(spacing), + ); } } diff --git a/library/src/layout/flow.rs b/library/src/layout/flow.rs index 822d2c388..b05146c94 100644 --- a/library/src/layout/flow.rs +++ b/library/src/layout/flow.rs @@ -1,7 +1,4 @@ -use std::cmp::Ordering; - -use super::{AlignNode, PlaceNode, Spacing, VNode}; -use crate::layout::BlockNode; +use super::{AlignNode, ColbreakNode, PlaceNode, Spacing, VNode}; use crate::prelude::*; use crate::text::ParNode; @@ -10,18 +7,7 @@ use crate::text::ParNode; /// This node is reponsible for layouting both the top-level content flow and /// the contents of boxes. #[derive(Hash)] -pub struct FlowNode(pub StyleVec); - -/// A child of a flow node. -#[derive(Hash, PartialEq)] -pub enum FlowChild { - /// Vertical spacing between other children. - Spacing(VNode), - /// Arbitrary block-level content. - Block(Content), - /// A column / region break. - Colbreak, -} +pub struct FlowNode(pub StyleVec); #[node(LayoutBlock)] impl FlowNode {} @@ -33,20 +19,18 @@ impl LayoutBlock for FlowNode { regions: &Regions, styles: StyleChain, ) -> SourceResult> { - let mut layouter = FlowLayouter::new(regions, styles); + let mut layouter = FlowLayouter::new(regions); for (child, map) in self.0.iter() { let styles = map.chain(&styles); - match child { - FlowChild::Spacing(node) => { - layouter.layout_spacing(node, styles); - } - FlowChild::Block(block) => { - layouter.layout_block(world, block, styles)?; - } - FlowChild::Colbreak => { - layouter.finish_region(); - } + if let Some(&node) = child.downcast::() { + layouter.layout_spacing(node.amount, styles); + } else if child.has::() { + layouter.layout_block(world, child, styles)?; + } else if child.is::() { + layouter.finish_region(); + } else { + panic!("unexpected flow child: {child:?}"); } } @@ -61,31 +45,10 @@ impl Debug for FlowNode { } } -impl Debug for FlowChild { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - match self { - Self::Spacing(kind) => write!(f, "{:?}", kind), - Self::Block(block) => block.fmt(f), - Self::Colbreak => f.pad("Colbreak"), - } - } -} - -impl PartialOrd for FlowChild { - fn partial_cmp(&self, other: &Self) -> Option { - match (self, other) { - (Self::Spacing(a), Self::Spacing(b)) => a.partial_cmp(b), - _ => None, - } - } -} - /// Performs flow layout. -struct FlowLayouter<'a> { +struct FlowLayouter { /// The regions to layout children into. regions: Regions, - /// The shared styles. - shared: StyleChain<'a>, /// Whether the flow should expand to fill the region. expand: Axes, /// The full size of `regions.size` that was available before we started @@ -95,8 +58,6 @@ struct FlowLayouter<'a> { used: Size, /// The sum of fractions in the current region. fr: Fr, - /// The spacing below the last block. - below: Option, /// Spacing and layouted blocks. items: Vec, /// Finished frames for previous regions. @@ -115,9 +76,9 @@ enum FlowItem { Placed(Frame), } -impl<'a> FlowLayouter<'a> { +impl FlowLayouter { /// Create a new flow layouter. - fn new(regions: &Regions, shared: StyleChain<'a>) -> Self { + fn new(regions: &Regions) -> Self { let expand = regions.expand; let full = regions.first; @@ -127,20 +88,18 @@ impl<'a> FlowLayouter<'a> { Self { regions, - shared, expand, full, used: Size::zero(), fr: Fr::zero(), - below: None, items: vec![], finished: vec![], } } - /// Layout spacing. - fn layout_spacing(&mut self, node: &VNode, styles: StyleChain) { - match node.amount { + /// Actually layout the spacing. + fn layout_spacing(&mut self, spacing: Spacing, styles: StyleChain) { + match spacing { Spacing::Relative(v) => { // Resolve the spacing and limit it to the remaining space. let resolved = v.resolve(styles).relative_to(self.full.y); @@ -154,10 +113,6 @@ impl<'a> FlowLayouter<'a> { self.fr += v; } } - - if node.weak || node.amount.is_fractional() { - self.below = None; - } } /// Layout a block. @@ -172,19 +127,9 @@ impl<'a> FlowLayouter<'a> { self.finish_region(); } - // Add spacing between the last block and this one. - if let Some(below) = self.below.take() { - let above = styles.get(BlockNode::ABOVE); - let pick_below = (above.weak && !below.weak) || (below.amount > above.amount); - let spacing = if pick_below { below } else { above }; - self.layout_spacing(&spacing, self.shared); - } - // Placed nodes that are out of flow produce placed items which aren't // aligned later. - let mut is_placed = false; if let Some(placed) = block.downcast::() { - is_placed = true; if placed.out_of_flow() { let frame = block.layout_block(world, &self.regions, styles)?.remove(0); self.items.push(FlowItem::Placed(frame)); @@ -205,6 +150,7 @@ impl<'a> FlowLayouter<'a> { .unwrap_or(Align::Top), ); + // Layout the block itself. let frames = block.layout_block(world, &self.regions, styles)?; let len = frames.len(); for (i, frame) in frames.into_iter().enumerate() { @@ -220,10 +166,6 @@ impl<'a> FlowLayouter<'a> { } } - if !is_placed { - self.below = Some(styles.get(BlockNode::BELOW)); - } - Ok(()) } @@ -272,7 +214,6 @@ impl<'a> FlowLayouter<'a> { self.full = self.regions.first; self.used = Size::zero(); self.fr = Fr::zero(); - self.below = None; self.finished.push(output); } diff --git a/library/src/layout/mod.rs b/library/src/layout/mod.rs index e0eb431c0..d6bc91751 100644 --- a/library/src/layout/mod.rs +++ b/library/src/layout/mod.rs @@ -32,16 +32,18 @@ use typst::diag::SourceResult; use typst::frame::Frame; use typst::geom::*; use typst::model::{ - capability, Content, Node, SequenceNode, Show, StyleChain, StyleEntry, StyleVec, + capability, Content, Node, SequenceNode, Show, StyleChain, StyleEntry, StyleVecBuilder, StyledNode, Target, }; use typst::World; +use crate::core::BehavedBuilder; +use crate::prelude::*; use crate::structure::{ DescNode, DocNode, EnumNode, ListItem, ListNode, DESC, ENUM, LIST, }; use crate::text::{ - LinebreakNode, ParChild, ParNode, ParbreakNode, SmartQuoteNode, SpaceNode, TextNode, + LinebreakNode, ParNode, ParbreakNode, SmartQuoteNode, SpaceNode, TextNode, }; /// Root-level layout. @@ -468,41 +470,17 @@ impl Default for DocBuilder<'_> { /// Accepts flow content. #[derive(Default)] -struct FlowBuilder<'a>(CollapsingBuilder<'a, FlowChild>, bool); +struct FlowBuilder<'a>(BehavedBuilder<'a>, bool); impl<'a> FlowBuilder<'a> { fn accept(&mut self, content: &Content, styles: StyleChain<'a>) -> bool { - // Weak flow elements: - // Weakness | Element - // 0 | weak colbreak - // 1 | weak fractional spacing - // 2 | weak spacing - // 3 | generated weak spacing - // 4 | generated weak fractional spacing - // 5 | par spacing - let last_was_parbreak = self.1; self.1 = false; if content.is::() { self.1 = true; - } else if let Some(colbreak) = content.downcast::() { - if colbreak.weak { - self.0.weak(FlowChild::Colbreak, styles, 0); - } else { - self.0.destructive(FlowChild::Colbreak, styles); - } - } else if let Some(vertical) = content.downcast::() { - let child = FlowChild::Spacing(*vertical); - let frac = vertical.amount.is_fractional(); - if vertical.weak { - let weakness = 1 + u8::from(frac); - self.0.weak(child, styles, weakness); - } else if frac { - self.0.destructive(child, styles); - } else { - self.0.ignorant(child, styles); - } + } else if content.is::() || content.is::() { + self.0.push(content.clone(), styles); } else if content.has::() { if !last_was_parbreak { let tight = if let Some(node) = content.downcast::() { @@ -517,17 +495,16 @@ impl<'a> FlowBuilder<'a> { if tight { let leading = styles.get(ParNode::LEADING); - let spacing = VNode::weak(leading.into()); - self.0.weak(FlowChild::Spacing(spacing), styles, 1); + let spacing = VNode::list_attach(leading.into()); + self.0.push(spacing.pack(), styles); } } - let child = FlowChild::Block(content.clone()); - if content.is::() { - self.0.ignorant(child, styles); - } else { - self.0.supportive(child, styles); - } + let above = styles.get(BlockNode::ABOVE); + let below = styles.get(BlockNode::BELOW); + self.0.push(above.pack(), styles); + self.0.push(content.clone(), styles); + self.0.push(below.pack(), styles); } else { return false; } @@ -549,43 +526,22 @@ impl<'a> FlowBuilder<'a> { /// Accepts paragraph content. #[derive(Default)] -struct ParBuilder<'a>(CollapsingBuilder<'a, ParChild>); +struct ParBuilder<'a>(BehavedBuilder<'a>); impl<'a> ParBuilder<'a> { fn accept(&mut self, content: &Content, styles: StyleChain<'a>) -> bool { - // Weak par elements: - // Weakness | Element - // 0 | weak fractional spacing - // 1 | weak spacing - // 2 | space - - if content.is::() { - self.0.weak(ParChild::Text(' '.into()), styles, 2); - } else if let Some(linebreak) = content.downcast::() { - let c = if linebreak.justify { '\u{2028}' } else { '\n' }; - self.0.destructive(ParChild::Text(c.into()), styles); - } else if let Some(horizontal) = content.downcast::() { - let child = ParChild::Spacing(horizontal.amount); - let frac = horizontal.amount.is_fractional(); - if horizontal.weak { - let weakness = u8::from(!frac); - self.0.weak(child, styles, weakness); - } else if frac { - self.0.destructive(child, styles); - } else { - self.0.ignorant(child, styles); - } - } else if let Some(quote) = content.downcast::() { - self.0.supportive(ParChild::Quote { double: quote.double }, styles); - } else if let Some(text) = content.downcast::() { - self.0.supportive(ParChild::Text(text.0.clone()), styles); - } else if content.has::() { - self.0.supportive(ParChild::Inline(content.clone()), styles); - } else { - return false; + if content.is::() + || content.is::() + || content.is::() + || content.is::() + || content.is::() + || content.has::() + { + self.0.push(content.clone(), styles); + return true; } - true + false } fn finish(self, parent: &mut Builder<'a>) { @@ -600,10 +556,14 @@ impl<'a> ParBuilder<'a> { if !indent.is_zero() && children .items() - .find_map(|child| match child { - ParChild::Spacing(_) => None, - ParChild::Text(_) | ParChild::Quote { .. } => Some(true), - ParChild::Inline(_) => Some(false), + .find_map(|child| { + if child.is::() || child.is::() { + Some(true) + } else if child.has::() { + Some(false) + } else { + None + } }) .unwrap_or_default() && parent @@ -611,14 +571,10 @@ impl<'a> ParBuilder<'a> { .0 .items() .rev() - .find_map(|child| match child { - FlowChild::Spacing(_) => None, - FlowChild::Block(content) => Some(content.is::()), - FlowChild::Colbreak => Some(false), - }) - .unwrap_or_default() + .find(|child| child.has::()) + .map_or(false, |child| child.is::()) { - children.push_front(ParChild::Spacing(indent.into())); + children.push_front(HNode::strong(indent.into()).pack()); } parent.flow.accept(&ParNode(children).pack(), shared); @@ -701,115 +657,3 @@ impl Default for ListBuilder<'_> { } } } - -/// A wrapper around a [`StyleVecBuilder`] that allows to collapse items. -struct CollapsingBuilder<'a, T> { - /// The internal builder. - builder: StyleVecBuilder<'a, T>, - /// Staged weak and ignorant items that we can't yet commit to the builder. - /// The option is `Some(_)` for weak items and `None` for ignorant items. - staged: Vec<(T, StyleChain<'a>, Option)>, - /// What the last non-ignorant item was. - last: Last, -} - -/// What the last non-ignorant item was. -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -enum Last { - Weak, - Destructive, - Supportive, -} - -impl<'a, T> CollapsingBuilder<'a, T> { - /// Create a new style-vec builder. - fn new() -> Self { - Self { - builder: StyleVecBuilder::new(), - staged: vec![], - last: Last::Destructive, - } - } - - /// Whether the builder is empty. - fn is_empty(&self) -> bool { - self.builder.is_empty() && self.staged.is_empty() - } - - /// Can only exist when there is at least one supportive item to its left - /// and to its right, with no destructive items in between. There may be - /// ignorant items in between in both directions. - /// - /// Between weak items, there may be at least one per layer and among the - /// candidates the strongest one (smallest `weakness`) wins. When tied, - /// the one that compares larger through `PartialOrd` wins. - fn weak(&mut self, item: T, styles: StyleChain<'a>, weakness: u8) - where - T: PartialOrd, - { - if self.last == Last::Destructive { - return; - } - - if self.last == Last::Weak { - let weak = self.staged.iter().position(|(prev_item, _, prev_weakness)| { - prev_weakness.map_or(false, |prev_weakness| { - weakness < prev_weakness - || (weakness == prev_weakness && item > *prev_item) - }) - }); - - let Some(weak) = weak else { return }; - self.staged.remove(weak); - } - - self.staged.push((item, styles, Some(weakness))); - self.last = Last::Weak; - } - - /// Forces nearby weak items to collapse. - fn destructive(&mut self, item: T, styles: StyleChain<'a>) { - self.flush(false); - self.builder.push(item, styles); - self.last = Last::Destructive; - } - - /// Allows nearby weak items to exist. - fn supportive(&mut self, item: T, styles: StyleChain<'a>) { - self.flush(true); - self.builder.push(item, styles); - self.last = Last::Supportive; - } - - /// Has no influence on other items. - fn ignorant(&mut self, item: T, styles: StyleChain<'a>) { - self.staged.push((item, styles, None)); - } - - /// Iterate over the contained items. - fn items(&self) -> impl DoubleEndedIterator { - self.builder.items().chain(self.staged.iter().map(|(item, ..)| item)) - } - - /// Return the finish style vec and the common prefix chain. - fn finish(mut self) -> (StyleVec, StyleChain<'a>) { - self.flush(false); - self.builder.finish() - } - - /// Push the staged items, filtering out weak items if `supportive` is - /// false. - fn flush(&mut self, supportive: bool) { - for (item, styles, meta) in self.staged.drain(..) { - if supportive || meta.is_none() { - self.builder.push(item, styles); - } - } - } -} - -impl<'a, T> Default for CollapsingBuilder<'a, T> { - fn default() -> Self { - Self::new() - } -} diff --git a/library/src/layout/place.rs b/library/src/layout/place.rs index 7d760ab6e..42f7ff7d3 100644 --- a/library/src/layout/place.rs +++ b/library/src/layout/place.rs @@ -5,7 +5,7 @@ use crate::prelude::*; #[derive(Debug, Hash)] pub struct PlaceNode(pub Content); -#[node(LayoutBlock)] +#[node(LayoutBlock, Behave)] impl PlaceNode { fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { let aligns = args.find()?.unwrap_or(Axes::with_x(Some(GenAlign::Start))); @@ -54,3 +54,9 @@ impl PlaceNode { .map_or(false, |node| node.aligns.y.is_some()) } } + +impl Behave for PlaceNode { + fn behaviour(&self) -> Behaviour { + Behaviour::Ignorant + } +} diff --git a/library/src/layout/spacing.rs b/library/src/layout/spacing.rs index 66d71ed17..74bd2f0f0 100644 --- a/library/src/layout/spacing.rs +++ b/library/src/layout/spacing.rs @@ -5,11 +5,13 @@ use crate::prelude::*; /// Horizontal spacing. #[derive(Debug, Copy, Clone, Hash)] pub struct HNode { + /// The amount of horizontal spacing. pub amount: Spacing, + /// Whether the node is weak, see also [`Behaviour`]. pub weak: bool, } -#[node] +#[node(Behave)] impl HNode { fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { let amount = args.expect("spacing")?; @@ -18,31 +20,98 @@ impl HNode { } } -/// Vertical spacing. -#[derive(Debug, Copy, Clone, Hash, PartialEq, PartialOrd)] -pub struct VNode { - pub amount: Spacing, - pub weak: bool, -} - -impl VNode { - /// Create weak vertical spacing. - pub fn weak(amount: Spacing) -> Self { - Self { amount, weak: true } - } - - /// Create strong vertical spacing. +impl HNode { + /// Normal strong spacing. pub fn strong(amount: Spacing) -> Self { Self { amount, weak: false } } + + /// User-created weak spacing. + pub fn weak(amount: Spacing) -> Self { + Self { amount, weak: true } + } } -#[node] +impl Behave for HNode { + fn behaviour(&self) -> Behaviour { + if self.amount.is_fractional() { + Behaviour::Destructive + } else if self.weak { + Behaviour::Weak(1) + } else { + Behaviour::Ignorant + } + } + + fn larger(&self, prev: &Content) -> bool { + let Some(prev) = prev.downcast::() else { return false }; + self.amount > prev.amount + } +} + +/// Vertical spacing. +#[derive(Debug, Copy, Clone, Hash, PartialEq, PartialOrd)] +pub struct VNode { + /// The amount of vertical spacing. + pub amount: Spacing, + /// The node's weakness level, see also [`Behaviour`]. + pub weakness: u8, +} + +#[node(Behave)] impl VNode { fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { let amount = args.expect("spacing")?; - let weak = args.named("weak")?.unwrap_or(false); - Ok(Self { amount, weak }.pack()) + let node = if args.named("weak")?.unwrap_or(false) { + Self::weak(amount) + } else { + Self::strong(amount) + }; + Ok(node.pack()) + } +} + +impl VNode { + /// Normal strong spacing. + pub fn strong(amount: Spacing) -> Self { + Self { amount, weakness: 0 } + } + + /// User-created weak spacing. + pub fn weak(amount: Spacing) -> Self { + Self { amount, weakness: 1 } + } + + /// Weak spacing with list attach weakness. + pub fn list_attach(amount: Spacing) -> Self { + Self { amount, weakness: 2 } + } + + /// Weak spacing with BlockNode::ABOVE/BELOW weakness. + pub fn block_around(amount: Spacing) -> Self { + Self { amount, weakness: 3 } + } + + /// Weak spacing with BlockNode::SPACING weakness. + pub fn block_spacing(amount: Spacing) -> Self { + Self { amount, weakness: 4 } + } +} + +impl Behave for VNode { + fn behaviour(&self) -> Behaviour { + if self.amount.is_fractional() { + Behaviour::Destructive + } else if self.weakness > 0 { + Behaviour::Weak(self.weakness) + } else { + Behaviour::Ignorant + } + } + + fn larger(&self, prev: &Content) -> bool { + let Some(prev) = prev.downcast::() else { return false }; + self.amount > prev.amount } } diff --git a/library/src/lib.rs b/library/src/lib.rs index 7ffb490c1..6f77e0f33 100644 --- a/library/src/lib.rs +++ b/library/src/lib.rs @@ -1,6 +1,7 @@ //! Typst's standard library. pub mod base; +pub mod core; pub mod graphics; pub mod layout; pub mod math; @@ -8,8 +9,6 @@ pub mod prelude; pub mod structure; pub mod text; -mod ext; - use typst::geom::{Align, Color, Dir, GenAlign}; use typst::model::{LangItems, Node, Scope, StyleMap}; diff --git a/library/src/prelude.rs b/library/src/prelude.rs index f08604a8e..b7095aeef 100644 --- a/library/src/prelude.rs +++ b/library/src/prelude.rs @@ -1,20 +1,32 @@ //! Helpful imports for creating library functionality. +#[doc(no_inline)] pub use std::fmt::{self, Debug, Formatter}; +#[doc(no_inline)] pub use std::num::NonZeroUsize; +#[doc(no_inline)] pub use comemo::Tracked; +#[doc(no_inline)] pub use typst::diag::{bail, error, with_alternative, At, SourceResult, StrResult}; +#[doc(no_inline)] pub use typst::frame::*; +#[doc(no_inline)] pub use typst::geom::*; +#[doc(no_inline)] pub use typst::model::{ array, capability, castable, dict, dynamic, format_str, node, Args, Array, Cast, - Content, Dict, Finalize, Fold, Func, Key, Node, RecipeId, Resolve, Scope, Show, - Smart, Str, StyleChain, StyleMap, StyleVec, Value, Vm, + Content, Dict, Finalize, Fold, Func, Node, RecipeId, Resolve, Show, Smart, Str, + StyleChain, StyleMap, StyleVec, Value, Vm, }; +#[doc(no_inline)] pub use typst::syntax::{Span, Spanned}; +#[doc(no_inline)] pub use typst::util::{format_eco, EcoString}; +#[doc(no_inline)] pub use typst::World; -pub use super::ext::{ContentExt, StyleMapExt}; -pub use super::layout::{LayoutBlock, LayoutInline, Regions}; +#[doc(no_inline)] +pub use crate::core::{Behave, Behaviour, ContentExt, StyleMapExt}; +#[doc(no_inline)] +pub use crate::layout::{LayoutBlock, LayoutInline, Regions}; diff --git a/library/src/structure/heading.rs b/library/src/structure/heading.rs index 87b522f7d..e069e3a9e 100644 --- a/library/src/structure/heading.rs +++ b/library/src/structure/heading.rs @@ -50,20 +50,21 @@ impl Finalize for HeadingNode { _: StyleChain, realized: Content, ) -> SourceResult { - let size = Em::new(match self.level.get() { + let scale = match self.level.get() { 1 => 1.4, 2 => 1.2, _ => 1.0, - }); + }; - let above = Em::new(if self.level.get() == 1 { 1.8 } else { 1.44 }); - let below = Em::new(0.66); + let size = Em::new(scale); + let above = Em::new(if self.level.get() == 1 { 1.8 } else { 1.44 }) / scale; + let below = Em::new(0.66) / scale; let mut map = StyleMap::new(); map.set(TextNode::SIZE, TextSize(size.into())); map.set(TextNode::WEIGHT, FontWeight::BOLD); - map.set(BlockNode::ABOVE, VNode::strong(above.into())); - map.set(BlockNode::BELOW, VNode::strong(below.into())); + map.set(BlockNode::ABOVE, VNode::block_around(above.into())); + map.set(BlockNode::BELOW, VNode::block_around(below.into())); Ok(realized.styled_with_map(map)) } diff --git a/library/src/text/mod.rs b/library/src/text/mod.rs index c2a675471..8484ff576 100644 --- a/library/src/text/mod.rs +++ b/library/src/text/mod.rs @@ -410,20 +410,26 @@ impl Fold for FontFeatures { #[derive(Debug, Clone, Hash)] pub struct SpaceNode; -#[node] +#[node(Behave)] impl SpaceNode { fn construct(_: &mut Vm, _: &mut Args) -> SourceResult { Ok(Self.pack()) } } +impl Behave for SpaceNode { + fn behaviour(&self) -> Behaviour { + Behaviour::Weak(2) + } +} + /// A line break. #[derive(Debug, Clone, Hash)] pub struct LinebreakNode { pub justify: bool, } -#[node] +#[node(Behave)] impl LinebreakNode { fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { let justify = args.named("justify")?.unwrap_or(false); @@ -431,6 +437,12 @@ impl LinebreakNode { } } +impl Behave for LinebreakNode { + fn behaviour(&self) -> Behaviour { + Behaviour::Destructive + } +} + /// A smart quote. #[derive(Debug, Clone, Hash)] pub struct SmartQuoteNode { diff --git a/library/src/text/par.rs b/library/src/text/par.rs index b49e49146..3e72b0347 100644 --- a/library/src/text/par.rs +++ b/library/src/text/par.rs @@ -1,30 +1,19 @@ -use std::cmp::Ordering; - -use typst::util::EcoString; use unicode_bidi::{BidiInfo, Level as BidiLevel}; use unicode_script::{Script, UnicodeScript}; use xi_unicode::LineBreakIterator; -use super::{shape, Lang, Quoter, Quotes, ShapedText, TextNode}; -use crate::layout::Spacing; +use typst::model::Key; + +use super::{ + shape, Lang, LinebreakNode, Quoter, Quotes, ShapedText, SmartQuoteNode, SpaceNode, + TextNode, +}; +use crate::layout::{HNode, Spacing}; use crate::prelude::*; /// Arrange text, spacing and inline-level nodes into a paragraph. #[derive(Hash)] -pub struct ParNode(pub StyleVec); - -/// A uniformly styled atomic piece of a paragraph. -#[derive(Hash, PartialEq)] -pub enum ParChild { - /// A chunk of text. - Text(EcoString), - /// A single or double smart quote. - Quote { double: bool }, - /// Horizontal spacing between other children. - Spacing(Spacing), - /// Arbitrary inline-level content. - Inline(Content), -} +pub struct ParNode(pub StyleVec); #[node(LayoutBlock)] impl ParNode { @@ -84,26 +73,6 @@ impl Debug for ParNode { } } -impl Debug for ParChild { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - match self { - Self::Text(text) => write!(f, "Text({:?})", text), - Self::Quote { double } => write!(f, "Quote({double})"), - Self::Spacing(kind) => write!(f, "{:?}", kind), - Self::Inline(inline) => inline.fmt(f), - } - } -} - -impl PartialOrd for ParChild { - fn partial_cmp(&self, other: &Self) -> Option { - match (self, other) { - (Self::Spacing(a), Self::Spacing(b)) => a.partial_cmp(b), - _ => None, - } - } -} - /// A horizontal alignment. #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] pub struct HorizontalAlign(pub GenAlign); @@ -426,43 +395,52 @@ fn collect<'a>( while let Some((child, map)) = iter.next() { let styles = map.chain(styles); - let segment = match child { - ParChild::Text(text) => { - let prev = full.len(); - if let Some(case) = styles.get(TextNode::CASE) { - full.push_str(&case.apply(text)); - } else { - full.push_str(text); - } - Segment::Text(full.len() - prev) + let segment = if child.is::() { + full.push(' '); + Segment::Text(1) + } else if let Some(node) = child.downcast::() { + let prev = full.len(); + if let Some(case) = styles.get(TextNode::CASE) { + full.push_str(&case.apply(&node.0)); + } else { + full.push_str(&node.0); } - &ParChild::Quote { double } => { - let prev = full.len(); - if styles.get(TextNode::SMART_QUOTES) { - let lang = styles.get(TextNode::LANG); - let region = styles.get(TextNode::REGION); - let quotes = Quotes::from_lang(lang, region); - let peeked = iter.peek().and_then(|(child, _)| match child { - ParChild::Text(text) => text.chars().next(), - ParChild::Quote { .. } => Some('"'), - ParChild::Spacing(_) => Some(SPACING_REPLACE), - ParChild::Inline(_) => Some(NODE_REPLACE), - }); + Segment::Text(full.len() - prev) + } else if let Some(node) = child.downcast::() { + let c = if node.justify { '\u{2028}' } else { '\n' }; + full.push(c); + Segment::Text(c.len_utf8()) + } else if let Some(node) = child.downcast::() { + let prev = full.len(); + if styles.get(TextNode::SMART_QUOTES) { + let lang = styles.get(TextNode::LANG); + let region = styles.get(TextNode::REGION); + let quotes = Quotes::from_lang(lang, region); + let peeked = iter.peek().and_then(|(child, _)| { + if let Some(node) = child.downcast::() { + node.0.chars().next() + } else if child.is::() { + Some('"') + } else if child.is::() || child.is::() { + Some(SPACING_REPLACE) + } else { + Some(NODE_REPLACE) + } + }); - full.push_str(quoter.quote("es, double, peeked)); - } else { - full.push(if double { '"' } else { '\'' }); - } - Segment::Text(full.len() - prev) - } - &ParChild::Spacing(spacing) => { - full.push(SPACING_REPLACE); - Segment::Spacing(spacing) - } - ParChild::Inline(inline) => { - full.push(NODE_REPLACE); - Segment::Inline(inline) + full.push_str(quoter.quote("es, node.double, peeked)); + } else { + full.push(if node.double { '"' } else { '\'' }); } + Segment::Text(full.len() - prev) + } else if let Some(&node) = child.downcast::() { + full.push(SPACING_REPLACE); + Segment::Spacing(node.amount) + } else if child.has::() { + full.push(NODE_REPLACE); + Segment::Inline(child) + } else { + panic!("unexpected par child: {child:?}"); }; if let Some(last) = full.chars().last() { @@ -608,7 +586,7 @@ fn is_compatible(a: Script, b: Script) -> bool { /// paragraph. fn shared_get<'a, K: Key<'a>>( styles: StyleChain<'a>, - children: &StyleVec, + children: &StyleVec, key: K, ) -> Option { children diff --git a/tests/ref/text/indent.png b/tests/ref/text/indent.png index deafc3f68e0d92a62bb0886c34264b3e248200a4..9cf2ace5a040d210e512fc43b6e08b42f2a6015e 100644 GIT binary patch literal 46139 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 MUm3)%V#OT%2cbJ2i~s-t literal 46495 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 EpMAuva{vGU