Skip to content

Commit e71ca83

Browse files
committed
content: Fix ordered list layout to handle long numbers in <ol>
Fixes: #1356
1 parent a6bc668 commit e71ca83

File tree

2 files changed

+46
-24
lines changed

2 files changed

+46
-24
lines changed

lib/widgets/content.dart

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -493,33 +493,24 @@ class ListNodeWidget extends StatelessWidget {
493493
case UnorderedListNode(): marker = "• "; break;
494494
case OrderedListNode(:final start): marker = "${start + index}. "; break;
495495
}
496-
return ListItemWidget(marker: marker, nodes: item);
496+
return TableRow(children: [
497+
Align(
498+
alignment: AlignmentDirectional.topEnd,
499+
child: Text(marker)),
500+
BlockContentList(nodes: item),
501+
]);
497502
});
503+
498504
return Padding(
499505
padding: const EdgeInsets.only(top: 2, bottom: 5),
500-
child: Column(children: items));
501-
}
502-
}
503-
504-
class ListItemWidget extends StatelessWidget {
505-
const ListItemWidget({super.key, required this.marker, required this.nodes});
506-
507-
final String marker;
508-
final List<BlockContentNode> nodes;
509-
510-
@override
511-
Widget build(BuildContext context) {
512-
return Row(
513-
mainAxisAlignment: MainAxisAlignment.start,
514-
crossAxisAlignment: CrossAxisAlignment.baseline,
515-
textBaseline: localizedTextBaseline(context),
516-
children: [
517-
SizedBox(
518-
width: 20, // TODO handle long numbers in <ol>, like https://github.com/zulip/zulip/pull/25063
519-
child: Align(
520-
alignment: AlignmentDirectional.topEnd, child: Text(marker))),
521-
Expanded(child: BlockContentList(nodes: nodes)),
522-
]);
506+
child: Table(
507+
defaultVerticalAlignment: TableCellVerticalAlignment.baseline,
508+
textBaseline: localizedTextBaseline(context),
509+
columnWidths: const <int, TableColumnWidth>{
510+
0: IntrinsicColumnWidth(),
511+
1: FlexColumnWidth(),
512+
},
513+
children: items));
523514
}
524515
}
525516

test/widgets/content_test.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,37 @@ 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.renderObject(find.textContaining('9999.')) as RenderParagraph;
265+
final marker10000 = tester.renderObject(find.textContaining('10000.')) as RenderParagraph;
266+
check(marker9999.size.width != marker10000.size.width).isTrue();
267+
268+
final marker9999Pos = marker9999.localToGlobal(Offset.zero);
269+
final marker10000Pos = marker10000.localToGlobal(Offset.zero);
270+
check(marker9999Pos.dx + marker9999.size.width)
271+
.equals(marker10000Pos.dx + marker10000.size.width);
272+
});
242273
});
243274

244275
group('Spoiler', () {

0 commit comments

Comments
 (0)