don't let decorators overflow term width
Vladimir Bauer
6 years ago
| 384 | 384 | } |
| 385 | 385 | |
| 386 | 386 | func (s *bState) draw(stat decor.Statistics) io.Reader { |
| 387 | btrim, tw := 0, stat.AvailableWidth | |
| 388 | if !s.trimSpace { | |
| 389 | btrim = 2 | |
| 390 | stat.AvailableWidth -= btrim | |
| 391 | s.bufB.WriteByte(' ') | |
| 392 | defer s.bufB.WriteByte(' ') | |
| 393 | } | |
| 394 | ||
| 395 | nlr := strings.NewReader("\n") | |
| 387 | 396 | for _, d := range s.pDecorators { |
| 388 | 397 | str := d.Decor(stat) |
| 389 | 398 | stat.AvailableWidth -= runewidth.StringWidth(stripansi.Strip(str)) |
| 390 | 399 | s.bufP.WriteString(str) |
| 391 | 400 | } |
| 392 | ||
| 401 | if stat.AvailableWidth <= 0 { | |
| 402 | trunc := strings.NewReader(runewidth.Truncate(stripansi.Strip(s.bufP.String()), tw-btrim, "…")) | |
| 403 | return io.MultiReader(trunc, s.bufB, nlr) | |
| 404 | } | |
| 405 | ||
| 406 | tw = stat.AvailableWidth | |
| 393 | 407 | for _, d := range s.aDecorators { |
| 394 | 408 | str := d.Decor(stat) |
| 395 | 409 | stat.AvailableWidth -= runewidth.StringWidth(stripansi.Strip(str)) |
| 396 | 410 | s.bufA.WriteString(str) |
| 397 | 411 | } |
| 398 | ||
| 399 | if !s.trimSpace { | |
| 400 | defer s.bufB.WriteByte(' ') | |
| 401 | s.bufB.WriteByte(' ') | |
| 402 | stat.AvailableWidth -= 2 | |
| 412 | if stat.AvailableWidth <= 0 { | |
| 413 | trunc := strings.NewReader(runewidth.Truncate(stripansi.Strip(s.bufA.String()), tw-btrim, "…")) | |
| 414 | return io.MultiReader(s.bufP, s.bufB, trunc, nlr) | |
| 403 | 415 | } |
| 404 | 416 | |
| 405 | 417 | s.filler.Fill(s.bufB, s.reqWidth, stat) |
| 406 | 418 | |
| 407 | s.bufA.WriteByte('\n') | |
| 408 | return io.MultiReader(s.bufP, s.bufB, s.bufA) | |
| 419 | return io.MultiReader(s.bufP, s.bufB, s.bufA, nlr) | |
| 409 | 420 | } |
| 410 | 421 | |
| 411 | 422 | func (s *bState) wSyncTable() [][]chan int { |