This commit is contained in:
Tobe O 2018-04-03 11:13:37 -04:00
parent 919c9915dd
commit 1ebef65a60
3 changed files with 58 additions and 6 deletions

View file

@ -1,3 +1,8 @@
# 1.0.2
* Use `package:dart2_constant`.
* Upgrade `package:symbol_table`.
* Added `Renderer.errorDocument`.
# 1.0.1
* Reworked the scanner; thereby fixing an extremely pesky bug
that prevented successful parsing of Jael files containing

View file

@ -1,5 +1,5 @@
import 'dart:convert';
import 'package:code_buffer/code_buffer.dart';
import 'package:dart2_constant/convert.dart';
import 'package:symbol_table/symbol_table.dart';
import 'ast/ast.dart';
import 'text/parser.dart';
@ -29,12 +29,58 @@ Document parseDocument(String text,
class Renderer {
const Renderer();
/// Render an error page.
static void errorDocument(Iterable<JaelError> errors, CodeBuffer buf) {
buf
..writeln('<!DOCTYPE html>')
..writeln('<html lang="en">')
..indent()
..writeln('<head>')
..indent()
..writeln(
'<meta name="viewport" content="width=device-width, initial-scale=1">',
)
..writeln('<title>${errors.length} Error(s)</title>')
..outdent()
..writeln('</head>')
..writeln('<body>')
..writeln('<h1>${errors.length} Error(s)</h1>')
..writeln('<ul>')
..indent();
for (var error in errors) {
var type =
error.severity == JaelErrorSeverity.warning ? 'warning' : 'error';
buf
..writeln('<li>')
..indent()
..writeln(
'<b>$type:</b> ${error.span.start.toolString}: ${error.message}')
..writeln('<br>')
..writeln(
'<span style="color: red;">' +
htmlEscape
.convert(error.span.highlight(color: false))
.replaceAll('\n', '<br>') +
'</span>',
)
..outdent()
..writeln('</li>');
}
buf
..outdent()
..writeln('</ul>')
..writeln('</body>')
..writeln('</html>');
}
/// Renders a [document] into the [buffer] as HTML.
///
/// If [strictResolution] is `false` (default: `true`), then undefined identifiers will return `null`
/// instead of throwing.
void render(Document document, CodeBuffer buffer, SymbolTable scope, {bool strictResolution: true}) {
scope.add('!strict!', value: strictResolution != false);
scope.create('!strict!', value: strictResolution != false);
if (document.doctype != null) buffer.writeln(document.doctype.span.text);
renderElement(
@ -87,7 +133,7 @@ class Renderer {
msg = value.toString();
}
buffer.write(attribute.isRaw ? msg : HTML_ESCAPE.convert(msg));
buffer.write(attribute.isRaw ? msg : htmlEscape.convert(msg));
buffer.write('"');
}
@ -175,7 +221,7 @@ class Renderer {
void renderDeclare(
Element element, CodeBuffer buffer, SymbolTable scope, bool html5) {
for (var attribute in element.attributes) {
scope.add(attribute.name,
scope.create(attribute.name,
value: attribute.value?.compute(scope), constant: true);
}
@ -239,7 +285,7 @@ class Renderer {
if (child.isRaw)
buffer.write(value);
else
buffer.write(HTML_ESCAPE.convert(value.toString()));
buffer.write(htmlEscape.convert(value.toString()));
}
} else if (child is Element) {
if (buffer?.lastLine?.text?.isNotEmpty == true) buffer.writeln();

View file

@ -1,5 +1,5 @@
name: jael
version: 1.0.1
version: 1.0.2
description: A simple server-side HTML templating engine for Dart.
author: Tobe O <thosakwe@gmail.com>
homepage: https://github.com/angel-dart/jael/tree/master/jael
@ -8,6 +8,7 @@ environment:
dependencies:
charcode: ^1.0.0
code_buffer: ^1.0.0
dart2_constant: ^1.0.0
source_span: ^1.0.0
string_scanner: ^1.0.0
symbol_table: ^1.0.0