Skip to content

Commit 2a21971

Browse files
authored
Merge pull request Sub6Resources#688 from vrtdev/bugfix/565-shrinkwrap
Fix shrinkWrap by flowing the text to a new line for block elements
2 parents 749d75d + 942f0c1 commit 2a21971

File tree

2 files changed

+32
-14
lines changed

2 files changed

+32
-14
lines changed

lib/html_parser.dart

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:collection';
22
import 'dart:math';
33

4+
import 'package:collection/collection.dart';
45
import 'package:csslib/parser.dart' as cssparser;
56
import 'package:csslib/visitor.dart' as css;
67
import 'package:flutter/gestures.dart';
@@ -324,7 +325,22 @@ class HtmlParser extends StatelessWidget {
324325
newContext: newContext,
325326
style: tree.style,
326327
shrinkWrap: context.parser.shrinkWrap,
327-
children: tree.children.map((tree) => parseTree(newContext, tree)).toList(),
328+
children: tree.children
329+
.expandIndexed((i, childTree) => [
330+
if (shrinkWrap &&
331+
childTree.style.display == Display.BLOCK &&
332+
i > 0 &&
333+
tree.children[i - 1] is ReplacedElement)
334+
TextSpan(text: "\n"),
335+
parseTree(newContext, childTree),
336+
if (shrinkWrap &&
337+
i != tree.children.length - 1 &&
338+
childTree.style.display == Display.BLOCK &&
339+
childTree.element?.localName != "html" &&
340+
childTree.element?.localName != "body")
341+
TextSpan(text: "\n"),
342+
])
343+
.toList(),
328344
),
329345
);
330346
} else if (tree.style.display == Display.LIST_ITEM) {
@@ -458,21 +474,26 @@ class HtmlParser extends StatelessWidget {
458474
child: StyledText(
459475
textSpan: TextSpan(
460476
style: newContext.style.generateTextStyle(),
461-
children: tree.children
462-
.map((tree) => parseTree(newContext, tree))
463-
.toList(),
477+
children: tree.children.map((tree) => parseTree(newContext, tree)).toList(),
464478
),
465479
style: newContext.style,
466-
renderContext: context,
480+
renderContext: newContext,
467481
),
468482
),
469483
);
470484
} else {
471485
///[tree] is an inline element.
472486
return TextSpan(
473487
style: newContext.style.generateTextStyle(),
474-
children:
475-
tree.children.map((tree) => parseTree(newContext, tree)).toList(),
488+
children: tree.children
489+
.expand((tree) => [
490+
parseTree(newContext, tree),
491+
if (tree.style.display == Display.BLOCK &&
492+
tree.element?.localName != "html" &&
493+
tree.element?.localName != "body")
494+
TextSpan(text: "\n"),
495+
])
496+
.toList(),
476497
);
477498
}
478499
}
@@ -861,7 +882,7 @@ class StyledText extends StatelessWidget {
861882
@override
862883
Widget build(BuildContext context) {
863884
return SizedBox(
864-
width: calculateWidth(style.display, renderContext),
885+
width: consumeExpandedBlock(style.display, renderContext),
865886
child: Text.rich(
866887
textSpan,
867888
style: style.generateTextStyle(),
@@ -874,13 +895,10 @@ class StyledText extends StatelessWidget {
874895
);
875896
}
876897

877-
double? calculateWidth(Display? display, RenderContext context) {
898+
double? consumeExpandedBlock(Display? display, RenderContext context) {
878899
if ((display == Display.BLOCK || display == Display.LIST_ITEM) && !renderContext.parser.shrinkWrap) {
879900
return double.infinity;
880901
}
881-
if (renderContext.parser.shrinkWrap) {
882-
return MediaQuery.of(context.buildContext).size.width;
883-
}
884902
return null;
885903
}
886904
}

lib/src/replaced_element.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,13 +286,13 @@ class MathElement extends ReplacedElement {
286286
required this.element,
287287
this.texStr,
288288
String name = "math",
289-
}) : super(name: name, alignment: PlaceholderAlignment.middle, style: Style(), elementId: element.id);
289+
}) : super(name: name, alignment: PlaceholderAlignment.middle, style: Style(display: Display.BLOCK), elementId: element.id);
290290

291291
@override
292292
Widget toWidget(RenderContext context) {
293293
texStr = parseMathRecursive(element, r'');
294294
return Container(
295-
width: MediaQuery.of(context.buildContext).size.width,
295+
width: context.parser.shrinkWrap ? null : MediaQuery.of(context.buildContext).size.width,
296296
child: Math.tex(
297297
texStr ?? '',
298298
mathStyle: MathStyle.display,

0 commit comments

Comments
 (0)