// SPDX-FileCopyrightText: 2024 Dan Anglin // // SPDX-License-Identifier: GPL-3.0-or-later package printer import ( "strings" "unicode" ) func (p Printer) wrapLines(text string, nIndent int) string { if nIndent >= p.lineWrapCharacterLimit { nIndent = 0 } separator := "\n" + strings.Repeat(" ", nIndent) lines := strings.Split(text, "\n") if len(lines) == 1 { return wrapLine(lines[0], separator, p.lineWrapCharacterLimit - nIndent) } var builder strings.Builder for i, line := range lines { builder.WriteString(wrapLine(line, separator, p.lineWrapCharacterLimit - nIndent)) if i < len(lines)-1 { builder.WriteString(separator) } } return builder.String() } func wrapLine(line, separator string, charLimit int) string { if len(line) <= charLimit { return line } leftcursor, rightcursor := 0, 0 var builder strings.Builder for rightcursor < (len(line) - charLimit) { rightcursor += (charLimit - 1) for (rightcursor > leftcursor) && !unicode.IsSpace(rune(line[rightcursor-1])) { rightcursor-- } if rightcursor == leftcursor { rightcursor = leftcursor + charLimit } builder.WriteString(line[leftcursor:rightcursor] + separator) leftcursor = rightcursor } builder.WriteString(line[rightcursor:]) return builder.String() }