22 lines
696 B
Python
22 lines
696 B
Python
"""Helpers for shaping outgoing mesh messages."""
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
def trim_to_bytes(text: str, max_bytes: int) -> str:
|
|
"""Return ``text`` truncated so its UTF-8 encoding is at most ``max_bytes`` bytes.
|
|
|
|
Backs off if the cut lands inside a multi-byte UTF-8 sequence so we never emit
|
|
invalid UTF-8 to the radio.
|
|
"""
|
|
if max_bytes <= 0:
|
|
return ""
|
|
encoded = text.encode("utf-8")
|
|
if len(encoded) <= max_bytes:
|
|
return text
|
|
cut = encoded[:max_bytes]
|
|
# Continuation bytes start with bits 10xxxxxx; rewind past them.
|
|
while cut and (cut[-1] & 0xC0) == 0x80:
|
|
cut = cut[:-1]
|
|
return cut.decode("utf-8", errors="ignore")
|