func (t *Terminal) displayWidth(runes []rune) int { l := 0 for _, r := range runes { l += util.RuneWidth(r, l, t.tabstop) } return l }
func (t *Terminal) displayWidthWithLimit(runes []rune, prefixWidth int, limit int) int { l := 0 for _, r := range runes { l += util.RuneWidth(r, l+prefixWidth, t.tabstop) if l > limit { // Early exit return l } } return l }
func (t *Terminal) trimRight(runes []rune, width int) ([]rune, int) { // We start from the beginning to handle tab characters l := 0 for idx, r := range runes { l += util.RuneWidth(r, l, t.tabstop) if l > width { return runes[:idx], len(runes) - idx } } return runes, 0 }
func (t *Terminal) processTabs(runes []rune, prefixWidth int) (string, int) { var strbuf bytes.Buffer l := prefixWidth for _, r := range runes { w := util.RuneWidth(r, l, t.tabstop) l += w if r == '\t' { strbuf.WriteString(strings.Repeat(" ", w)) } else { strbuf.WriteRune(r) } } return strbuf.String(), l }
func wrapLine(input string, prefixLength int, max int, tabstop int) []wrappedLine { lines := []wrappedLine{} width := 0 line := "" for _, r := range input { w := util.Max(util.RuneWidth(r, prefixLength+width, 8), 1) width += w str := string(r) if r == '\t' { str = repeat(" ", w) } if prefixLength+width <= max { line += str } else { lines = append(lines, wrappedLine{string(line), width - w}) line = str prefixLength = 0 width = util.RuneWidth(r, prefixLength, 8) } } lines = append(lines, wrappedLine{string(line), width}) return lines }