Add parameter to disable html escaping
diff --git a/lib/mustache.dart b/lib/mustache.dart
index 23c2c4d..3993230 100644
--- a/lib/mustache.dart
+++ b/lib/mustache.dart
@@ -19,12 +19,12 @@
/// [values] can be a combination of Map, List, String. Any non-String object
/// will be converted using toString(). Null values will cause a
/// FormatException, unless lenient module is enabled.
- String renderString(values, {bool lenient : false});
+ String renderString(values, {bool lenient : false, bool htmlEscapeValues : true});
/// [values] can be a combination of Map, List, String. Any non-String object
/// will be converted using toString(). Null values will cause a
/// FormatException, unless lenient module is enabled.
- void render(values, StringSink sink, {bool lenient : false});
+ void render(values, StringSink sink, {bool lenient : false, bool htmlEscapeValues : true});
}
/// MustacheFormatException is used to obtain the line and column numbers
diff --git a/lib/scanner.dart b/lib/scanner.dart
index 0cd1c42..deb3c5d 100644
--- a/lib/scanner.dart
+++ b/lib/scanner.dart
@@ -9,8 +9,9 @@
const int _OPEN_INV_SECTION = 5;
const int _CLOSE_SECTION = 6;
const int _COMMENT = 7;
+const int _UNESC_VARIABLE = 8;
-tokenTypeString(int type) => ['?', 'Text', 'Var', 'Par', 'Open', 'OpenInv', 'Close', 'Comment'][type];
+tokenTypeString(int type) => ['?', 'Text', 'Var', 'Par', 'Open', 'OpenInv', 'Close', 'Comment', 'UnescVar'][type];
const int _EOF = -1;
const int _NEWLINE = 10;
@@ -121,18 +122,16 @@
// Escaped text {{{ ... }}}
case _OPEN_MUSTACHE:
- throw new UnimplementedError('Escape tag {{{ ... }}}');
- //_read();
- //_addStringToken(_TEXT);
- //_expect(_CLOSE_MUSTACHE);
- //break;
+ _read();
+ _addStringToken(_UNESC_VARIABLE);
+ _expect(_CLOSE_MUSTACHE);
+ break;
// Escaped text {{& ... }}
case _AMP:
- throw new UnimplementedError('Escape tag {{& ... }}');
- //_read();
- //_addStringToken(_TEXT);
- //break;
+ _read();
+ _addStringToken(_UNESC_VARIABLE); //FIXME Do I need to read a space after the '&'?
+ break;
// Comment {{! ... }}
case _EXCLAIM:
diff --git a/lib/template.dart b/lib/template.dart
index a00751b..fef9907 100644
--- a/lib/template.dart
+++ b/lib/template.dart
@@ -68,17 +68,19 @@
final List _stack = new List();
final Map _htmlEscapeMap = new Map<int, String>();
final bool _lenient;
-
+
+ bool _htmlEscapeValues;
StringSink _sink;
- renderString(values, {bool lenient : false}) {
+ String renderString(values, {bool lenient : false, bool htmlEscapeValues : true}) {
var buf = new StringBuffer();
- render(values, buf, lenient: lenient);
+ render(values, buf, lenient: lenient, htmlEscapeValues: htmlEscapeValues);
return buf.toString();
}
- render(values, StringSink sink, {bool lenient : false}) {
+ void render(values, StringSink sink, {bool lenient : false, bool htmlEscapeValues : true}) {
_sink = sink;
+ _htmlEscapeValues = htmlEscapeValues;
_stack.clear();
_stack.add(values);
_root.children.forEach(_renderNode);
@@ -95,6 +97,9 @@
case _VARIABLE:
_renderVariable(node);
break;
+ case _UNESC_VARIABLE:
+ _renderVariable(node, escape: false);
+ break;
case _OPEN_SECTION:
_renderSection(node);
break;
@@ -112,7 +117,7 @@
_write(node.value);
}
- _renderVariable(node) {
+ _renderVariable(node, {bool escape : true}) {
final value = _stack.last[node.value];
if (value == null) {
if (!_lenient)
@@ -121,7 +126,10 @@
'variable: ${node.value}, '
'at: ${node.line}:${node.column}.', node.line, node.column);
} else {
- _write(_htmlEscape(value.toString()));
+ var output = !escape || !_htmlEscapeValues
+ ? value.toString()
+ : _htmlEscape(value.toString());
+ _write(output);
}
}