2017-09-30 23:01:30 +00:00
|
|
|
import 'dart:convert';
|
|
|
|
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>{};
|
2017-09-30 23:01:30 +00:00
|
|
|
fileExtension ??= '.jl';
|
|
|
|
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();
|
|
|
|
var scope = new SymbolTable(values: locals ?? {});
|
|
|
|
|
|
|
|
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();
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|