diff --git a/lib/utils/html_to_json/element_builders.dart b/lib/utils/html_to_json/element_builders.dart index 176b28a..a27e661 100644 --- a/lib/utils/html_to_json/element_builders.dart +++ b/lib/utils/html_to_json/element_builders.dart @@ -147,3 +147,13 @@ class Iframe implements Node { @override String get type => "iframe"; } + +class Table implements Node { + // имплементирует ноду чтобы не применялись оптимизаци + List> rows; + + Table(this.rows); + + @override + String get type => "table"; +} diff --git a/lib/utils/html_to_json/transformer.dart b/lib/utils/html_to_json/transformer.dart index 75a389d..fa7a04c 100644 --- a/lib/utils/html_to_json/transformer.dart +++ b/lib/utils/html_to_json/transformer.dart @@ -173,8 +173,7 @@ List prepareChildrenHtmlBlocElement(dom.Element element) { if (block.children.isEmpty) continue; if (block.children.length == 1) { final child = block.children[0]; - if (child is TextSpan && child.text.trim().isEmpty) - continue; + if (child is TextSpan && child.text.trim().isEmpty) continue; } } children.add(block); @@ -233,6 +232,8 @@ Node prepareHtmlBlocElement(dom.Element element) { case 'body': case 'div': case 'li': + case 'th': + case 'td': if (element.classes.contains('spoiler')) { return Details( element.getElementsByClassName('spoiler_title')[0].text, @@ -242,6 +243,8 @@ Node prepareHtmlBlocElement(dom.Element element) { } else if (element.classes.contains('tm-iframe_temp')) { final src = element.attributes['data-src']; return Iframe(src); + } else if (element.classes.contains('scrollable-table')) { + return Scrollable(prepareHtmlBlocElement(element.children.first)); } else { return BlockColumn(prepareChildrenHtmlBlocElement(element)); } @@ -266,6 +269,14 @@ Node prepareHtmlBlocElement(dom.Element element) { case 'iframe': final src = element.attributes['src']; return Iframe(src); + case 'table': + final rows = >[]; + for (final tableItems in element.children) { + for (final elementsRow in tableItems.children) { + rows.add(elementsRow.children.map(prepareHtmlBlocElement).toList()); + } + } + return Table(rows); default: print('Not found case for ${element.localName}'); throw UnsupportedError('${element.localName} not supported'); diff --git a/lib/widgets/html_view.dart b/lib/widgets/html_view.dart index 31a067a..c84d5fd 100644 --- a/lib/widgets/html_view.dart +++ b/lib/widgets/html_view.dart @@ -41,7 +41,7 @@ class HtmlView extends StatelessWidget { Widget widget; if (element is view.HeadLine) { final mode = - HeadLineType.values[int.parse(element.mode.substring(1)) - 1]; + HeadLineType.values[int.parse(element.mode.substring(1)) - 1]; widget = HeadLine(text: element.text, type: mode); } else if (element is view.TextParagraph) { widget = Text( @@ -70,10 +70,7 @@ class HtmlView extends StatelessWidget { widget = WrappedContainer( children: [ widget, - Text(element.caption, style: Theme - .of(context) - .textTheme - .subtitle2) + Text(element.caption, style: Theme.of(context).textTheme.subtitle2) ], distance: 5, ); @@ -110,6 +107,16 @@ class HtmlView extends StatelessWidget { widget = Iframe( src: element.src, ); + } else if (element is view.Table) { + widget = Table( + defaultColumnWidth: IntrinsicColumnWidth(), + border: TableBorder.all(color: Theme.of(context).textTheme.bodyText2.color), + children: element.rows + .map((row) => TableRow( + children: + row.map((child) => TableCell(child: Padding(padding: EdgeInsets.all(5),child: buildTree(child, context)))).toList())) + .toList(), + ); } else { logInfo("Not found case for $type"); }