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);

 		}

 	}