summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Rose <grinch@grinchcentral.com>2013-11-05 23:05:02 -0500
committerErik Rose <grinch@grinchcentral.com>2013-11-05 23:05:02 -0500
commit1a463ac86c7645315195ec012d3caf930ac3c10f (patch)
tree62ee16dceb87b7caa016937dfd4c5768a686d7bf
parente104550cddacda3aaf7a86f0d07491e398f1ccc8 (diff)
parentdadefbbc4e862cd54c2fae72b29001bdd676aa73 (diff)
downloadblessings-1a463ac86c7645315195ec012d3caf930ac3c10f.tar.gz
Support terminal types, such as kermit and avatar, that use bytes 127-255 in their escape sequences. Close #47.1.6
-rw-r--r--README.rst2
-rw-r--r--blessings/__init__.py16
-rw-r--r--blessings/tests.py4
3 files changed, 15 insertions, 7 deletions
diff --git a/README.rst b/README.rst
index 7336ebd..b7f2401 100644
--- a/README.rst
+++ b/README.rst
@@ -441,6 +441,8 @@ Version History
* Add ``fullscreen()`` and ``hidden_cursor()`` to the auto-generated docs.
* Fall back to ``LINES`` and ``COLUMNS`` environment vars to find height and
width. (jquast)
+ * Support terminal types, such as kermit and avatar, that use bytes 127-255
+ in their escape sequences. (jquast)
1.5.1
* Clean up fabfile, removing the redundant ``test`` command.
diff --git a/blessings/__init__.py b/blessings/__init__.py
index 4506869..04b10a5 100644
--- a/blessings/__init__.py
+++ b/blessings/__init__.py
@@ -376,10 +376,8 @@ class Terminal(object):
"""
code = tigetstr(self._sugar.get(atom, atom))
if code:
- # We can encode escape sequences as UTF-8 because they never
- # contain chars > 127, and UTF-8 never changes anything within that
- # range..
- return code.decode('utf-8')
+ # See the comment in ParametrizingString for why this is latin1.
+ return code.decode('latin1')
return u''
def _resolve_color(self, color):
@@ -448,7 +446,15 @@ class ParametrizingString(unicode):
# Re-encode the cap, because tparm() takes a bytestring in Python
# 3. However, appear to be a plain Unicode string otherwise so
# concats work.
- parametrized = tparm(self.encode('utf-8'), *args).decode('utf-8')
+ #
+ # We use *latin1* encoding so that bytes emitted by tparm are
+ # encoded to their native value: some terminal kinds, such as
+ # 'avatar' or 'kermit', emit 8-bit bytes in range 0x7f to 0xff.
+ # latin1 leaves these values unmodified in their conversion to
+ # unicode byte values. The terminal emulator will "catch" and
+ # handle these values, even if emitting utf8-encoded text, where
+ # these bytes would otherwise be illegal utf8 start bytes.
+ parametrized = tparm(self.encode('latin1'), *args).decode('latin1')
return (parametrized if self._normal is None else
FormattingString(parametrized, self._normal))
except curses.error:
diff --git a/blessings/tests.py b/blessings/tests.py
index 168c396..aff3a2f 100644
--- a/blessings/tests.py
+++ b/blessings/tests.py
@@ -28,12 +28,12 @@ TestTerminal = partial(Terminal, kind='xterm-256color')
def unicode_cap(cap):
"""Return the result of ``tigetstr`` except as Unicode."""
- return tigetstr(cap).decode('utf-8')
+ return tigetstr(cap).decode('latin1')
def unicode_parm(cap, *parms):
"""Return the result of ``tparm(tigetstr())`` except as Unicode."""
- return tparm(tigetstr(cap), *parms).decode('utf-8')
+ return tparm(tigetstr(cap), *parms).decode('latin1')
def test_capability():