summaryrefslogtreecommitdiff
path: root/library
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-03-13 21:40:57 +0100
committerLaurenz <laurmaedje@gmail.com>2023-03-13 21:41:33 +0100
commit724e9b140cc0a87208aa9c4914b1b8aeddf25c30 (patch)
tree632984e85eb21c5a5a04c397a74725df6f7f8a28 /library
parent880b1847bd4170ce80be5781c2163ba085cdcaff (diff)
Locatability and synthesis improvements
Diffstat (limited to 'library')
-rw-r--r--library/src/compute/data.rs2
-rw-r--r--library/src/meta/figure.rs18
-rw-r--r--library/src/meta/heading.rs27
-rw-r--r--library/src/meta/link.rs2
-rw-r--r--library/src/meta/outline.rs9
-rw-r--r--library/src/meta/reference.rs13
-rw-r--r--library/src/prelude.rs6
-rw-r--r--library/src/shared/ext.rs2
-rw-r--r--library/src/text/raw.rs4
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));
}
}