1
1
import 'dart:collection' ;
2
2
import 'dart:math' ;
3
3
4
+ import 'package:collection/collection.dart' ;
4
5
import 'package:csslib/parser.dart' as cssparser;
5
6
import 'package:csslib/visitor.dart' as css;
6
7
import 'package:flutter/gestures.dart' ;
@@ -324,7 +325,22 @@ class HtmlParser extends StatelessWidget {
324
325
newContext: newContext,
325
326
style: tree.style,
326
327
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 (),
328
344
),
329
345
);
330
346
} else if (tree.style.display == Display .LIST_ITEM ) {
@@ -458,21 +474,26 @@ class HtmlParser extends StatelessWidget {
458
474
child: StyledText (
459
475
textSpan: TextSpan (
460
476
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 (),
464
478
),
465
479
style: newContext.style,
466
- renderContext: context ,
480
+ renderContext: newContext ,
467
481
),
468
482
),
469
483
);
470
484
} else {
471
485
///[tree] is an inline element.
472
486
return TextSpan (
473
487
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 (),
476
497
);
477
498
}
478
499
}
@@ -861,7 +882,7 @@ class StyledText extends StatelessWidget {
861
882
@override
862
883
Widget build (BuildContext context) {
863
884
return SizedBox (
864
- width: calculateWidth (style.display, renderContext),
885
+ width: consumeExpandedBlock (style.display, renderContext),
865
886
child: Text .rich (
866
887
textSpan,
867
888
style: style.generateTextStyle (),
@@ -874,13 +895,10 @@ class StyledText extends StatelessWidget {
874
895
);
875
896
}
876
897
877
- double ? calculateWidth (Display ? display, RenderContext context) {
898
+ double ? consumeExpandedBlock (Display ? display, RenderContext context) {
878
899
if ((display == Display .BLOCK || display == Display .LIST_ITEM ) && ! renderContext.parser.shrinkWrap) {
879
900
return double .infinity;
880
901
}
881
- if (renderContext.parser.shrinkWrap) {
882
- return MediaQuery .of (context.buildContext).size.width;
883
- }
884
902
return null ;
885
903
}
886
904
}
0 commit comments