aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2017-02-14 21:16:08 +0100
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2017-02-14 21:17:24 +0100
commita2af8348cce685363195542d9874c28b91a9d78f (patch)
tree7bd6d9b9e1bc78403a7d3d58ddfce5d100d9f194
parentbab940d1748027ff3978a3605b3e1a71f67a81f7 (diff)
downloadaskama-a2af8348cce685363195542d9874c28b91a9d78f.tar.gz
askama-a2af8348cce685363195542d9874c28b91a9d78f.tar.bz2
askama-a2af8348cce685363195542d9874c28b91a9d78f.zip
Be smarter about writing indentation correctly
By applying simple if slightly magic heuristics, relieve the need for calls to indent() and dedent() in most places in the code generator.
-rw-r--r--askama/src/generator.rs35
1 files changed, 11 insertions, 24 deletions
diff --git a/askama/src/generator.rs b/askama/src/generator.rs
index 875f195..e768219 100644
--- a/askama/src/generator.rs
+++ b/askama/src/generator.rs
@@ -72,7 +72,13 @@ impl<'a> Generator<'a> {
if s.is_empty() {
return;
}
+ if s == "}" {
+ self.dedent();
+ }
self.write(s);
+ if s.ends_with('{') {
+ self.indent();
+ }
self.buf.push('\n');
self.start = true;
}
@@ -177,16 +183,18 @@ impl<'a> Generator<'a> {
if i == 0 {
self.write("if ");
} else {
+ self.dedent();
self.write("} else if ");
}
self.visit_expr(expr);
},
- None => { self.write("} else"); },
+ None => {
+ self.dedent();
+ self.write("} else");
+ },
}
self.writeln(" {");
- self.indent();
self.handle(nodes);
- self.dedent();
}
self.handle_ws(ws);
self.writeln("}");
@@ -206,10 +214,8 @@ impl<'a> Generator<'a> {
self.visit_expr(iter);
self.writeln(" {");
- self.indent();
self.handle(body);
self.handle_ws(ws2);
- self.dedent();
self.writeln("}");
for name in &targets {
self.locals.remove(name);
@@ -228,11 +234,9 @@ impl<'a> Generator<'a> {
self.writeln(&format!(
"fn render_block_{}_to(&self, writer: &mut std::fmt::Write) {{",
name));
- self.indent();
self.prepare_ws(ws1);
self.handle(nodes);
self.flush_ws(ws2);
- self.dedent();
self.writeln("}");
}
@@ -274,16 +278,11 @@ impl<'a> Generator<'a> {
let anno = annotations(&ast.generics);
self.writeln(&format!("impl{} askama::Template for {}{} {{",
anno, ast.ident.as_ref(), anno));
- self.indent();
self.writeln("fn render_to(&self, writer: &mut std::fmt::Write) {");
- self.indent();
self.handle(nodes);
self.flush_ws(&WS(false, false));
- self.dedent();
self.writeln("}");
-
- self.dedent();
self.writeln("}");
}
@@ -293,7 +292,6 @@ impl<'a> Generator<'a> {
self.writeln(&format!("impl{} TraitFrom{} for {}{} {{",
anno, path_as_identifier(base),
ast.ident.as_ref(), anno));
- self.indent();
self.handle(blocks);
self.writeln("#[allow(unused_variables)]");
@@ -301,7 +299,6 @@ impl<'a> Generator<'a> {
self.writeln(&format!(
"fn render_trait_to(&self, timpl: &{}, writer: &mut std::fmt::Write) {{",
trait_name));
- self.indent();
if let Some(nodes) = nodes {
self.handle(nodes);
@@ -310,10 +307,8 @@ impl<'a> Generator<'a> {
self.writeln("self._parent.render_trait_to(self, writer);");
}
- self.dedent();
self.writeln("}");
self.flush_ws(&WS(false, false));
- self.dedent();
self.writeln("}");
}
@@ -321,26 +316,19 @@ impl<'a> Generator<'a> {
let anno = annotations(&ast.generics);
self.writeln(&format!("impl{} askama::Template for {}{} {{",
anno, ast.ident.as_ref(), anno));
- self.indent();
-
self.writeln("fn render_to(&self, writer: &mut std::fmt::Write) {");
- self.indent();
if derived {
self.writeln("self._parent.render_trait_to(self, writer);");
} else {
self.writeln("self.render_trait_to(self, writer);");
}
- self.dedent();
self.writeln("}");
-
- self.dedent();
self.writeln("}");
}
fn define_trait(&mut self, path: &str, block_names: &[&str]) {
let trait_name = format!("TraitFrom{}", path_as_identifier(path));
self.writeln(&format!("trait {} {{", &trait_name));
- self.indent();
for bname in block_names {
self.writeln(&format!(
@@ -351,7 +339,6 @@ impl<'a> Generator<'a> {
"fn render_trait_to(&self, timpl: &{}, writer: &mut std::fmt::Write);",
trait_name));
- self.dedent();
self.writeln("}");
}