switch
This commit is contained in:
parent
a8a45940ed
commit
a5204161b9
3 changed files with 103 additions and 2 deletions
|
@ -46,6 +46,9 @@ class Renderer {
|
||||||
} else if (element.tagName.name == 'declare') {
|
} else if (element.tagName.name == 'declare') {
|
||||||
renderDeclare(element, buffer, childScope, html5);
|
renderDeclare(element, buffer, childScope, html5);
|
||||||
return;
|
return;
|
||||||
|
} else if (element.tagName.name == 'switch') {
|
||||||
|
renderSwitch(element, buffer, childScope, html5);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer..write('<')..write(element.tagName.name);
|
buffer..write('<')..write(element.tagName.name);
|
||||||
|
@ -161,7 +164,8 @@ class Renderer {
|
||||||
renderElement(strippedElement, buffer, scope, html5);
|
renderElement(strippedElement, buffer, scope, html5);
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderDeclare(Element element, CodeBuffer buffer, SymbolTable scope, bool html5) {
|
void renderDeclare(
|
||||||
|
Element element, CodeBuffer buffer, SymbolTable scope, bool html5) {
|
||||||
for (var attribute in element.attributes) {
|
for (var attribute in element.attributes) {
|
||||||
scope.add(attribute.name,
|
scope.add(attribute.name,
|
||||||
value: attribute.value?.compute(scope), constant: true);
|
value: attribute.value?.compute(scope), constant: true);
|
||||||
|
@ -174,6 +178,43 @@ class Renderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void renderSwitch(
|
||||||
|
Element element, CodeBuffer buffer, SymbolTable scope, bool html5) {
|
||||||
|
var value = element.attributes
|
||||||
|
.firstWhere((a) => a.name == 'value', orElse: () => null)
|
||||||
|
?.value
|
||||||
|
?.compute(scope);
|
||||||
|
|
||||||
|
var cases =
|
||||||
|
element.children.where((c) => c is Element && c.tagName.name == 'case');
|
||||||
|
|
||||||
|
for (Element child in cases) {
|
||||||
|
var comparison = child.attributes
|
||||||
|
.firstWhere((a) => a.name == 'value', orElse: () => null)
|
||||||
|
?.value
|
||||||
|
?.compute(scope);
|
||||||
|
if (comparison == value) {
|
||||||
|
for (int i = 0; i < child.children.length; i++) {
|
||||||
|
var c = child.children.elementAt(i);
|
||||||
|
renderElementChild(c, buffer, scope, html5, i, child.children.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Element defaultCase = element.children.firstWhere(
|
||||||
|
(c) => c is Element && c.tagName.name == 'default',
|
||||||
|
orElse: () => null);
|
||||||
|
if (defaultCase != null) {
|
||||||
|
for (int i = 0; i < defaultCase.children.length; i++) {
|
||||||
|
var child = defaultCase.children.elementAt(i);
|
||||||
|
renderElementChild(
|
||||||
|
child, buffer, scope, html5, i, defaultCase.children.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void renderElementChild(ElementChild child, CodeBuffer buffer,
|
void renderElementChild(ElementChild child, CodeBuffer buffer,
|
||||||
SymbolTable scope, bool html5, int index, int total) {
|
SymbolTable scope, bool html5, int index, int total) {
|
||||||
if (child is Text) {
|
if (child is Text) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: jael
|
name: jael
|
||||||
version: 1.0.0-alpha+4
|
version: 1.0.0-alpha+5
|
||||||
description: A simple server-side HTML templating engine for Dart.
|
description: A simple server-side HTML templating engine for Dart.
|
||||||
author: Tobe O <thosakwe@gmail.com>
|
author: Tobe O <thosakwe@gmail.com>
|
||||||
homepage: https://github.com/angel-dart/jael/tree/master/jael
|
homepage: https://github.com/angel-dart/jael/tree/master/jael
|
||||||
|
|
|
@ -266,6 +266,60 @@ main() {
|
||||||
'''
|
'''
|
||||||
.trim());
|
.trim());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('switch', () {
|
||||||
|
const template = '''
|
||||||
|
<switch value=account.isDisabled>
|
||||||
|
<case value=true>
|
||||||
|
BAN HAMMER LOLOL
|
||||||
|
</case>
|
||||||
|
<case value=false>
|
||||||
|
You are in good standing.
|
||||||
|
</case>
|
||||||
|
<default>
|
||||||
|
Weird...
|
||||||
|
</default>
|
||||||
|
</switch>
|
||||||
|
''';
|
||||||
|
|
||||||
|
var buf = new CodeBuffer();
|
||||||
|
var document = jael.parseDocument(template, sourceUrl: 'test.jl');
|
||||||
|
var scope = new SymbolTable(values: {
|
||||||
|
'account': new _Account(isDisabled: true),
|
||||||
|
});
|
||||||
|
|
||||||
|
const jael.Renderer().render(document, buf, scope);
|
||||||
|
print(buf);
|
||||||
|
|
||||||
|
expect(buf.toString().trim(), 'BAN HAMMER LOLOL');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('default', () {
|
||||||
|
const template = '''
|
||||||
|
<switch value=account.isDisabled>
|
||||||
|
<case value=true>
|
||||||
|
BAN HAMMER LOLOL
|
||||||
|
</case>
|
||||||
|
<case value=false>
|
||||||
|
You are in good standing.
|
||||||
|
</case>
|
||||||
|
<default>
|
||||||
|
Weird...
|
||||||
|
</default>
|
||||||
|
</switch>
|
||||||
|
''';
|
||||||
|
|
||||||
|
var buf = new CodeBuffer();
|
||||||
|
var document = jael.parseDocument(template, sourceUrl: 'test.jl');
|
||||||
|
var scope = new SymbolTable(values: {
|
||||||
|
'account': new _Account(isDisabled: null),
|
||||||
|
});
|
||||||
|
|
||||||
|
const jael.Renderer().render(document, buf, scope);
|
||||||
|
print(buf);
|
||||||
|
|
||||||
|
expect(buf.toString().trim(), 'Weird...');
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const List<_Pokemon> starters = const [
|
const List<_Pokemon> starters = const [
|
||||||
|
@ -279,3 +333,9 @@ class _Pokemon {
|
||||||
|
|
||||||
const _Pokemon(this.name, this.type);
|
const _Pokemon(this.name, this.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _Account {
|
||||||
|
final bool isDisabled;
|
||||||
|
|
||||||
|
_Account({this.isDisabled});
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue