Skip to content

Commit f135ad5

Browse files
committed
content: combine multiple images in order
1 parent fc4c958 commit f135ad5

File tree

2 files changed

+44
-7
lines changed

2 files changed

+44
-7
lines changed

lib/model/content.dart

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,17 @@ class CodeBlockSpanNode extends InlineContentNode {
289289
}
290290
}
291291

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+
292303
class ImageNode extends BlockContentNode {
293304
const ImageNode({super.debugHtmlNode, required this.srcUrl});
294305

@@ -892,13 +903,24 @@ class _ZulipContentParser {
892903

893904
List<BlockContentNode> parseBlockContentList(dom.NodeList nodes) {
894905
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;
902924
}
903925

904926
ZulipContent parse(String html) {

lib/widgets/content.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ class BlockContentList extends StatelessWidget {
8080
return ListNodeWidget(node: node);
8181
} else if (node is CodeBlockNode) {
8282
return CodeBlock(node: node);
83+
} else if (node is ImageNodes) {
84+
return MessageImages(node: node);
8385
} else if (node is ImageNode) {
8486
return MessageImage(node: node);
8587
} else if (node is UnimplementedBlockContentNode) {
@@ -246,6 +248,19 @@ class ListItemWidget extends StatelessWidget {
246248
}
247249
}
248250

251+
class MessageImages extends StatelessWidget {
252+
const MessageImages({super.key, required this.node});
253+
254+
final ImageNodes node;
255+
256+
@override
257+
Widget build(BuildContext context) {
258+
return Row(
259+
crossAxisAlignment: CrossAxisAlignment.start,
260+
children: node.images.map((imageNode) => MessageImage(node: imageNode)).toList());
261+
}
262+
}
263+
249264
class MessageImage extends StatelessWidget {
250265
const MessageImage({super.key, required this.node});
251266

0 commit comments

Comments
 (0)