| 85 | } |
| 86 | |
| 87 | export function* wrapSpannedStringByWord<T>( |
| 88 | spannedString: SpannedString<T>, |
| 89 | width: number |
| 90 | ): Iterable<SpannedString<T>> { |
| 91 | // Short circuit if no wrapping is required |
| 92 | const string = spannedString.getString(); |
| 93 | const charWidths = spannedString.getCharWidths(); |
| 94 | const stringWidth = charWidths.reduce((a, b) => a + b, 0); |
| 95 | if (stringWidth < width) { |
| 96 | yield spannedString; |
| 97 | return; |
| 98 | } |
| 99 | |
| 100 | const lineBreaks = getLineBreaksForString(string, charWidths, width); |
| 101 | let prevLineBreak = 0; |
| 102 | for (const lineBreak of lineBreaks) { |
| 103 | yield spannedString.slice(prevLineBreak, lineBreak); |
| 104 | prevLineBreak = lineBreak; |
| 105 | } |
| 106 | if (prevLineBreak < stringWidth - 1) { |
| 107 | yield spannedString.slice(prevLineBreak); |
| 108 | } |
| 109 | } |