diff --git a/library/src/base/string.rs b/library/src/base/string.rs index 262dd5c6c..9c3b95625 100644 --- a/library/src/base/string.rs +++ b/library/src/base/string.rs @@ -14,11 +14,17 @@ pub fn str(_: &Vm, args: &mut Args) -> SourceResult { Ok(Value::Str(match v { Value::Int(v) => format_str!("{}", v), Value::Float(v) => format_str!("{}", v), + Value::Label(label) => label.0.into(), Value::Str(v) => v, v => bail!(span, "cannot convert {} to string", v.type_name()), })) } +/// Create a label from a string. +pub fn label(_: &Vm, args: &mut Args) -> SourceResult { + Ok(Value::Label(Label(args.expect("string")?))) +} + /// Create blind text. pub fn lorem(_: &Vm, args: &mut Args) -> SourceResult { let words: usize = args.expect("number of words")?; diff --git a/library/src/lib.rs b/library/src/lib.rs index dd527ed16..ea14c4c1a 100644 --- a/library/src/lib.rs +++ b/library/src/lib.rs @@ -105,6 +105,7 @@ fn scope() -> Scope { std.def_fn("cmyk", base::cmyk); std.def_fn("repr", base::repr); std.def_fn("str", base::str); + std.def_fn("label", base::label); std.def_fn("regex", base::regex); std.def_fn("letter", base::letter); std.def_fn("roman", base::roman); diff --git a/library/src/prelude.rs b/library/src/prelude.rs index d2d82d3bf..6379e5792 100644 --- a/library/src/prelude.rs +++ b/library/src/prelude.rs @@ -16,7 +16,7 @@ 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, Node, NodeId, Resolve, Show, Smart, Str, + Content, Dict, Finalize, Fold, Func, Label, Node, NodeId, Resolve, Show, Smart, Str, StyleChain, StyleMap, StyleVec, Unlabellable, Value, Vm, }; #[doc(no_inline)] diff --git a/src/model/cast.rs b/src/model/cast.rs index d5b4893dc..0e7739ac3 100644 --- a/src/model/cast.rs +++ b/src/model/cast.rs @@ -183,8 +183,9 @@ dynamic! { dynamic! { Selector: "selector", - Value::Func(func) => Self::Node(func.node()?, None), Value::Str(text) => Self::text(&text), + Value::Label(label) => Self::Label(label), + Value::Func(func) => Self::Node(func.node()?, None), @regex: Regex => Self::Regex(regex.clone()), } diff --git a/src/model/content.rs b/src/model/content.rs index 0faf76cb7..a71617987 100644 --- a/src/model/content.rs +++ b/src/model/content.rs @@ -21,7 +21,7 @@ pub struct Content { obj: Arc, guards: Vec, span: Option, - label: Option, + label: Option