diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-11-08 12:13:32 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-11-08 13:06:11 +0100 |
| commit | 38c5c362419c5eee7a4fdc0b43d3a9dfb339a6d2 (patch) | |
| tree | 51faa3f6bbc56f75636823adeea135ed76e1b33b /src/eval | |
| parent | 75fffc1f9b6ef8bf258b2b1845a4ba74a0f5f2c1 (diff) | |
Final touches
Diffstat (limited to 'src/eval')
| -rw-r--r-- | src/eval/capture.rs | 1 | ||||
| -rw-r--r-- | src/eval/mod.rs | 64 | ||||
| -rw-r--r-- | src/eval/walk.rs | 17 |
3 files changed, 46 insertions, 36 deletions
diff --git a/src/eval/capture.rs b/src/eval/capture.rs index 4e24bc90..e47831df 100644 --- a/src/eval/capture.rs +++ b/src/eval/capture.rs @@ -172,5 +172,6 @@ mod tests { // Scoping. test("{ let x = 1; { let y = 2; y }; x + y }", &["y"]); + test("[#let x = 1]#x", &["x"]); } } diff --git a/src/eval/mod.rs b/src/eval/mod.rs index 540b58b9..fda2184e 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -398,11 +398,11 @@ impl Eval for CallArgs { value: Spanned::new(expr.eval(ctx)?, expr.span()), }); } - CallArg::Named(x) => { + CallArg::Named(named) => { items.push(Arg { span, - name: Some(x.name().take().into()), - value: Spanned::new(x.expr().eval(ctx)?, x.expr().span()), + name: Some(named.name().take().into()), + value: Spanned::new(named.expr().eval(ctx)?, named.expr().span()), }); } CallArg::Spread(expr) => match expr.eval(ctx)? { @@ -511,8 +511,8 @@ impl Eval for WithExpr { type Output = Value; fn eval(&self, ctx: &mut EvalContext) -> TypResult<Self::Output> { - let wrapped = - self.callee().eval(ctx)?.cast::<Function>().at(self.callee().span())?; + let callee = self.callee(); + let wrapped = callee.eval(ctx)?.cast::<Function>().at(callee.span())?; let applied = self.args().eval(ctx)?; let name = wrapped.name().cloned(); @@ -529,7 +529,7 @@ impl Eval for LetExpr { type Output = Value; fn eval(&self, ctx: &mut EvalContext) -> TypResult<Self::Output> { - let value = match &self.init() { + let value = match self.init() { Some(expr) => expr.eval(ctx)?, None => Value::None, }; @@ -542,15 +542,10 @@ impl Eval for IfExpr { type Output = Value; fn eval(&self, ctx: &mut EvalContext) -> TypResult<Self::Output> { - let condition = self - .condition() - .eval(ctx)? - .cast::<bool>() - .at(self.condition().span())?; - - if condition { + let condition = self.condition(); + if condition.eval(ctx)?.cast::<bool>().at(condition.span())? { self.if_body().eval(ctx) - } else if let Some(else_body) = &self.else_body() { + } else if let Some(else_body) = self.else_body() { else_body.eval(ctx) } else { Ok(Value::None) @@ -564,14 +559,11 @@ impl Eval for WhileExpr { fn eval(&self, ctx: &mut EvalContext) -> TypResult<Self::Output> { let mut output = Value::None; - while self - .condition() - .eval(ctx)? - .cast::<bool>() - .at(self.condition().span())? - { - let value = self.body().eval(ctx)?; - output = ops::join(output, value).at(self.body().span())?; + let condition = self.condition(); + while condition.eval(ctx)?.cast::<bool>().at(condition.span())? { + let body = self.body(); + let value = body.eval(ctx)?; + output = ops::join(output, value).at(body.span())?; } Ok(output) @@ -597,7 +589,7 @@ impl Eval for ForExpr { } ctx.scopes.exit(); - Ok(output) + return Ok(output); }}; } @@ -607,18 +599,20 @@ impl Eval for ForExpr { let value = pattern.value().take(); match (key, value, iter) { - (None, v, Value::Str(string)) => iter!(for (v => value) in string.iter()), + (None, v, Value::Str(string)) => { + iter!(for (v => value) in string.iter()); + } (None, v, Value::Array(array)) => { - iter!(for (v => value) in array.into_iter()) + iter!(for (v => value) in array.into_iter()); } (Some(i), v, Value::Array(array)) => { - iter!(for (i => idx, v => value) in array.into_iter().enumerate()) + iter!(for (i => idx, v => value) in array.into_iter().enumerate()); } (None, v, Value::Dict(dict)) => { - iter!(for (v => value) in dict.into_iter().map(|p| p.1)) + iter!(for (v => value) in dict.into_iter().map(|p| p.1)); } (Some(k), v, Value::Dict(dict)) => { - iter!(for (k => key, v => value) in dict.into_iter()) + iter!(for (k => key, v => value) in dict.into_iter()); } (_, _, Value::Str(_)) => { bail!(pattern.span(), "mismatched pattern"); @@ -634,9 +628,9 @@ impl Eval for ImportExpr { type Output = Value; fn eval(&self, ctx: &mut EvalContext) -> TypResult<Self::Output> { - let path = self.path().eval(ctx)?.cast::<Str>().at(self.path().span())?; - - let file = ctx.import(&path, self.path().span())?; + let path = self.path(); + let resolved = path.eval(ctx)?.cast::<Str>().at(path.span())?; + let file = ctx.import(&resolved, path.span())?; let module = &ctx.modules[&file]; match self.imports() { @@ -664,12 +658,10 @@ impl Eval for IncludeExpr { type Output = Value; fn eval(&self, ctx: &mut EvalContext) -> TypResult<Self::Output> { - let path_node = self.path(); - let path = path_node.eval(ctx)?.cast::<Str>().at(path_node.span())?; - - let file = ctx.import(&path, path_node.span())?; + let path = self.path(); + let resolved = path.eval(ctx)?.cast::<Str>().at(path.span())?; + let file = ctx.import(&resolved, path.span())?; let module = &ctx.modules[&file]; - Ok(Value::Template(module.template.clone())) } } diff --git a/src/eval/walk.rs b/src/eval/walk.rs index 1656929b..aab32f40 100644 --- a/src/eval/walk.rs +++ b/src/eval/walk.rs @@ -33,6 +33,7 @@ impl Walk for MarkupNode { Self::Emph => ctx.template.modify(|s| s.text_mut().emph.flip()), Self::Text(text) => ctx.template.text(text), Self::Raw(raw) => raw.walk(ctx)?, + Self::Math(math) => math.walk(ctx)?, Self::Heading(heading) => heading.walk(ctx)?, Self::List(list) => list.walk(ctx)?, Self::Enum(enum_) => enum_.walk(ctx)?, @@ -67,6 +68,22 @@ impl Walk for RawNode { } } +impl Walk for MathNode { + fn walk(&self, ctx: &mut EvalContext) -> TypResult<()> { + if self.display { + ctx.template.parbreak(); + } + + ctx.template.monospace(self.formula.trim()); + + if self.display { + ctx.template.parbreak(); + } + + Ok(()) + } +} + impl Walk for HeadingNode { fn walk(&self, ctx: &mut EvalContext) -> TypResult<()> { let level = self.level(); |
