From 0d12f2ab23177642eef2e6bb9c583cdd0c743b33 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 30 Aug 2022 15:00:18 +0200 Subject: [WIP] Label and reference syntax --- src/library/structure/reference.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/library/structure/reference.rs (limited to 'src/library/structure/reference.rs') diff --git a/src/library/structure/reference.rs b/src/library/structure/reference.rs new file mode 100644 index 00000000..0eeb4bf5 --- /dev/null +++ b/src/library/structure/reference.rs @@ -0,0 +1,28 @@ +use crate::library::prelude::*; + +/// A reference to a label. +#[derive(Debug, Hash)] +pub struct RefNode(pub EcoString); + +#[node(showable)] +impl RefNode { + fn construct(_: &mut Machine, args: &mut Args) -> TypResult { + Ok(Content::show(Self(args.expect("label")?))) + } +} + +impl Show for RefNode { + fn unguard(&self, _: Selector) -> ShowNode { + Self(self.0.clone()).pack() + } + + fn encode(&self, _: StyleChain) -> Dict { + dict! { + "label" => Value::Str(self.0.clone().into()), + } + } + + fn realize(&self, _: &mut Context, _: StyleChain) -> TypResult { + Ok(Content::Text(format_eco!("@{}", self.0))) + } +} -- cgit v1.2.3