2017-07-23 15:50:37 +00:00
|
|
|
import 'dart:async';
|
|
|
|
import 'package:angel_framework/angel_framework.dart';
|
|
|
|
import 'package:html_builder/html_builder.dart';
|
|
|
|
|
|
|
|
/// Returns a [RequestMiddleware] that allows you to return `html_builder` [Node]s as responses.
|
|
|
|
///
|
|
|
|
/// You can provide a custom [renderer]. The default renders minified HTML5 pages.
|
|
|
|
///
|
|
|
|
/// Set [enforceAcceptHeader] to `true` to throw a `406 Not Acceptable` if the client doesn't accept HTML responses.
|
2019-01-06 18:11:11 +00:00
|
|
|
RequestHandler renderHtml({StringRenderer renderer, bool enforceAcceptHeader}) {
|
2017-07-23 15:50:37 +00:00
|
|
|
renderer ??= new StringRenderer(pretty: false, html5: true);
|
|
|
|
|
|
|
|
return (RequestContext req, ResponseContext res) {
|
|
|
|
var oldSerializer = res.serializer;
|
|
|
|
|
|
|
|
res.serializer = (data) {
|
|
|
|
if (data is! Node)
|
|
|
|
return oldSerializer(data);
|
|
|
|
else {
|
|
|
|
if (enforceAcceptHeader == true && !req.accepts('text/html'))
|
|
|
|
throw new AngelHttpException.notAcceptable();
|
|
|
|
|
2019-01-06 18:11:11 +00:00
|
|
|
var content = renderer.render(data as Node);
|
2017-07-23 15:50:37 +00:00
|
|
|
res
|
|
|
|
..headers['content-type'] = 'text/html'
|
2019-01-06 18:11:11 +00:00
|
|
|
..write(content);
|
|
|
|
res.close();
|
2017-07-23 15:50:37 +00:00
|
|
|
return '';
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return new Future<bool>.value(true);
|
|
|
|
};
|
|
|
|
}
|