Fix wrapping overflowing lines

This commit is contained in:
Huy Ngo 2024-08-16 08:52:02 +07:00
parent 5a56e753b9
commit 2d66e9c0b3

View file

@ -55,25 +55,41 @@ def wc_wrap(text: str, length: int) -> Generator[str, None, None]:
line_len = 0 line_len = 0
words = re.split(r"\s+", text.strip()) words = re.split(r"\s+", text.strip())
stack = [] # stack to ensure enclosure of style tags
for word in words: for word in words:
word_len = wcswidth(word) word_len = wcswidth(word)
matches = re.findall(STYLE_TAG_PATTERN, word) matches = re.findall(STYLE_TAG_PATTERN, word)
for match in matches: for match in matches:
full, _, name = match full, end, name = match
if name in STYLES: if name in STYLES:
word_len -= len(full) word_len -= len(full)
if end != '/':
stack.append(name)
elif len(stack) and name == stack[-1]:
stack.pop()
if line_words and line_len + word_len > length: if line_words and line_len + word_len > length:
line = " ".join(line_words) line = " ".join(line_words)
if line_len <= length: temp_length = length
for style in reversed(stack):
line += '</' + style + '>'
temp_length += 3 + len(style)
if line_len <= temp_length:
yield line yield line
else: else:
yield from _wc_hard_wrap(line, length) yield from _wc_hard_wrap(line, temp_length)
line_words = []
line_len = 0 line_len = 0
line_words = []
line_words.append(word) if len(line_words) == 0:
styles = ''
for style in stack:
styles += '<' + style + '>'
line_words = [styles + word]
stack = []
else:
line_words.append(word)
line_len += word_len + 1 # add 1 to account for space between words line_len += word_len + 1 # add 1 to account for space between words
if line_words: if line_words: