From 30c8fb813f98268d93a091365f051413e4160155 Mon Sep 17 00:00:00 2001 From: hut Date: Thu, 6 May 2010 12:29:28 +0200 Subject: utf stuff --- ranger/ext/utfwidth.py | 18 +++++++++++++----- ranger/gui/widgets/console.py | 4 +++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/ranger/ext/utfwidth.py b/ranger/ext/utfwidth.py index bbc67deb..2881a2a0 100644 --- a/ranger/ext/utfwidth.py +++ b/ranger/ext/utfwidth.py @@ -27,14 +27,14 @@ def utf_byte_length(string): if firstord < 0x01111111: return 1 if firstord < 0x10111111: - return 0 # invalid + return 1 # invalid if firstord < 0x11011111: return min(2, len(string)) if firstord < 0x11101111: return min(3, len(string)) if firstord < 0x11110100: return min(4, len(string)) - return 0 # invalid + return 1 # invalid def utf_char_width(string): # XXX @@ -45,6 +45,7 @@ def utf_char_width(string): return WIDE def _utf_char_to_int(string): + # Squash the last 6 bits of each byte together to an integer u = 0 for c in string: u = (u << 6) | (ord(c) & 0b00111111) @@ -56,9 +57,16 @@ def uwid(string): width = 0 while i < end: bytelen = utf_byte_length(string[i:]) - if bytelen: - width += utf_char_width(string[i:i+bytelen]) - else: width += 1 i += bytelen return width + +def uchars(string): + end = len(string) + i = 0 + result = [] + while i < end: + bytelen = utf_byte_length(string[i:]) + result.append(string[i:i+bytelen]) + i += bytelen + return result diff --git a/ranger/gui/widgets/console.py b/ranger/gui/widgets/console.py index 30872639..5a538ce2 100644 --- a/ranger/gui/widgets/console.py +++ b/ranger/gui/widgets/console.py @@ -31,6 +31,7 @@ from ranger.ext.utfwidth import uwid from ranger.container.keymap import CommandArgs from ranger.ext.get_executables import get_executables from ranger.ext.direction import Direction +from ranger.ext.utfwidth import uwid, uchars from ranger.container import History from ranger.container.history import HistoryEmptyException import ranger @@ -264,7 +265,8 @@ class Console(Widget): self.close() pos = self.pos + mod - self.line = self.line[0:pos] + self.line[pos+1:] + chars = uchars(self.line) + self.line = ''.join(chars[0:pos] + chars[pos+1:]) self.move(right=mod) self.on_line_change() -- cgit 1.4.1-2-gfad0