platform/build_jael/lib/build_jael.dart

77 lines
1.8 KiB
Dart
Raw Normal View History

2018-04-03 15:14:11 +00:00
import 'dart:async';
import 'package:build/build.dart';
import 'package:code_buffer/code_buffer.dart';
import 'package:file/file.dart';
import 'package:jael/jael.dart' as jael;
2018-04-03 15:29:35 +00:00
import 'package:jael_preprocessor/jael_preprocessor.dart' as jael;
import 'package:symbol_table/symbol_table.dart';
Builder jaelBuilder(BuilderOptions options) => new JaelBuilder(options);
2018-04-03 15:14:11 +00:00
class JaelBuilder implements Builder {
final BuilderOptions options;
2018-04-03 15:29:35 +00:00
final List<jael.Patcher> patch;
2018-04-03 15:14:11 +00:00
2018-04-03 15:29:35 +00:00
const JaelBuilder(this.options, {this.patch: const []});
2018-04-03 15:14:11 +00:00
@override
Map<String, List<String>> get buildExtensions {
return {
'.jl': ['.html'],
};
}
@override
Future build(BuildStep buildStep) async {
CodeBuffer buf;
if (options.config['minify'] == true)
buf = new CodeBuffer(space: '', newline: '', trailingNewline: false);
else
buf = new CodeBuffer();
Directory dir;
var errors = <jael.JaelError>[];
var doc = await jael.parseDocument(
await buildStep.readAsString(buildStep.inputId),
sourceUrl: buildStep.inputId.uri,
onError: errors.add,
);
2018-04-03 15:29:35 +00:00
doc = await jael.resolve(
doc,
dir,
onError: errors.add,
patch: this.patch,
);
if (errors.isNotEmpty) {
jael.Renderer.errorDocument(errors, buf);
2018-04-03 15:32:19 +00:00
} else {
var scope = new SymbolTable(values: new Map.from(options.config));
try {
const jael.Renderer().render(
doc,
buf,
scope,
strictResolution: options.config['strict'] == true,
);
} on jael.JaelError catch (e) {
errors.add(e);
}
2018-04-03 15:29:35 +00:00
2018-04-03 15:32:19 +00:00
if (errors.isNotEmpty) {
jael.Renderer.errorDocument(errors, buf);
}
}
2018-04-03 15:29:35 +00:00
buildStep.writeAsString(
buildStep.inputId.changeExtension('.html'),
buf.toString(),
);
2018-04-03 15:14:11 +00:00
}
}