Skip to content

Commit

Permalink
v2.1.3
Browse files Browse the repository at this point in the history
- `DOMNode`:
  - `buildHTML`: added parameter `buildTemplates = false`.
- `TemplateNode`:
  - `buildHTML`:
    - respect `buildTemplates` parameter.
    - pass `domContext` to `build` calls.
- html: ^0.15.2
- swiss_knife: ^3.1.3
- lints: ^2.0.1
- test: ^1.23.1
- coverage: ^1.6.3
  • Loading branch information
gmpassos committed Mar 21, 2023
1 parent b392255 commit 7ca68a4
Show file tree
Hide file tree
Showing 8 changed files with 110 additions and 19 deletions.
16 changes: 15 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
## 2.1.3

- `DOMNode`:
- `buildHTML`: added parameter `buildTemplates = false`.
- `TemplateNode`:
- `buildHTML`:
- respect `buildTemplates` parameter.
- pass `domContext` to `build` calls.
- html: ^0.15.2
- swiss_knife: ^3.1.3
- lints: ^2.0.1
- test: ^1.23.1
- coverage: ^1.6.3

## 2.1.2

- `$button`: Added `name` and `disabled`.
Expand Down Expand Up @@ -203,7 +217,7 @@

- `DOMNodeRuntime`: Can manipulate CSS/style.
- Added `DOMContext` and `Viewport` for `DOMGenerator`.
- `CSS`: now is capable to convert viewport units to pixel units, based into [DOMContext] [Viewport].
- `CSS`: now is capable to convert viewport units to pixel units, based into [DOMContext] and [Viewport].
- Better `CSSLength`, `CSSBorder`, `CSSColorRGB`, `CSSColorHEX` and `CSSURL` parsing.
- swiss_knife: ^2.5.12

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[![pub package](https://img.shields.io/pub/v/dom_builder.svg?logo=dart&logoColor=00b9fc)](https://pub.dartlang.org/packages/dom_builder)
[![Null Safety](https://img.shields.io/badge/null-safety-brightgreen)](https://dart.dev/null-safety)
[![CI](https://img.shields.io/github/workflow/status/gmpassos/dom_builder/Dart%20CI/master?logo=github-actions&logoColor=white)](https://github.com/gmpassos/dom_builder/actions)
[![Dart CI](https://github.com/gmpassos/dom_builder/actions/workflows/dart.yml/badge.svg?branch=master)](https://github.com/gmpassos/dom_builder/actions/workflows/dart.yml)
[![GitHub Tag](https://img.shields.io/github/v/tag/gmpassos/dom_builder?logo=git&logoColor=white)](https://github.com/gmpassos/dom_builder/releases)
[![New Commits](https://img.shields.io/github/commits-since/gmpassos/dom_builder/latest?logo=git&logoColor=white)](https://github.com/gmpassos/dom_builder/network)
[![Last Commits](https://img.shields.io/github/last-commit/gmpassos/dom_builder?logo=git&logoColor=white)](https://github.com/gmpassos/dom_builder/commits/master)
Expand Down
3 changes: 2 additions & 1 deletion lib/src/dom_builder_attribute.dart
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,8 @@ class DOMAttributeValueTemplate extends DOMAttributeValueString {
return super.getAttributeValue(domContext);
} else {
var build = template.build(domContext,
elementProvider: (q) => treeMap?.queryElement(q),
elementProvider: (q) => treeMap?.queryElement(q,
domContext: domContext, buildTemplates: true),
intlMessageResolver: domContext.intlMessageResolver);

if (build == null) {
Expand Down
62 changes: 58 additions & 4 deletions lib/src/dom_builder_base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,7 @@ class DOMNode implements AsDOMNode {
bool disableIndent = false,
bool xhtml = false,
bool resolveDSX = false,
bool buildTemplates = false,
DOMNode? parentNode,
DOMNode? previousNode,
DOMContext? domContext}) {
Expand All @@ -353,6 +354,8 @@ class DOMNode implements AsDOMNode {
indent: indent,
disableIndent: disableIndent,
xhtml: xhtml,
resolveDSX: resolveDSX,
buildTemplates: buildTemplates,
parentNode: parentNode,
previousNode: prev,
domContext: domContext);
Expand Down Expand Up @@ -1288,6 +1291,7 @@ class TextNode extends DOMNode implements WithValue {
bool disableIndent = false,
bool xhtml = false,
bool resolveDSX = false,
bool buildTemplates = false,
DOMNode? parentNode,
DOMNode? previousNode,
DOMContext? domContext}) {
Expand Down Expand Up @@ -1425,23 +1429,45 @@ class TemplateNode extends DOMNode implements WithValue {
bool disableIndent = false,
bool xhtml = false,
bool resolveDSX = false,
bool buildTemplates = false,
DOMNode? parentNode,
DOMNode? previousNode,
DOMContext? domContext}) {
var text = this.text;
String? html;

if (resolveDSX) {
if (template.isDSX) {
text = template.build(domContext) ?? '';
html = template.buildAsString(domContext,
resolveDSX: true,
intlMessageResolver: domContext?.intlMessageResolver);
} else if (template.hasDSX) {
var template2 = template.copy(resolveDSX: true);
text = template2.toString();

if (buildTemplates) {
var built = template2.build(domContext,
asElement: false,
resolveDSX: true,
intlMessageResolver: domContext?.intlMessageResolver);
html = DOMTemplate.objectToString(built);
} else {
html = template2.toString();
}
}
}

if (html == null) {
if (buildTemplates) {
html = template.buildAsString(domContext,
resolveDSX: resolveDSX,
intlMessageResolver: domContext?.intlMessageResolver);
} else {
html = text;
}
}

var nbsp = xhtml ? ' ' : ' ';

return text.replaceAll('\xa0', nbsp);
return html.replaceAll('\xa0', nbsp);
}

@override
Expand Down Expand Up @@ -2384,9 +2410,35 @@ class DOMElement extends DOMNode implements AsDOMElement {
bool disableIndent = false,
bool xhtml = false,
bool resolveDSX = false,
bool buildTemplates = false,
DOMNode? parentNode,
DOMNode? previousNode,
DOMContext? domContext}) {
if (buildTemplates && hasUnresolvedTemplate) {
var htmlUnresolvedTemplate =
buildHTML(withIndent: true, buildTemplates: false, resolveDSX: false);

var template = DOMTemplate.tryParse(htmlUnresolvedTemplate);

if (template != null) {
var templateNode = TemplateNode(template);

var html = templateNode.buildHTML(
withIndent: withIndent,
parentIndent: parentIndent,
indent: indent,
disableIndent: disableIndent,
xhtml: xhtml,
resolveDSX: resolveDSX,
buildTemplates: true,
parentNode: parentNode,
previousNode: previousNode,
domContext: domContext);

return html;
}
}

if (!disableIndent && !_tagAllowsInnerIndent(tag)) {
disableIndent = true;
}
Expand Down Expand Up @@ -2431,6 +2483,7 @@ class DOMElement extends DOMNode implements AsDOMElement {
disableIndent: disableIndent,
xhtml: xhtml,
resolveDSX: resolveDSX,
buildTemplates: buildTemplates,
parentNode: this,
previousNode: prev,
domContext: domContext);
Expand Down Expand Up @@ -2701,6 +2754,7 @@ class ExternalElementNode extends DOMNode {
bool disableIndent = false,
bool xhtml = false,
bool resolveDSX = false,
bool buildTemplates = false,
DOMNode? parentNode,
DOMNode? previousNode,
DOMContext? domContext}) {
Expand Down
4 changes: 3 additions & 1 deletion lib/src/dom_builder_template.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ abstract class DOMTemplate {
} else if (o is String) {
return o;
} else if (o is DOMNode) {
return o.buildHTML();
return o.buildHTML(buildTemplates: false);
} else if (o is Iterable) {
return o.map(objectToString).join('');
} else if (o is Map) {
Expand Down Expand Up @@ -746,6 +746,8 @@ class DOMTemplateIntlMessage extends DOMTemplateNode {
} else if (context is Map) {
parameters =
context.map((key, value) => MapEntry('$key', value as dynamic));
} else if (context is DOMContext) {
parameters = context.variables;
}

var s = intlMessageResolver(key, parameters);
Expand Down
8 changes: 5 additions & 3 deletions lib/src/dom_builder_treemap.dart
Original file line number Diff line number Diff line change
Expand Up @@ -316,19 +316,21 @@ class DOMTreeMap<T> {
}

static final RegExp regexpTagRef =
RegExp(r'\{\{\s*([\w-]+|\*)\#([\w-]+)\s*\}\}');
RegExp(r'\{\{\s*([\w-]+|\*)#([\w-]+)\s*\}\}');
static final RegExp regexpTagOpen =
RegExp(r'''^\s*<[\w-]+\s(?:".*?"|'.*?'|\s+|[^>\s]+)*>''');
static final RegExp regexpTagClose = RegExp(r'''<\/[\w-]+\s*>\s*$''');

String? queryElement(String query) {
String? queryElement(String query,
{DOMContext? domContext, bool buildTemplates = false}) {
if (isEmptyString(query)) return null;

var rootDOMNode = this.rootDOMNode as DOMElement;

var node = rootDOMNode.select(query)!;

var html = node.buildHTML();
var html =
node.buildHTML(domContext: domContext, buildTemplates: buildTemplates);

html = html.replaceFirst(regexpTagOpen, '');
html = html.replaceFirst(regexpTagClose, '');
Expand Down
12 changes: 6 additions & 6 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
name: dom_builder
description: Generate and manipulate DOM elements (virtual or real), DSX (like JSX) and HTML declarations (Web and Native support).
version: 2.1.2
version: 2.1.3
homepage: https://github.com/gmpassos/dom_builder

environment:
sdk: '>=2.15.0 <3.0.0'

dependencies:
html: ^0.15.0
swiss_knife: ^3.1.1
html: ^0.15.2
swiss_knife: ^3.1.3
collection: ^1.17.0

dev_dependencies:
lints: ^2.0.0
test: ^1.17.10
lints: ^2.0.1
test: ^1.23.1
dependency_validator: ^3.2.2
coverage: ^1.5.0
coverage: ^1.6.3

#dependency_overrides:
# swiss_knife:
Expand Down
22 changes: 20 additions & 2 deletions test/dom_builder_template_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -546,11 +546,15 @@ void main() {

expect(clicks, isEmpty);

var context = DOMContext(
var contextAM = DOMContext(
intlMessageResolver: (k, [p]) => k.trim().toUpperCase(),
variables: {'period': 'am'});

var source2 = div.buildHTML(domContext: context);
var contextPM = DOMContext(
intlMessageResolver: (k, [p]) => k.trim().toUpperCase(),
variables: {'period': 'pm'});

var source2 = div.buildHTML(domContext: contextAM);

expectFilteredDSXFunction(
source2,
Expand All @@ -559,6 +563,20 @@ void main() {
'</div>',
);

var source3 = div.buildHTML(domContext: contextAM, buildTemplates: true);

expectFilteredDSXFunction(
source3,
'<div title="HI" onclick="{{__DSX__function_D}}"><b>morning</b></div>',
);

var source4 = div.buildHTML(domContext: contextPM, buildTemplates: true);

expectFilteredDSXFunction(
source4,
'<div title="HI" onclick="{{__DSX__function_D}}">afternoon</div>',
);

expect(clicks, isEmpty);

var template = DOMTemplate.parse(source2);
Expand Down

0 comments on commit 7ca68a4

Please sign in to comment.