Commit 1b02361
Measure grapheme clusters and resolve the optional Source column per row
Two defects found in PR review of the locale-independent table parser.
WinGet's UTF8ColumnWidth walks the string with an ICU UBRK_CHARACTER
break iterator and classifies only the first code point of each grapheme
cluster, adding 2 for East Asian Wide/Fullwidth and 1 for everything
else. Measuring per code point instead counted a ZWJ sequence such as
the family emoji once per component, overshooting a cell WinGet renders
as two columns; the name was then cut at the wrong boundary, and a row
that fits WinGet's separator could be rejected as too wide. Iterate text
elements and take the width of the cluster's first code point, in the
header, the row width and the column index alike. The zero-width
category check goes with it: ICU never yields a zero-width cluster, and
a combining sequence is already folded into the cluster of its base
character.
The trailing Source column was inferred from the number of header
tokens, which does not establish that the column exists. WinGet omits a
Source column whose values are all empty, while a locale that renders
the Available header as two words (Korean "사용 가능") contributes two
starts of its own, so a source-less table still records five. An
available version longer than the gap to the second word then straddles
the phantom boundary: both ends snap back to the value's start, the
available version comes out empty and the version text is registered as
a source name. Resolve the column against each row instead - it is real
only when its boundary lands past the preceding column's on that row -
which also covers the case where the row simply stops before an empty
Source cell.
Neither change alters what the parser produces for any of the captured
English or Japanese output: all 218 rows across the seven fixtures parse
byte-identically before and after.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>1 parent d3518e6 commit 1b02361
3 files changed
Lines changed: 106 additions & 38 deletions
File tree
- src
- UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers
- UniGetUI.PackageEngine.Tests
Lines changed: 12 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
131 | 131 | | |
132 | 132 | | |
133 | 133 | | |
134 | | - | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
135 | 138 | | |
136 | 139 | | |
137 | 140 | | |
| |||
260 | 263 | | |
261 | 264 | | |
262 | 265 | | |
263 | | - | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
264 | 270 | | |
265 | 271 | | |
266 | 272 | | |
| |||
359 | 365 | | |
360 | 366 | | |
361 | 367 | | |
362 | | - | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
363 | 372 | | |
364 | 373 | | |
365 | 374 | | |
| |||
Lines changed: 24 additions & 35 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
52 | | - | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | | - | |
| 52 | + | |
57 | 53 | | |
58 | 54 | | |
59 | 55 | | |
| |||
63 | 59 | | |
64 | 60 | | |
65 | 61 | | |
66 | | - | |
| 62 | + | |
67 | 63 | | |
68 | 64 | | |
69 | 65 | | |
| |||
86 | 82 | | |
87 | 83 | | |
88 | 84 | | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
89 | 96 | | |
90 | 97 | | |
91 | 98 | | |
| |||
121 | 128 | | |
122 | 129 | | |
123 | 130 | | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
128 | | - | |
| 131 | + | |
| 132 | + | |
129 | 133 | | |
130 | 134 | | |
131 | 135 | | |
| |||
138 | 142 | | |
139 | 143 | | |
140 | 144 | | |
141 | | - | |
142 | | - | |
143 | | - | |
144 | | - | |
145 | | - | |
| 145 | + | |
| 146 | + | |
146 | 147 | | |
147 | 148 | | |
148 | 149 | | |
| |||
153 | 154 | | |
154 | 155 | | |
155 | 156 | | |
156 | | - | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
157 | 161 | | |
158 | 162 | | |
159 | 163 | | |
160 | | - | |
161 | | - | |
162 | | - | |
163 | | - | |
164 | | - | |
165 | | - | |
166 | | - | |
167 | | - | |
168 | | - | |
169 | | - | |
170 | | - | |
171 | | - | |
172 | | - | |
173 | | - | |
174 | | - | |
175 | | - | |
| 164 | + | |
| 165 | + | |
176 | 166 | | |
177 | | - | |
178 | | - | |
| 167 | + | |
179 | 168 | | |
180 | 169 | | |
181 | 170 | | |
| |||
Lines changed: 70 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
501 | 501 | | |
502 | 502 | | |
503 | 503 | | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
504 | 574 | | |
505 | 575 | | |
506 | 576 | | |
| |||
0 commit comments