diff --git a/lib/html_parser.dart b/lib/html_parser.dart index a3ed4cc88f..b4673c410a 100644 --- a/lib/html_parser.dart +++ b/lib/html_parser.dart @@ -1,6 +1,7 @@ import 'dart:collection'; import 'dart:math'; +import 'package:collection/collection.dart'; import 'package:csslib/parser.dart' as cssparser; import 'package:csslib/visitor.dart' as css; import 'package:flutter/gestures.dart'; @@ -285,7 +286,22 @@ class HtmlParser extends StatelessWidget { newContext: newContext, style: tree.style, shrinkWrap: context.parser.shrinkWrap, - children: tree.children.map((tree) => parseTree(newContext, tree)).toList(), + children: tree.children + .expandIndexed((i, childTree) => [ + if (shrinkWrap && + childTree.style.display == Display.BLOCK && + i > 0 && + tree.children[i - 1] is ReplacedElement) + TextSpan(text: "\n"), + parseTree(newContext, childTree), + if (shrinkWrap && + i != tree.children.length - 1 && + childTree.style.display == Display.BLOCK && + childTree.element?.localName != "html" && + childTree.element?.localName != "body") + TextSpan(text: "\n"), + ]) + .toList(), ), ); } else if (tree.style.display == Display.LIST_ITEM) { @@ -424,12 +440,10 @@ class HtmlParser extends StatelessWidget { child: StyledText( textSpan: TextSpan( style: newContext.style.generateTextStyle(), - children: tree.children - .map((tree) => parseTree(newContext, tree)) - .toList(), + children: tree.children.map((tree) => parseTree(newContext, tree)).toList(), ), style: newContext.style, - renderContext: context, + renderContext: newContext, ), ), ); @@ -437,8 +451,15 @@ class HtmlParser extends StatelessWidget { ///[tree] is an inline element. return TextSpan( style: newContext.style.generateTextStyle(), - children: - tree.children.map((tree) => parseTree(newContext, tree)).toList(), + children: tree.children + .expand((tree) => [ + parseTree(newContext, tree), + if (tree.style.display == Display.BLOCK && + tree.element?.localName != "html" && + tree.element?.localName != "body") + TextSpan(text: "\n"), + ]) + .toList(), ); } } @@ -827,7 +848,7 @@ class StyledText extends StatelessWidget { @override Widget build(BuildContext context) { return SizedBox( - width: calculateWidth(style.display, renderContext), + width: consumeExpandedBlock(style.display, renderContext), child: Text.rich( textSpan, style: style.generateTextStyle(), @@ -840,13 +861,10 @@ class StyledText extends StatelessWidget { ); } - double? calculateWidth(Display? display, RenderContext context) { + double? consumeExpandedBlock(Display? display, RenderContext context) { if ((display == Display.BLOCK || display == Display.LIST_ITEM) && !renderContext.parser.shrinkWrap) { return double.infinity; } - if (renderContext.parser.shrinkWrap) { - return MediaQuery.of(context.buildContext).size.width; - } return null; } } diff --git a/lib/src/replaced_element.dart b/lib/src/replaced_element.dart index 0a6a6eaff9..976da4f336 100644 --- a/lib/src/replaced_element.dart +++ b/lib/src/replaced_element.dart @@ -283,13 +283,13 @@ class MathElement extends ReplacedElement { required this.element, this.texStr, String name = "math", - }) : super(name: name, alignment: PlaceholderAlignment.middle, style: Style(), elementId: element.id); + }) : super(name: name, alignment: PlaceholderAlignment.middle, style: Style(display: Display.BLOCK), elementId: element.id); @override Widget toWidget(RenderContext context) { texStr = parseMathRecursive(element, r''); return Container( - width: MediaQuery.of(context.buildContext).size.width, + width: context.parser.shrinkWrap ? null : MediaQuery.of(context.buildContext).size.width, child: Math.tex( texStr ?? '', mathStyle: MathStyle.display,