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,