From b9a8006b7da2c3c68dad49be7aa7d6f5daf1ba30 Mon Sep 17 00:00:00 2001 From: Alexandre Roux Date: Fri, 21 Feb 2025 16:57:35 +0100 Subject: [PATCH] add child helpers --- lib/src/html.dart | 51 +++++++++++++++++++++++++++++ lib/src/html5lib/html_html5lib.dart | 19 +++++++++++ lib/src/web/html_web.dart | 20 +++++++++++ test/element_test.dart | 39 ++++++++++++++++++++++ 4 files changed, 129 insertions(+) diff --git a/lib/src/html.dart b/lib/src/html.dart index c2df231..539cec6 100644 --- a/lib/src/html.dart +++ b/lib/src/html.dart @@ -259,6 +259,8 @@ abstract class HtmlProvider { Element createElementTag(String tag); Element createElementHtml(String html, {bool? noValidate}); + List createNodesHtml(String html, {bool? noValidate}); + List createElementsHtml(String html, {bool? noValidate}); Text createTextNode(String text); // wrap a native document @@ -279,3 +281,52 @@ abstract class HtmlProvider { // get the native element Object unwrapNode(Node node); } + +extension TekartikHtmlNodeExt on Node { + /// Append a text node + Text appendText(String text) { + var textNode = htmlProvider.createTextNode(text); + appendChild(textNode); + return textNode; + } + + /// Apppend a lf + void appendLf() { + appendText('\n'); + } + + /// create a new element and append it + Element appendElementTag(String tag) { + var element = htmlProvider.createElementTag(tag); + appendChild(element); + return element; + } + + Element appendElementHtml(String html, {bool? noValidate}) { + var element = htmlProvider.createElementHtml(html, noValidate: noValidate); + appendChild(element); + return element; + } + + /// Trim inner nodes + List appendElementsHtml(String html, {bool? noValidate}) { + var elements = + htmlProvider.createElementsHtml(html, noValidate: noValidate); + appendChildren(elements); + return elements; + } + + /// Trim inner nodes + List appendChildren(List children) { + for (var element in children) { + appendChild(element); + } + return children; + } + + /// Append nodes as is + List appendNodesHtml(String html, {bool? noValidate}) { + var nodes = htmlProvider.createNodesHtml(html, noValidate: noValidate); + return appendChildren(nodes); + } +} diff --git a/lib/src/html5lib/html_html5lib.dart b/lib/src/html5lib/html_html5lib.dart index f7579d9..6481768 100644 --- a/lib/src/html5lib/html_html5lib.dart +++ b/lib/src/html5lib/html_html5lib.dart @@ -579,6 +579,25 @@ class _HtmlProviderHtml5Lib extends HtmlProvider return _ElementHtml5lib.from(html5lib.Element.html(html))!; } + @override + List createNodesHtml(String html, {bool? noValidate}) { + // noValidate is implicit when using html5 lib + return _createParentDivElement(html, noValidate: noValidate).childNodes; + } + + @override + List createElementsHtml(String html, {bool? noValidate}) { + // noValidate is implicit when using html5 lib + return _createParentDivElement(html, noValidate: noValidate) + .children + .toList(); + } + + Element _createParentDivElement(String html, {bool? noValidate}) { + // noValidate is implicit when using html5 lib + return createElementHtml('
$html
', noValidate: noValidate); + } + @override String get name => providerHtml5LibName; diff --git a/lib/src/web/html_web.dart b/lib/src/web/html_web.dart index 2c41494..27081e7 100644 --- a/lib/src/web/html_web.dart +++ b/lib/src/web/html_web.dart @@ -414,6 +414,26 @@ class _HtmlProviderWeb implements HtmlProviderWeb { }); } + @override + List createNodesHtml(String html, {bool? noValidate}) { + // noValidate is implicit when using html5 lib + var div = _createParentDivHtml(html, noValidate: noValidate); + return div.childNodes; + } + + Element _createParentDivHtml(String html, {bool? noValidate}) { + // noValidate is implicit when using html5 lib + var div = createElementHtml('
$html
', noValidate: noValidate); + return div; + } + + @override + List createElementsHtml(String html, {bool? noValidate}) { + // noValidate is implicit when using html5 lib + var div = _createParentDivHtml(html, noValidate: noValidate); + return div.children.toList(); + } + @override Element createElementTag(String tag) => _Element(web.window.document.createElement(tag)); diff --git a/test/element_test.dart b/test/element_test.dart index cdf9356..acab263 100644 --- a/test/element_test.dart +++ b/test/element_test.dart @@ -135,6 +135,45 @@ void testMain(HtmlProvider html) { expect(element.children.length, 2); } }); + test('noscript', () { + final element = html.createElementHtml(''); + expect(element.tagName, 'noscript'); + }); + test('meta', () { + final element = html.createElementHtml(''); + expect(element.tagName, 'meta'); + }); + test('link', () { + final element = html.createElementHtml( + ''); + expect(element.tagName, 'link'); + }); + test('multi', () { + final nodes = html.createNodesHtml( + '\n\n' + '' + '\n'); + expect(nodes.length, 6); + var elements = html.createElementsHtml( + '\n\n' + '' + '\n'); + expect(elements.length, 3); + }); + test('extension', () { + var ul = html.createElementTag('ul'); + for (var text in ['monday', 'tuesday', 'wednesday']) { + var li = html.createElementTag('li'); + li.text = text; + ul.append(li); + ul.appendLf(); + } + expect(ul.outerHtml, ''' +
  • monday
  • +
  • tuesday
  • +
  • wednesday
  • +
'''); + }); test('custom_no_validate', () { final element = html.createElementHtml( '
',