a modern tui library written in zig

fix: pass tests

authored by Rylee Lyman and committed by rockorager.dev f7cbd42e 74fb1307

+29 -10
+29 -10
src/Window.zig
··· 328 328 .word => { 329 329 var col: usize = opts.col_offset; 330 330 var overflow: bool = false; 331 + var soft_wrapped = false; 331 332 for (segments) |segment| { 332 333 var start: usize = 0; 333 334 var tokenizer = std.mem.tokenizeAny(u8, segment.text, "\r\n"); 334 335 while (tokenizer.peek() != null) { 336 + soft_wrapped = false; 335 337 const returns = segment.text[start..tokenizer.index]; 336 338 const line = tokenizer.next().?; 337 339 start = tokenizer.index; ··· 351 353 const word = iter.next().?; 352 354 ws_start = iter.index; 353 355 var j: usize = 0; 354 - while (j < whitespace.len) : (j += 1) { 355 - if (opts.commit) self.writeCell(col, row, .{ 356 - .char = .{ 357 - .grapheme = " ", 358 - .width = 1, 359 - }, 360 - .style = segment.style, 361 - .link = segment.link, 362 - }); 363 - col += 1; 356 + if (soft_wrapped) soft_wrapped = false else { 357 + while (j < whitespace.len) : (j += 1) { 358 + if (opts.commit) self.writeCell(col, row, .{ 359 + .char = .{ 360 + .grapheme = " ", 361 + .width = 1, 362 + }, 363 + .style = segment.style, 364 + .link = segment.link, 365 + }); 366 + col += 1; 367 + } 364 368 } 365 369 if (col >= self.width) { 366 370 col = 0; 367 371 row += 1; 372 + soft_wrapped = true; 368 373 } 369 374 const width = self.gwidth(word); 370 375 if (width + col > self.width and width < self.width) { ··· 378 383 379 384 var grapheme_iterator = self.screen.unicode.graphemeIterator(word); 380 385 while (grapheme_iterator.next()) |grapheme| { 386 + soft_wrapped = false; 381 387 const s = grapheme.bytes(word); 382 388 const w = self.gwidth(s); 383 389 if (opts.commit) self.writeCell(col, row, .{ ··· 392 398 if (col >= self.width) { 393 399 row += 1; 394 400 col = 0; 401 + soft_wrapped = true; 395 402 } 396 403 } 404 + } 405 + } else { 406 + const returns = segment.text[start..tokenizer.index]; 407 + start = tokenizer.index; 408 + var i: usize = 0; 409 + while (i < returns.len) : (i += 1) { 410 + const b = returns[i]; 411 + if (b == '\r' and i + 1 < returns.len and returns[i + 1] == '\n') { 412 + i += 1; 413 + } 414 + row += 1; 415 + col = 0; 397 416 } 398 417 } 399 418 }