Skip to content

Commit b8c981e

Browse files
committed
add tables in html view
1 parent 7c51e66 commit b8c981e

File tree

3 files changed

+35
-7
lines changed

3 files changed

+35
-7
lines changed

lib/utils/html_to_json/element_builders.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,13 @@ class Iframe implements Node {
147147
@override
148148
String get type => "iframe";
149149
}
150+
151+
class Table implements Node {
152+
// имплементирует ноду чтобы не применялись оптимизаци
153+
List<List<Node>> rows;
154+
155+
Table(this.rows);
156+
157+
@override
158+
String get type => "table";
159+
}

lib/utils/html_to_json/transformer.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,7 @@ List<Node> prepareChildrenHtmlBlocElement(dom.Element element) {
173173
if (block.children.isEmpty) continue;
174174
if (block.children.length == 1) {
175175
final child = block.children[0];
176-
if (child is TextSpan && child.text.trim().isEmpty)
177-
continue;
176+
if (child is TextSpan && child.text.trim().isEmpty) continue;
178177
}
179178
}
180179
children.add(block);
@@ -233,6 +232,8 @@ Node prepareHtmlBlocElement(dom.Element element) {
233232
case 'body':
234233
case 'div':
235234
case 'li':
235+
case 'th':
236+
case 'td':
236237
if (element.classes.contains('spoiler')) {
237238
return Details(
238239
element.getElementsByClassName('spoiler_title')[0].text,
@@ -242,6 +243,8 @@ Node prepareHtmlBlocElement(dom.Element element) {
242243
} else if (element.classes.contains('tm-iframe_temp')) {
243244
final src = element.attributes['data-src'];
244245
return Iframe(src);
246+
} else if (element.classes.contains('scrollable-table')) {
247+
return Scrollable(prepareHtmlBlocElement(element.children.first));
245248
} else {
246249
return BlockColumn(prepareChildrenHtmlBlocElement(element));
247250
}
@@ -266,6 +269,14 @@ Node prepareHtmlBlocElement(dom.Element element) {
266269
case 'iframe':
267270
final src = element.attributes['src'];
268271
return Iframe(src);
272+
case 'table':
273+
final rows = <List<Node>>[];
274+
for (final tableItems in element.children) {
275+
for (final elementsRow in tableItems.children) {
276+
rows.add(elementsRow.children.map(prepareHtmlBlocElement).toList());
277+
}
278+
}
279+
return Table(rows);
269280
default:
270281
print('Not found case for ${element.localName}');
271282
throw UnsupportedError('${element.localName} not supported');

lib/widgets/html_view.dart

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class HtmlView extends StatelessWidget {
4141
Widget widget;
4242
if (element is view.HeadLine) {
4343
final mode =
44-
HeadLineType.values[int.parse(element.mode.substring(1)) - 1];
44+
HeadLineType.values[int.parse(element.mode.substring(1)) - 1];
4545
widget = HeadLine(text: element.text, type: mode);
4646
} else if (element is view.TextParagraph) {
4747
widget = Text(
@@ -70,10 +70,7 @@ class HtmlView extends StatelessWidget {
7070
widget = WrappedContainer(
7171
children: [
7272
widget,
73-
Text(element.caption, style: Theme
74-
.of(context)
75-
.textTheme
76-
.subtitle2)
73+
Text(element.caption, style: Theme.of(context).textTheme.subtitle2)
7774
],
7875
distance: 5,
7976
);
@@ -110,6 +107,16 @@ class HtmlView extends StatelessWidget {
110107
widget = Iframe(
111108
src: element.src,
112109
);
110+
} else if (element is view.Table) {
111+
widget = Table(
112+
defaultColumnWidth: IntrinsicColumnWidth(),
113+
border: TableBorder.all(color: Theme.of(context).textTheme.bodyText2.color),
114+
children: element.rows
115+
.map((row) => TableRow(
116+
children:
117+
row.map((child) => TableCell(child: Padding(padding: EdgeInsets.all(5),child: buildTree(child, context)))).toList()))
118+
.toList(),
119+
);
113120
} else {
114121
logInfo("Not found case for $type");
115122
}

0 commit comments

Comments
 (0)