blob: fff1d98b7f7e731d15fc6c4a07967c7a167a01db [file] [log] [blame]
library mustache;
import 'dart:mirrors';
part 'char_reader.dart';
part 'scanner.dart';
part 'template.dart';
part 'template_renderer.dart';
/// [Mustache template documentation](http://mustache.github.com/mustache.5.html)
/// Returns a [Template] which can be used to render the mustache template
/// with substituted values.
/// Tag names may only contain characters a-z, A-Z, 0-9, underscore, and minus,
/// unless lenient mode is specified.
/// Throws [FormatException] if the syntax of the source is invalid.
Template parse(String source,
{bool lenient : false}) => _parse(source, lenient: lenient);
/// A Template can be rendered multiple times with different values.
abstract class Template {
/// [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, 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, bool htmlEscapeValues : true});
}
//TODO consider using FormatException, which prints nicer error messages.
/// MustacheFormatException is used to obtain the line and column numbers
/// of the token which caused parse or render to fail.
class MustacheFormatException implements Exception {
final String message;
/// The 1-based line number of the token where formatting error was found.
final int line;
/// The 1-based column number of the token where formatting error was found.
final int column;
MustacheFormatException(this.message, this.line, this.column);
String toString() => message;
}
//TODO does this require some sort of context to find partials nested in subdirs?
typedef Template PartialResolver(String templateName);
// Required for handing partials
abstract class TemplateRenderer {
factory TemplateRenderer(PartialResolver partialResolver,
{bool lenient, bool htmlEscapeValues}) = _TemplateRenderer;
String renderString(String templateName, values);
void render(String templateName, values, StringSink sink);
}