Skip to content

Commit 306efe6

Browse files
committed
content: Fix ordered list layout to handle long numbers in <ol>
Fixes: #1356
1 parent 3000d87 commit 306efe6

File tree

2 files changed

+47
-24
lines changed

2 files changed

+47
-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: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,38 @@ 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('long ordered list markers render completely and are right-aligned', (tester) async {
252+
await prepareContent(tester, plainContent(ContentExample.orderedListLargeStart.html));
253+
254+
final markerTexts = tester.widgetList<Text>(
255+
find.descendant(of: find.byType(Align), matching: find.byType(Text)));
256+
257+
for (final text in markerTexts) {
258+
final renderParagraph = tester.renderObject(find.text(text.data!)) as RenderParagraph;
259+
final textHeight = renderParagraph.size.height;
260+
final lineHeight = renderParagraph.text.style!.height! * renderParagraph.text.style!.fontSize!;
261+
check(textHeight).equals(lineHeight);
262+
263+
final textWidth = renderParagraph.size.width;
264+
final renderBox = tester.renderObject(find.ancestor(
265+
of: find.text(text.data!),
266+
matching: find.byType(Align))) as RenderBox;
267+
check(renderBox.size.width >= textWidth).isTrue();
268+
269+
final align = tester.widget<Align>(
270+
find.ancestor(of: find.text(text.data!), matching: find.byType(Align)));
271+
check(align.alignment).equals(AlignmentDirectional.topEnd);
272+
}
273+
});
242274
});
243275

244276
group('Spoiler', () {

0 commit comments

Comments
 (0)