DazedTL/util/dazedwrap.py
2025-07-12 14:29:23 -05:00

56 lines
No EOL
1.8 KiB
Python

import re
def _get_visible_length(text: str) -> int:
"""
Calculate the visible length of text, ignoring RPG Maker color codes.
Args:
text (str): The text to measure
Returns:
int: The length of the text excluding color codes
"""
# Remove all color codes like \c[5] or \C[35], and also ignore \\! and \\.
cleaned_text = re.sub(r'[\\]+[cC]\[\d+\]', '', text)
# Remove \\! and \\.
cleaned_text = re.sub(r'[\\]+.', '', cleaned_text)
return len(cleaned_text)
def wrapText(text: str, width: int) -> str:
"""
Wrap text to the specified width, preserving RPG Maker color codes.
Args:
text (str): The text to wrap
width (int): The maximum number of characters per line
Returns:
str: The wrapped text with lines separated by \n
"""
if not text:
return ""
# Split on double newlines (\n\n or \\n\\n)
import re
segments = re.split(r'(?:\n\n|\\n\\n)', text)
wrapped_segments = []
for segment in segments:
words = segment.split()
lines = []
current_line = []
current_length = 0
for word in words:
word_length = _get_visible_length(word)
if current_length + word_length + len(current_line) <= width:
current_line.append(word)
current_length += word_length
else:
if current_line:
lines.append(" ".join(current_line))
current_line = [word]
current_length = word_length
if current_line:
lines.append(" ".join(current_line))
wrapped_segments.append("\n".join(lines))
# Rejoin with double newlines to preserve hard breaks
return "\n\n".join(wrapped_segments)