Initial attempt at indenting partial content correctly - no dice
diff --git a/lib/mustache.dart b/lib/mustache.dart
index 39dfb75..0fa0e7e 100644
--- a/lib/mustache.dart
+++ b/lib/mustache.dart
@@ -4,6 +4,7 @@
import 'dart:mirrors';
part 'src/char_reader.dart';
+part 'src/prefixing_string_sink.dart';
part 'src/scanner.dart';
part 'src/template.dart';
diff --git a/lib/src/prefixing_string_sink.dart b/lib/src/prefixing_string_sink.dart
new file mode 100644
index 0000000..fffeb2b
--- /dev/null
+++ b/lib/src/prefixing_string_sink.dart
@@ -0,0 +1,51 @@
+part of mustache;
+
+class PrefixingStringSink implements StringSink {
+
+ bool _started = false;
+ final StringSink _sink;
+ final String _prefix;
+
+ PrefixingStringSink(this._sink, this._prefix);
+
+ void write(Object obj) {
+ if (!_started) {
+ _started = true;
+ _sink.write(_prefix);
+ }
+ var s = obj.toString();
+ _sink.write(s.replaceAll('\n', '\n$_prefix'));
+ }
+
+ void writeCharCode(int charCode) {
+ if (!_started) {
+ _started = true;
+ _sink.write(_prefix);
+ }
+ _sink.writeCharCode(charCode);
+ if (charCode == _NEWLINE) _sink.write(_prefix);
+ }
+
+ void writeAll(Iterable objects, [String separator = ""]) {
+ Iterator iterator = objects.iterator;
+ if (!iterator.moveNext()) return;
+ if (separator.isEmpty) {
+ do {
+ write(iterator.current);
+ } while (iterator.moveNext());
+ } else {
+ write(iterator.current);
+ while (iterator.moveNext()) {
+ write(separator);
+ write(iterator.current);
+ }
+ }
+ }
+
+ void writeln([Object obj = ""]) {
+ write(obj);
+ _sink.write('\n');
+ _sink.write(_prefix);
+ }
+
+}
diff --git a/lib/src/scanner.dart b/lib/src/scanner.dart
index b08bac0..18e5da2 100644
--- a/lib/src/scanner.dart
+++ b/lib/src/scanner.dart
@@ -161,7 +161,7 @@
// Capture whitespace preceding a partial tag so it can used for indentation during rendering.
var indent = '';
if (_tokens.isNotEmpty) {
- if (_tokens.length == 1 && _tokens.last == _WHITESPACE) {
+ if (_tokens.length == 1 && _tokens.last.type == _WHITESPACE) {
indent = _tokens.last.value;
} else if (_tokens.length > 1) {
diff --git a/lib/src/template.dart b/lib/src/template.dart
index 7a1fed1..3e2a365 100644
--- a/lib/src/template.dart
+++ b/lib/src/template.dart
@@ -121,7 +121,9 @@
_Renderer.partial(_Renderer renderer, _Template partial, String indent)
: this(partial._root,
- renderer._sink,
+ indent == null || indent == ''
+ ? renderer._sink
+ : new PrefixingStringSink(renderer._sink, indent),
renderer._values,
renderer._stack,
renderer._lenient,
@@ -354,6 +356,8 @@
? null
: _partialResolver(partialName);
if (template != null) {
+ print('render partial with indent "${node.indent}"');
+ //TODO Check if nested partials indent correctly?
var renderer = new _Renderer.partial(this, template, node.indent);
renderer.render();
} else if (_lenient) {