@@ -289,6 +289,17 @@ class CodeBlockSpanNode extends InlineContentNode {
289
289
}
290
290
}
291
291
292
+ class ImageNodes extends BlockContentNode {
293
+ const ImageNodes (this .images, {super .debugHtmlNode});
294
+
295
+ final List <ImageNode > images;
296
+
297
+ @override
298
+ List <DiagnosticsNode > debugDescribeChildren () {
299
+ return images.map ((node) => node.toDiagnosticsNode ()).toList ();
300
+ }
301
+ }
302
+
292
303
class ImageNode extends BlockContentNode {
293
304
const ImageNode ({super .debugHtmlNode, required this .srcUrl});
294
305
@@ -892,13 +903,24 @@ class _ZulipContentParser {
892
903
893
904
List <BlockContentNode > parseBlockContentList (dom.NodeList nodes) {
894
905
assert (_debugParserContext == _ParserContext .block);
895
- final acceptedNodes = nodes.where ((node) {
896
- // We get a bunch of newline Text nodes between paragraphs.
897
- // A browser seems to ignore these; let's do the same.
898
- if (node is dom.Text && (node.text == '\n ' )) return false ;
899
- return true ;
900
- });
901
- return acceptedNodes.map (parseBlockContent).toList (growable: false );
906
+ final List <BlockContentNode > blocks = [];
907
+ List <ImageNode > imageNodes = [];
908
+ for (final node in nodes) {
909
+ if (node is dom.Text && (node.text == '\n ' )) continue ;
910
+
911
+ final block = parseBlockContent (node);
912
+ if (block is ImageNode ) {
913
+ imageNodes.add (block);
914
+ continue ;
915
+ }
916
+ if (imageNodes.isNotEmpty) {
917
+ blocks.add (ImageNodes (imageNodes));
918
+ imageNodes = [];
919
+ }
920
+ blocks.add (block);
921
+ }
922
+ if (imageNodes.isNotEmpty) blocks.add (ImageNodes (imageNodes));
923
+ return blocks;
902
924
}
903
925
904
926
ZulipContent parse (String html) {
0 commit comments