Skip to content

Commit d6a2af4

Browse files
author
PR Batch Tester
committed
fix(mobile): simplify ordered list width detection
1 parent 7eb36bf commit d6a2af4

2 files changed

Lines changed: 15 additions & 43 deletions

File tree

‎apps/mobile/src/lib/orderedListMarkers.test.ts‎

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,24 @@ import { describe, expect, it } from "vite-plus/test";
22

33
import { wideOrderedListMarkerDigits } from "./orderedListMarkers";
44

5-
const numberedList = (count: number, marker = (index: number) => `${index + 1}.`) =>
6-
Array.from({ length: count }, (_, index) => `${marker(index)} item`).join("\n");
5+
const numberedList = (count: number, marker = "1.") =>
6+
Array.from({ length: count }, () => `${marker} item`).join("\n");
77

88
describe("wideOrderedListMarkerDigits", () => {
9-
it("returns 0 while every number fits in two digits", () => {
9+
it("ignores text and lists that fit the normal gutter", () => {
1010
expect(wideOrderedListMarkerDigits("just a message")).toBe(0);
11-
expect(wideOrderedListMarkerDigits("- one\n- two")).toBe(0);
12-
expect(wideOrderedListMarkerDigits(numberedList(99))).toBe(0);
1311
expect(wideOrderedListMarkerDigits("We shipped it in 2026. More later.")).toBe(0);
14-
expect(wideOrderedListMarkerDigits("Version 1.2 is out")).toBe(0);
15-
const withSubLists = Array.from(
16-
{ length: 60 },
17-
(_, index) => `${index + 1}. item\n 1. sub\n 2. sub`,
18-
).join("\n");
19-
expect(wideOrderedListMarkerDigits(withSubLists)).toBe(0);
20-
});
21-
22-
it("measures the widest written number", () => {
23-
expect(wideOrderedListMarkerDigits(numberedList(130))).toBe(3);
24-
expect(wideOrderedListMarkerDigits("1000) a")).toBe(4);
25-
expect(wideOrderedListMarkerDigits("text\r\n\r\n100.\r\n")).toBe(3);
26-
expect(wideOrderedListMarkerDigits("007. agent")).toBe(0);
12+
expect(wideOrderedListMarkerDigits(numberedList(99))).toBe(0);
2713
});
2814

29-
it("covers lists the renderer numbers itself", () => {
30-
expect(wideOrderedListMarkerDigits(numberedList(101, () => "1."))).toBe(3);
15+
it("covers written and renderer-generated three-digit markers", () => {
16+
expect(wideOrderedListMarkerDigits("100. item")).toBe(3);
17+
expect(wideOrderedListMarkerDigits(numberedList(100))).toBe(3);
18+
expect(wideOrderedListMarkerDigits(numberedList(100, "> 1."))).toBe(3);
3119
});
3220

33-
it("finds lists nested in other blocks", () => {
34-
expect(wideOrderedListMarkerDigits("- 100000. nested")).toBe(6);
35-
expect(wideOrderedListMarkerDigits("> > 250. quoted")).toBe(3);
36-
expect(wideOrderedListMarkerDigits("1. a\n\n 100. nested")).toBe(3);
21+
it("measures ordered markers nested in other list items", () => {
3722
expect(wideOrderedListMarkerDigits("100. 1. item")).toBe(3);
38-
expect(wideOrderedListMarkerDigits(numberedList(120, () => "1. 1."))).toBe(3);
39-
});
40-
41-
it("stays linear on long runs of bullets and spaces", () => {
42-
expect(wideOrderedListMarkerDigits(`${"- ".repeat(40)}x`)).toBe(0);
23+
expect(wideOrderedListMarkerDigits("- 1000. nested")).toBe(4);
4324
});
4425
});

‎apps/mobile/src/lib/orderedListMarkers.ts‎

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,20 @@
55
const ORDERED_MARKER_LINE =
66
/^([ \t>]*(?:(?:[-+*]|\d{1,9}[.)])[ \t]+(?:>[ \t>]*)?)*)(\d{1,9})[.)](?:[ \t\r]|$)/;
77
const PREFIX_NUMBER = /(\d{1,9})[.)]/g;
8-
const TOP_LEVEL_ITEM = /^ {0,3}\d/;
9-
10-
/**
11-
* Digit count of the widest ordered-list number in `markdown`, when that is
12-
* three or more digits; otherwise 0.
13-
*
14-
* Agents write their list numbers out, so the largest written number covers
15-
* normal replies. Counting top-level items also covers lists the renderer
16-
* numbers itself, such as `1.` on every line. Code blocks are not skipped; a
17-
* stray match there only widens the gutter.
18-
*/
198
export function wideOrderedListMarkerDigits(markdown: string): number {
209
let widest = 0;
21-
let topLevelItems = 0;
10+
let items = 0;
2211
for (const line of markdown.split("\n")) {
2312
const marker = ORDERED_MARKER_LINE.exec(line);
2413
if (!marker) continue;
14+
items += 1;
2515
widest = Math.max(widest, Number(marker[2]));
2616
for (const outer of marker[1]!.matchAll(PREFIX_NUMBER)) {
2717
widest = Math.max(widest, Number(outer[1]));
2818
}
29-
if (TOP_LEVEL_ITEM.test(line)) topLevelItems += 1;
3019
}
31-
const digits = String(Math.max(widest, topLevelItems)).length;
20+
// The renderer increments repeated `1.` markers. Counting every matched item
21+
// may over-size messages with many separate lists, but it cannot clip them.
22+
const digits = String(Math.max(widest, items)).length;
3223
return digits >= 3 ? digits : 0;
3324
}

0 commit comments

Comments
 (0)