From 47c8e1c7042e94b3e4efd1bcaf71ddde1390109c Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Thu, 30 Jul 2020 01:07:02 -0400 Subject: [PATCH] improved text encoding --- base.py | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/base.py b/base.py index ca253ac..2859264 100644 --- a/base.py +++ b/base.py @@ -157,7 +157,34 @@ class rList(rObject): rv += "\n\t}" return rv + +def _generate_map(): + map = { x: "\\${:02x}".format(x) for x in range(0, 256) if x < 32 or x > 126 } + map[0x0d] = "\\n" # intentionally backwards. + map[0x0a] = "\\r" # intentionally backwards. + map[0x09] = "\\t" + # \b \f \v \? also supported. + map[ord('"')] = '\\"' + map[ord("'")] = "\\'" + map[ord("\\")] = "\\\\" + # map[0x7f] = "\\?" # rubout + + return map + class rTextObject(rObject): + # _map = { x: "\\${:02x}".format(x) for x in range(0, 256) if x < 32 or x > 126 } + + + + _map = _generate_map() + + @staticmethod + def _encode(bb): + map = rTextObject._map + return "".join([map[x] if x in map else chr(x) for x in bb]) + + + def __init__(self, text, *, id=None, attr=None): super().__init__(id=id, attr=attr) # text is a string or bytes. @@ -165,12 +192,22 @@ class rTextObject(rObject): self.text = text self._text = str_to_bytes(text) + def __len__(self): + return len(self._text) + def __bytes__(self): return self._text def _rez_string(self): - # todo - should extended chars be macroman? - return '\t"' + self._text.decode("ascii") + '"' + + if not self._text: return '\t""\n' + + bb = self._text + data = [bb[x*32:x*32+32] for x in range(0, len(bb)+31>>5)] + + rv = "" + rv = "\n".join(['\t"' + self._encode(x) + '"' for x in data]) + return rv class rText(rTextObject):