summaryrefslogtreecommitdiff
path: root/src/layout/tree.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2020-08-19 20:49:01 +0200
committerLaurenz <laurmaedje@gmail.com>2020-08-19 20:49:01 +0200
commit77dac270a8a99f24a6fc0eb9e92256bcc07c586c (patch)
tree8e240b798a5c1aabd77c823e65828f3c6d2557f1 /src/layout/tree.rs
parent6d7e7d945b315469b80bca3466a96534b2a17639 (diff)
Make compute functions possible 💻
Ships with the amazing new `rgb` function!
Diffstat (limited to 'src/layout/tree.rs')
-rw-r--r--src/layout/tree.rs90
1 files changed, 35 insertions, 55 deletions
diff --git a/src/layout/tree.rs b/src/layout/tree.rs
index f132a8cb..e500c4ba 100644
--- a/src/layout/tree.rs
+++ b/src/layout/tree.rs
@@ -1,6 +1,5 @@
//! Layouting of syntax trees.
-use crate::compute::value::Value;
use crate::style::LayoutStyle;
use crate::syntax::decoration::Decoration;
use crate::syntax::span::{Span, Spanned};
@@ -62,12 +61,7 @@ impl<'a> TreeLayouter<'a> {
};
match &node.v {
- SyntaxNode::Spacing => {
- self.layouter.add_primary_spacing(
- self.style.text.word_spacing(),
- SpacingKind::WORD,
- );
- }
+ SyntaxNode::Spacing => self.layout_space(),
SyntaxNode::Linebreak => self.layouter.finish_line(),
SyntaxNode::ToggleItalic => {
@@ -93,45 +87,11 @@ impl<'a> TreeLayouter<'a> {
}
}
- async fn layout_par(&mut self, par: &SyntaxTree) {
- self.layouter.add_secondary_spacing(
- self.style.text.paragraph_spacing(),
- SpacingKind::PARAGRAPH,
+ fn layout_space(&mut self) {
+ self.layouter.add_primary_spacing(
+ self.style.text.word_spacing(),
+ SpacingKind::WORD,
);
-
- self.layout_tree(par).await;
- }
-
- async fn layout_call(&mut self, call: Spanned<&CallExpr>) {
- let name = call.v.name.v.as_str();
- let span = call.v.name.span;
-
- let (func, deco) = if let Some(func) = self.ctx.scope.func(name) {
- (func, Decoration::Resolved)
- } else {
- error!(@self.feedback, span, "unknown function");
- (self.ctx.scope.fallback(), Decoration::Unresolved)
- };
-
- self.feedback.decorations.push(Spanned::new(deco, span));
-
- let args = call.v.args.eval();
- let pass = func(span, args, LayoutContext {
- style: &self.style,
- spaces: self.layouter.remaining(),
- root: true,
- ..self.ctx
- }).await;
-
- self.feedback.extend(pass.feedback);
-
- if let Value::Commands(commands) = pass.output {
- for command in commands {
- self.execute_command(command, call.span).await;
- }
- } else {
- self.layout_raw(&[format!("{:?}", pass.output)]).await;
- }
}
async fn layout_text(&mut self, text: &str) {
@@ -154,24 +114,44 @@ impl<'a> TreeLayouter<'a> {
self.style.text.fallback
.list_mut()
.insert(0, "monospace".to_string());
-
self.style.text.fallback.flatten();
- // Layout the first line.
- let mut iter = lines.iter();
- if let Some(line) = iter.next() {
- self.layout_text(line).await;
- }
-
- // Put a newline before each following line.
- for line in iter {
- self.layouter.finish_line();
+ let mut first = true;
+ for line in lines {
+ if !first {
+ self.layouter.finish_line();
+ }
+ first = false;
self.layout_text(line).await;
}
self.style.text.fallback = fallback;
}
+ async fn layout_par(&mut self, par: &SyntaxTree) {
+ self.layout_tree(par).await;
+ self.layouter.add_secondary_spacing(
+ self.style.text.paragraph_spacing(),
+ SpacingKind::PARAGRAPH,
+ );
+ }
+
+ async fn layout_call(&mut self, call: Spanned<&CallExpr>) {
+ let ctx = LayoutContext {
+ style: &self.style,
+ spaces: self.layouter.remaining(),
+ root: false,
+ ..self.ctx
+ };
+
+ let val = call.v.eval(&ctx, &mut self.feedback).await;
+ let commands = Spanned::new(val, call.span).into_commands();
+
+ for command in commands {
+ self.execute_command(command, call.span).await;
+ }
+ }
+
async fn execute_command(&mut self, command: Command, span: Span) {
use Command::*;