Skip to content

Commit 564047c

Browse files
committed
content: Fix ordered list layout to handle long numbers in <ol>
Fixes: #1356
1 parent 2b96569 commit 564047c

File tree

2 files changed

+42
-24
lines changed

2 files changed

+42
-24
lines changed

lib/widgets/content.dart

+15-24
Original file line numberDiff line numberDiff line change
@@ -503,33 +503,24 @@ class ListNodeWidget extends StatelessWidget {
503503
case UnorderedListNode(): marker = "• "; break;
504504
case OrderedListNode(:final start): marker = "${start + index}. "; break;
505505
}
506-
return ListItemWidget(marker: marker, nodes: item);
506+
return TableRow(children: [
507+
Align(
508+
alignment: AlignmentDirectional.topEnd,
509+
child: Text(marker)),
510+
BlockContentList(nodes: item),
511+
]);
507512
});
513+
508514
return Padding(
509515
padding: const EdgeInsets.only(top: 2, bottom: 5),
510-
child: Column(children: items));
511-
}
512-
}
513-
514-
class ListItemWidget extends StatelessWidget {
515-
const ListItemWidget({super.key, required this.marker, required this.nodes});
516-
517-
final String marker;
518-
final List<BlockContentNode> nodes;
519-
520-
@override
521-
Widget build(BuildContext context) {
522-
return Row(
523-
mainAxisAlignment: MainAxisAlignment.start,
524-
crossAxisAlignment: CrossAxisAlignment.baseline,
525-
textBaseline: localizedTextBaseline(context),
526-
children: [
527-
SizedBox(
528-
width: 20, // TODO handle long numbers in <ol>, like https://github.com/zulip/zulip/pull/25063
529-
child: Align(
530-
alignment: AlignmentDirectional.topEnd, child: Text(marker))),
531-
Expanded(child: BlockContentList(nodes: nodes)),
532-
]);
516+
child: Table(
517+
defaultVerticalAlignment: TableCellVerticalAlignment.baseline,
518+
textBaseline: localizedTextBaseline(context),
519+
columnWidths: const <int, TableColumnWidth>{
520+
0: IntrinsicColumnWidth(),
521+
1: FlexColumnWidth(),
522+
},
523+
children: items));
533524
}
534525
}
535526

test/widgets/content_test.dart

+27
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,33 @@ void main() {
239239
expect(find.text('third'), findsOneWidget);
240240
expect(find.text('fourth'), findsOneWidget);
241241
});
242+
243+
testWidgets('list uses correct text baseline alignment', (tester) async {
244+
await prepareContent(tester, plainContent(ContentExample.orderedListLargeStart.html));
245+
246+
final table = tester.widget<Table>(find.byType(Table));
247+
check(table.defaultVerticalAlignment).equals(TableCellVerticalAlignment.baseline);
248+
check(table.textBaseline).equals(localizedTextBaseline(tester.element(find.byType(Table))));
249+
});
250+
251+
testWidgets('ordered list markers have enough space to render completely', (tester) async {
252+
await prepareContent(tester, plainContent(ContentExample.orderedListLargeStart.html));
253+
254+
final renderParagraph = tester.renderObject(find.textContaining('9999.')) as RenderParagraph;
255+
final textHeight = renderParagraph.size.height;
256+
final lineHeight = renderParagraph.text.style!.height! * renderParagraph.text.style!.fontSize!;
257+
check(textHeight).equals(lineHeight);
258+
check(renderParagraph.didExceedMaxLines).isFalse();
259+
});
260+
261+
testWidgets('ordered list markers are end-aligned', (tester) async {
262+
await prepareContent(tester, plainContent(ContentExample.orderedListLargeStart.html));
263+
264+
final marker9999 = tester.getRect(find.textContaining('9999.'));
265+
final marker10000 = tester.getRect(find.textContaining('10000.'));
266+
check(marker9999.width != marker10000.width).isTrue();
267+
check(marker9999.right).equals(marker10000.right);
268+
});
242269
});
243270

244271
group('Spoiler', () {

0 commit comments

Comments
 (0)