File tree Expand file tree Collapse file tree 2 files changed +25
-15
lines changed Expand file tree Collapse file tree 2 files changed +25
-15
lines changed Original file line number Diff line number Diff line change @@ -76,7 +76,7 @@ class EncodedQueue(object):
76
76
def __init__ (self , keymap , encoding ):
77
77
self .k = self .ck = keymap
78
78
self .events = []
79
- self .buf = []
79
+ self .buf = bytearray ()
80
80
self .encoding = encoding
81
81
82
82
def get (self ):
@@ -89,32 +89,33 @@ def empty(self):
89
89
return not self .events
90
90
91
91
def flush_buf (self ):
92
- raw = b'' . join ( self .buf )
93
- self .buf = []
94
- return raw
92
+ old = self .buf
93
+ self .buf = bytearray ()
94
+ return old
95
95
96
96
def insert (self , event ):
97
97
trace ('added event {event}' , event = event )
98
98
self .events .append (event )
99
99
100
100
def push (self , char ):
101
+ self .buf .append (char )
101
102
if char in self .k :
103
+ if self .k is self .ck :
104
+ #sanity check, buffer is empty when a special key comes
105
+ assert len (self .buf ) == 1
102
106
k = self .k [char ]
103
107
trace ('found map {k!r}' , k = k )
104
- self .buf .append (char )
105
108
if isinstance (k , dict ):
106
109
self .k = k
107
110
else :
108
111
self .insert (Event ('key' , k , self .flush_buf ()))
109
112
self .k = self .ck
110
- elif self .buf :
111
- keys = self .flush_buf ()
112
- decoded = keys .decode (self .encoding , 'ignore' ) # XXX surogate?
113
- #XXX: incorrect
114
- for c in decoded :
115
- self .insert (Event ('key' , c , c ))
116
- self .buf = []
117
- self .k = self .ck
118
- self .push (char )
113
+
119
114
else :
120
- self .insert (Event ('key' , char .decode (self .encoding ), char ))
115
+ try :
116
+ decoded = bytes (self .buf ).decode (self .encoding )
117
+ except :
118
+ return
119
+
120
+ self .insert (Event ('key' , decoded , self .flush_buf ()))
121
+ self .k = self .ck
Original file line number Diff line number Diff line change
1
+ from __future__ import unicode_literals
1
2
from pyrepl .unix_eventqueue import EncodedQueue
2
3
3
4
from pyrepl import curses
6
7
def test_simple ():
7
8
q = EncodedQueue ({}, 'utf-8' )
8
9
10
+ a = u'\u1234 '
11
+ b = a .encode ('utf-8' )
12
+ for c in b :
13
+ q .push (c )
14
+
15
+ event = q .get ()
16
+ assert q .get () is None
17
+
You can’t perform that action at this time.
0 commit comments