@@ -6,42 +6,64 @@ import 'package:contentful_rich_text/types/inlines.dart';
6
6
import 'package:contentful_rich_text/types/marks.dart' ;
7
7
import 'package:contentful_rich_text/types/types.dart' ;
8
8
import 'package:contentful_rich_text/widgets/heading.dart' ;
9
+ import 'package:contentful_rich_text/widgets/hr.dart' ;
9
10
import 'package:contentful_rich_text/widgets/list_item.dart' ;
10
11
import 'package:contentful_rich_text/widgets/ordered_list.dart' ;
12
+ import 'package:contentful_rich_text/widgets/paragraph.dart' ;
11
13
import 'package:contentful_rich_text/widgets/unordered_list.dart' ;
12
14
import 'package:flutter/material.dart' ;
13
15
import 'package:html_unescape/html_unescape_small.dart' ;
14
16
15
17
/// Contentful Rich Text widget
16
18
class ContentfulRichText {
17
19
RenderNode defaultNodeRenderers = RenderNode ({
18
- BLOCKS .PARAGRAPH .value: (node, next) => RichText (
19
- text: TextSpan (
20
- children: next (node['content' ]),
21
- ),
20
+ BLOCKS .PARAGRAPH .value: (node, next) => Paragraph (node, next),
21
+ BLOCKS .HEADING_1 .value: (node, next) => Heading (
22
+ level: BLOCKS .HEADING_1 ,
23
+ text: node['value' ],
24
+ content: node['content' ],
25
+ next: next,
26
+ ),
27
+ BLOCKS .HEADING_2 .value: (node, next) => Heading (
28
+ level: BLOCKS .HEADING_2 ,
29
+ text: node['value' ],
30
+ content: node['content' ],
31
+ next: next,
32
+ ),
33
+ BLOCKS .HEADING_3 .value: (node, next) => Heading (
34
+ level: BLOCKS .HEADING_3 ,
35
+ text: node['value' ],
36
+ content: node['content' ],
37
+ next: next,
38
+ ),
39
+ BLOCKS .HEADING_4 .value: (node, next) => Heading (
40
+ level: BLOCKS .HEADING_4 ,
41
+ text: node['value' ],
42
+ content: node['content' ],
43
+ next: next,
44
+ ),
45
+ BLOCKS .HEADING_5 .value: (node, next) => Heading (
46
+ level: BLOCKS .HEADING_5 ,
47
+ text: node['value' ],
48
+ content: node['content' ],
49
+ next: next,
50
+ ),
51
+ BLOCKS .HEADING_6 .value: (node, next) => Heading (
52
+ level: BLOCKS .HEADING_6 ,
53
+ text: node['value' ],
54
+ content: node['content' ],
55
+ next: next,
22
56
),
23
- BLOCKS .HEADING_1 .value: (node, next) =>
24
- Heading (level: BLOCKS .HEADING_1 , text: node['value' ], content: node['content' ]),
25
- BLOCKS .HEADING_2 .value: (node, next) =>
26
- Heading (level: BLOCKS .HEADING_2 , text: node['value' ], content: node['content' ]),
27
- BLOCKS .HEADING_3 .value: (node, next) =>
28
- Heading (level: BLOCKS .HEADING_3 , text: node['value' ], content: node['content' ]),
29
- BLOCKS .HEADING_4 .value: (node, next) =>
30
- Heading (level: BLOCKS .HEADING_4 , text: node['value' ], content: node['content' ]),
31
- BLOCKS .HEADING_5 .value: (node, next) =>
32
- Heading (level: BLOCKS .HEADING_5 , text: node['value' ], content: node['content' ]),
33
- BLOCKS .HEADING_6 .value: (node, next) =>
34
- Heading (level: BLOCKS .HEADING_6 , text: node['value' ], content: node['content' ]),
35
57
BLOCKS .EMBEDDED_ENTRY .value: (node, next) => Container (), // TODO: implement
36
- BLOCKS .UL_LIST .value: (node, next) => UnorderedList (node['content' ]),
37
- BLOCKS .OL_LIST .value: (node, next) => OrderedList (node['content' ]),
58
+ BLOCKS .UL_LIST .value: (node, next) => UnorderedList (node['content' ], next ),
59
+ BLOCKS .OL_LIST .value: (node, next) => OrderedList (node['content' ], next ),
38
60
BLOCKS .LIST_ITEM .value: (node, next) => ListItem (
39
61
text: node.value,
40
- // TODO: not sure we can use nodeType to determine the type of LIST_ITEM
41
62
type: node.nodeType == BLOCKS .OL_LIST .value ? LI_TYPE .ORDERED : LI_TYPE .UNORDERED ,
63
+ children: node['content' ],
42
64
),
43
65
BLOCKS .QUOTE .value: (node, next) => Container (), // TODO: implement
44
- BLOCKS .HR .value: (node, next) => Container (), // TODO: implement
66
+ BLOCKS .HR .value: (node, next) => Hr (),
45
67
INLINES .ASSET_HYPERLINK .value: (node, next) => defaultInline (INLINES .ASSET_HYPERLINK , node as Inline ),
46
68
INLINES .ENTRY_HYPERLINK .value: (node, next) => defaultInline (INLINES .ENTRY_HYPERLINK , node as Inline ),
47
69
INLINES .EMBEDDED_ENTRY .value: (node, next) => defaultInline (INLINES .EMBEDDED_ENTRY , node as Inline ),
@@ -87,15 +109,19 @@ class ContentfulRichText {
87
109
88
110
Widget nodeListToWidget (List <dynamic > nodes,
89
111
{Map <dynamic , Function > renderNode, Map <dynamic , TextStyle > renderMark}) {
90
- print ('nodeListToWidget ${nodes .length }' );
112
+ print ('nodeListToWidget ${nodes ? .length }' );
91
113
return Column (
92
- children: List <Widget >.from (
93
- nodes.map <Widget >((dynamic node) => nodeToWidget (
94
- node,
95
- renderNode: renderNode,
96
- renderMark: renderMark,
97
- )),
98
- ),
114
+ mainAxisAlignment: MainAxisAlignment .start,
115
+ crossAxisAlignment: CrossAxisAlignment .start,
116
+ children: nodes != null
117
+ ? List <Widget >.from (
118
+ nodes.map <Widget >((dynamic node) => nodeToWidget (
119
+ node,
120
+ renderNode: renderNode,
121
+ renderMark: renderMark,
122
+ )),
123
+ )
124
+ : [],
99
125
);
100
126
}
101
127
@@ -105,9 +131,11 @@ class ContentfulRichText {
105
131
Map <dynamic , TextStyle > renderMark,
106
132
}) {
107
133
print ('nodeToWidget entry $node ' );
134
+ print ('nodeToWidget nodeType ${node ['nodeType' ]}' );
108
135
if (Helpers .isText (node)) {
109
136
return RichText (text: _processTextNode (node, renderMark));
110
- } else if (Helpers .isParagraph (node)) {
137
+ } else if (Helpers .isParagraph (node) || Helpers .isHeader (node)) {
138
+ print ('isParagraph or Header: ${node ['nodeType' ]}' );
111
139
return renderNode[node['nodeType' ]](
112
140
node,
113
141
(nodes) => List <TextSpan >.from (nodes.map ((node) => _processTextNode (node, renderMark))),
0 commit comments