platform/packages/jael/angel_jael/lib/angel_jael.dart

72 lines
2.3 KiB
Dart
Raw Permalink Normal View History

2017-09-30 23:01:30 +00:00
import 'package:angel_framework/angel_framework.dart';
import 'package:code_buffer/code_buffer.dart';
import 'package:file/file.dart';
import 'package:jael/jael.dart';
import 'package:jael_preprocessor/jael_preprocessor.dart';
import 'package:symbol_table/symbol_table.dart';
2017-10-01 03:14:44 +00:00
/// Configures an Angel server to use Jael to render templates.
///
/// To enable "minified" output, you need to override the [createBuffer] function,
/// to instantiate a [CodeBuffer] that emits no spaces or line breaks.
2017-10-02 16:12:51 +00:00
///
/// To apply additional transforms to parsed documents, provide a set of [patch] functions.
2017-09-30 23:01:30 +00:00
AngelConfigurer jael(Directory viewsDirectory,
2017-10-16 23:20:02 +00:00
{String fileExtension,
bool strictResolution: false,
bool cacheViews: false,
Iterable<Patcher> patch,
2018-06-26 15:31:34 +00:00
bool asDSX: false,
2017-10-16 23:20:02 +00:00
CodeBuffer createBuffer()}) {
2017-10-01 03:14:44 +00:00
var cache = <String, Document>{};
2018-11-10 21:48:03 +00:00
fileExtension ??= '.jael';
2017-09-30 23:01:30 +00:00
createBuffer ??= () => new CodeBuffer();
return (Angel app) async {
app.viewGenerator = (String name, [Map locals]) async {
var errors = <JaelError>[];
2017-10-01 03:14:44 +00:00
Document processed;
if (cacheViews == true && cache.containsKey(name)) {
processed = cache[name];
} else {
var file = viewsDirectory.childFile(name + fileExtension);
var contents = await file.readAsString();
2018-06-26 15:31:34 +00:00
var doc = parseDocument(contents,
sourceUrl: file.uri, asDSX: asDSX == true, onError: errors.add);
2017-10-01 03:14:44 +00:00
processed = doc;
try {
2017-10-16 23:20:02 +00:00
processed = await resolve(doc, viewsDirectory,
patch: patch, onError: errors.add);
2017-10-01 03:14:44 +00:00
} catch (_) {
// Ignore these errors, so that we can show syntax errors.
}
if (cacheViews == true) {
cache[name] = processed;
}
2017-09-30 23:01:30 +00:00
}
var buf = createBuffer();
2018-07-15 20:41:43 +00:00
var scope = new SymbolTable(
values: locals?.keys?.fold<Map<String, dynamic>>(<String, dynamic>{},
(out, k) => out..[k.toString()] = locals[k]) ??
<String, dynamic>{});
2017-09-30 23:01:30 +00:00
if (errors.isEmpty) {
try {
2017-10-16 23:20:02 +00:00
const Renderer().render(processed, buf, scope,
strictResolution: strictResolution == true);
2017-09-30 23:01:30 +00:00
return buf.toString();
} on JaelError catch (e) {
errors.add(e);
}
}
2018-06-26 15:31:34 +00:00
Renderer.errorDocument(errors, buf..clear());
2017-09-30 23:01:30 +00:00
return buf.toString();
};
};
}