diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-11-26 13:39:18 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-11-26 13:41:27 +0100 |
| commit | 7af46fc025ee08eb78ae7f6898300083c886bf6f (patch) | |
| tree | 5837d972961844650bc9668d8516d7b5239a8d18 /src/model/eval.rs | |
| parent | 3cdd8bfa40fe5fdf0c676af905c3c2c1f614ef24 (diff) | |
Dynamic labels
Diffstat (limited to 'src/model/eval.rs')
| -rw-r--r-- | src/model/eval.rs | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/src/model/eval.rs b/src/model/eval.rs index 9ed6195e..6c21a666 100644 --- a/src/model/eval.rs +++ b/src/model/eval.rs @@ -8,7 +8,7 @@ use comemo::{Track, Tracked}; use unicode_segmentation::UnicodeSegmentation; use super::{ - methods, ops, Arg, Args, Array, CapturesVisitor, Closure, Content, Dict, Func, + methods, ops, Arg, Args, Array, CapturesVisitor, Closure, Content, Dict, Func, Label, LangItems, Recipe, Scope, Scopes, Selector, StyleMap, Transform, Value, }; use crate::diag::{ @@ -231,11 +231,16 @@ fn eval_markup( let tail = eval_markup(vm, nodes)?; seq.push(tail.styled_with_recipe(vm.world, recipe)?) } - ast::MarkupNode::Label(label) => { - if let Some(node) = seq.iter_mut().rev().find(|node| node.labellable()) { - *node = mem::take(node).labelled(label.get().clone()); + ast::MarkupNode::Expr(expr) => match expr.eval(vm)? { + Value::Label(label) => { + if let Some(node) = + seq.iter_mut().rev().find(|node| node.labellable()) + { + *node = mem::take(node).labelled(label); + } } - } + value => seq.push(value.display().spanned(expr.span())), + }, _ => seq.push(node.eval(vm)?), } @@ -274,9 +279,8 @@ impl Eval for ast::MarkupNode { Self::List(v) => v.eval(vm)?, Self::Enum(v) => v.eval(vm)?, Self::Desc(v) => v.eval(vm)?, - Self::Label(_) => unimplemented!("handled above"), Self::Ref(v) => v.eval(vm)?, - Self::Expr(v) => v.eval(vm)?.display(), + Self::Expr(_) => unimplemented!("handled above"), } .spanned(self.span())) } @@ -527,6 +531,7 @@ impl Eval for ast::Lit { Unit::Percent => Ratio::new(v / 100.0).into(), }, ast::LitKind::Str(v) => Value::Str(v.into()), + ast::LitKind::Label(v) => Value::Label(Label(v)), }) } } |
