@@ -2,16 +2,20 @@ import 'package:flutter/material.dart';
2
2
import 'package:html/parser.dart' as parser;
3
3
import 'package:html/dom.dart' as dom;
4
4
5
+ typedef CustomRender = Widget Function (dom.Node node, List <Widget > children);
6
+
5
7
class HtmlParser {
6
8
HtmlParser ({
7
9
@required this .width,
8
10
this .onLinkTap,
9
11
this .renderNewlines = false ,
12
+ this .customRender,
10
13
});
11
14
12
15
final double width;
13
16
final Function onLinkTap;
14
17
final bool renderNewlines;
18
+ final CustomRender customRender;
15
19
16
20
static const _supportedElements = [
17
21
"a" ,
@@ -93,21 +97,39 @@ class HtmlParser {
93
97
List <Widget > widgetList = new List <Widget >();
94
98
95
99
if (renderNewlines) {
96
- print ("Before: $data " );
100
+ assert (() {
101
+ print ("Before: $data " );
102
+ return true ;
103
+ }());
97
104
data = data.replaceAll ("\n " , "<br />" );
98
- print ("After: $data " );
105
+ assert (() {
106
+ print ("After: $data " );
107
+ }());
99
108
}
100
109
dom.Document document = parser.parse (data);
101
110
widgetList.add (_parseNode (document.body));
102
111
return widgetList;
103
112
}
104
113
105
114
Widget _parseNode (dom.Node node) {
115
+ if (customRender != null ) {
116
+ final Widget customWidget =
117
+ customRender (node, _parseNodeList (node.nodes));
118
+ if (customWidget != null ) {
119
+ return customWidget;
120
+ }
121
+ }
122
+
106
123
if (node is dom.Element ) {
107
- print ("Found ${node .localName }" );
124
+ assert (() {
125
+ print ("Found ${node .localName }" );
126
+ return true ;
127
+ }());
128
+
108
129
if (! _supportedElements.contains (node.localName)) {
109
130
return Container ();
110
131
}
132
+
111
133
switch (node.localName) {
112
134
case "a" :
113
135
return GestureDetector (
0 commit comments