diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-03-13 21:40:57 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-03-13 21:41:33 +0100 |
| commit | 724e9b140cc0a87208aa9c4914b1b8aeddf25c30 (patch) | |
| tree | 632984e85eb21c5a5a04c397a74725df6f7f8a28 /library/src | |
| parent | 880b1847bd4170ce80be5781c2163ba085cdcaff (diff) | |
Locatability and synthesis improvements
Diffstat (limited to 'library/src')
| -rw-r--r-- | library/src/compute/data.rs | 2 | ||||
| -rw-r--r-- | library/src/meta/figure.rs | 18 | ||||
| -rw-r--r-- | library/src/meta/heading.rs | 27 | ||||
| -rw-r--r-- | library/src/meta/link.rs | 2 | ||||
| -rw-r--r-- | library/src/meta/outline.rs | 9 | ||||
| -rw-r--r-- | library/src/meta/reference.rs | 13 | ||||
| -rw-r--r-- | library/src/prelude.rs | 6 | ||||
| -rw-r--r-- | library/src/shared/ext.rs | 2 | ||||
| -rw-r--r-- | library/src/text/raw.rs | 4 |
9 files changed, 35 insertions, 48 deletions
diff --git a/library/src/compute/data.rs b/library/src/compute/data.rs index 7addff78..82ff3a4b 100644 --- a/library/src/compute/data.rs +++ b/library/src/compute/data.rs @@ -27,7 +27,7 @@ pub fn read( let Spanned { v: path, span } = path; let path = vm.locate(&path).at(span)?; let data = vm.world().file(&path).at(span)?; - let text = String::from_utf8(data.to_vec()) + let text = std::str::from_utf8(&data) .map_err(|_| "file is not valid utf-8") .at(span)?; Value::Str(text.into()) diff --git a/library/src/meta/figure.rs b/library/src/meta/figure.rs index 4a0ddc68..4f6ccc00 100644 --- a/library/src/meta/figure.rs +++ b/library/src/meta/figure.rs @@ -23,7 +23,7 @@ use crate::text::TextNode; /// /// Display: Figure /// Category: meta -#[node(Synthesize, Show, LocalName)] +#[node(Locatable, Synthesize, Show, LocalName)] pub struct FigureNode { /// The content of the figure. Often, an [image]($func/image). #[required] @@ -57,26 +57,24 @@ impl FigureNode { } impl Synthesize for FigureNode { - fn synthesize(&self, vt: &mut Vt, styles: StyleChain) -> Content { - let my_id = vt.identify(self); + fn synthesize(&mut self, vt: &Vt, styles: StyleChain) { + let my_id = self.0.stable_id().unwrap(); let element = self.element(); - let numbering = self.numbering(styles); let mut number = None; + let numbering = self.numbering(styles); if numbering.is_some() { number = NonZeroUsize::new( 1 + vt - .locate(Selector::node::<Self>()) - .into_iter() + .locate_node::<Self>() .take_while(|&(id, _)| id != my_id) - .filter(|(_, node)| node.to::<Self>().unwrap().element() == element) + .filter(|(_, figure)| figure.element() == element) .count(), ); } - let node = self.clone().with_number(number).with_numbering(numbering).pack(); - let meta = Meta::Node(my_id, node.clone()); - node.styled(MetaNode::set_data(vec![meta])) + self.push_number(number); + self.push_numbering(numbering); } } diff --git a/library/src/meta/heading.rs b/library/src/meta/heading.rs index 47047927..4d1b87e6 100644 --- a/library/src/meta/heading.rs +++ b/library/src/meta/heading.rs @@ -40,7 +40,7 @@ use crate::text::{TextNode, TextSize}; /// /// Display: Heading /// Category: meta -#[node(Synthesize, Show, Finalize, LocalName)] +#[node(Locatable, Synthesize, Show, Finalize, LocalName)] pub struct HeadingNode { /// The logical nesting depth of the heading, starting from one. #[default(NonZeroUsize::new(1).unwrap())] @@ -83,19 +83,16 @@ pub struct HeadingNode { } impl Synthesize for HeadingNode { - fn synthesize(&self, vt: &mut Vt, styles: StyleChain) -> Content { - let my_id = vt.identify(self); + fn synthesize(&mut self, vt: &Vt, styles: StyleChain) { + let my_id = self.0.stable_id().unwrap(); let numbering = self.numbering(styles); let mut counter = HeadingCounter::new(); if numbering.is_some() { // Advance past existing headings. - for (_, node) in vt - .locate(Selector::node::<Self>()) - .into_iter() - .take_while(|&(id, _)| id != my_id) + for (_, heading) in + vt.locate_node::<Self>().take_while(|&(id, _)| id != my_id) { - let heading = node.to::<Self>().unwrap(); if heading.numbering(StyleChain::default()).is_some() { counter.advance(heading); } @@ -105,16 +102,10 @@ impl Synthesize for HeadingNode { counter.advance(self); } - let node = self - .clone() - .with_level(self.level(styles)) - .with_outlined(self.outlined(styles)) - .with_numbers(numbering.is_some().then(|| counter.take())) - .with_numbering(numbering) - .pack(); - - let meta = Meta::Node(my_id, node.clone()); - node.styled(MetaNode::set_data(vec![meta])) + self.push_level(self.level(styles)); + self.push_outlined(self.outlined(styles)); + self.push_numbers(numbering.is_some().then(|| counter.take())); + self.push_numbering(numbering); } } diff --git a/library/src/meta/link.rs b/library/src/meta/link.rs index 4aba3697..bca1945a 100644 --- a/library/src/meta/link.rs +++ b/library/src/meta/link.rs @@ -86,7 +86,7 @@ impl Show for LinkNode { impl Finalize for LinkNode { fn finalize(&self, realized: Content, _: StyleChain) -> Content { realized - .styled(MetaNode::set_data(vec![Meta::Link(self.dest())])) + .linked(self.dest()) .styled(TextNode::set_hyphenate(Hyphenate(Smart::Custom(false)))) } } diff --git a/library/src/meta/outline.rs b/library/src/meta/outline.rs index 81785212..7ce0ce1d 100644 --- a/library/src/meta/outline.rs +++ b/library/src/meta/outline.rs @@ -74,15 +74,14 @@ pub struct OutlineNode { } impl Synthesize for OutlineNode { - fn synthesize(&self, vt: &mut Vt, _: StyleChain) -> Content { + fn synthesize(&mut self, vt: &Vt, _: StyleChain) { let headings = vt - .locate(Selector::node::<HeadingNode>()) - .into_iter() - .map(|(_, node)| node.to::<HeadingNode>().unwrap().clone()) + .locate_node::<HeadingNode>() + .map(|(_, node)| node.clone()) .filter(|node| node.outlined(StyleChain::default())) .collect(); - self.clone().with_headings(headings).pack() + self.push_headings(headings); } } diff --git a/library/src/meta/reference.rs b/library/src/meta/reference.rs index 55f2fc6e..18f0aa3f 100644 --- a/library/src/meta/reference.rs +++ b/library/src/meta/reference.rs @@ -37,9 +37,9 @@ use crate::text::TextNode; /// Category: meta #[node(Synthesize, Show)] pub struct RefNode { - /// The label that should be referenced. + /// The target label that should be referenced. #[required] - pub label: Label, + pub target: Label, /// The prefix before the referenced number. /// @@ -59,20 +59,19 @@ pub struct RefNode { /// ``` pub prefix: Smart<Option<Func>>, - /// All elements with the `target` label in the document. + /// All elements with the target label in the document. #[synthesized] pub matches: Vec<Content>, } impl Synthesize for RefNode { - fn synthesize(&self, vt: &mut Vt, _: StyleChain) -> Content { + fn synthesize(&mut self, vt: &Vt, _: StyleChain) { let matches = vt - .locate(Selector::Label(self.label())) - .into_iter() + .locate(Selector::Label(self.target())) .map(|(_, node)| node.clone()) .collect(); - self.clone().with_matches(matches).pack() + self.push_matches(matches); } } diff --git a/library/src/prelude.rs b/library/src/prelude.rs index a9b19f58..36f7cc89 100644 --- a/library/src/prelude.rs +++ b/library/src/prelude.rs @@ -22,9 +22,9 @@ pub use typst::eval::{ pub use typst::geom::*; #[doc(no_inline)] pub use typst::model::{ - node, Construct, Content, Finalize, Fold, Introspector, Label, Node, NodeId, Resolve, - Selector, Set, Show, StabilityProvider, StyleChain, StyleMap, StyleVec, Synthesize, - Unlabellable, Vt, + node, Construct, Content, Finalize, Fold, Introspector, Label, Locatable, Node, + NodeId, Resolve, Selector, Set, Show, StabilityProvider, StableId, StyleChain, + StyleMap, StyleVec, Synthesize, Unlabellable, Vt, }; #[doc(no_inline)] pub use typst::syntax::{Span, Spanned}; diff --git a/library/src/shared/ext.rs b/library/src/shared/ext.rs index 44f933e2..e335b4c8 100644 --- a/library/src/shared/ext.rs +++ b/library/src/shared/ext.rs @@ -42,7 +42,7 @@ impl ContentExt for Content { } fn linked(self, dest: Destination) -> Self { - self.styled(MetaNode::set_data(vec![Meta::Link(dest.clone())])) + self.styled(MetaNode::set_data(vec![Meta::Link(dest)])) } fn aligned(self, aligns: Axes<Option<GenAlign>>) -> Self { diff --git a/library/src/text/raw.rs b/library/src/text/raw.rs index 3f03ba8e..b6cc0d3d 100644 --- a/library/src/text/raw.rs +++ b/library/src/text/raw.rs @@ -121,8 +121,8 @@ impl RawNode { } impl Synthesize for RawNode { - fn synthesize(&self, _: &mut Vt, styles: StyleChain) -> Content { - self.clone().with_lang(self.lang(styles)).pack() + fn synthesize(&mut self, _: &Vt, styles: StyleChain) { + self.push_lang(self.lang(styles)); } } |
