Merge, whatever

This commit is contained in:
Florent Le Coz 2011-05-29 00:35:47 +02:00
commit 0db064fdf7
3 changed files with 569 additions and 283 deletions

View file

@ -8,140 +8,135 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-06-13 16:13+0200\n"
"POT-Creation-Date: 2011-05-28 23:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: src/connection.py:105
#, python-format
msgid ""
"Error: Could not authenticate. Please make sure the server you chose (%s) "
"supports anonymous authentication"
#: src/core.py:59
msgid "A password is required"
msgstr ""
#: src/gui.py:67
#: src/core.py:60
msgid "Permission denied"
msgstr ""
#: src/core.py:61
msgid "The room does'nt exist"
msgstr ""
#: src/core.py:62
msgid "Your are not allowed to create a new room"
msgstr ""
#: src/core.py:63
msgid "A reserved nick must be used"
msgstr ""
#: src/core.py:64
msgid "You are not in the member list"
msgstr ""
#: src/core.py:65
msgid "This nickname is already in use or has been reserved"
msgstr ""
#: src/core.py:66
msgid "The maximum number of users has been reached"
msgstr ""
#: src/core.py:113
msgid ""
"Usage: /join [room_name][/nick] [password]\n"
"Usage: /join [room_name][@server][/nick] [password]\n"
"Join: Join the specified room. You can specify a nickname after a slash (/). "
"If no nickname is specified, you will use the default_nick in the "
"configuration file. You can omit the room name: you will then join the room "
"you're looking at (useful if you were kicked). You can also provide a "
"password to join the room.\n"
"room_name without specifying a server, the server of the room you're "
"currently in will be used. You can also provide a password to join the "
"room.\n"
"Examples:\n"
"/join room@server.tld\n"
"/join room@server.tld/ John\n"
"/join room@server.tld/John\n"
"/join room2\n"
"/join /me_again\n"
"/join\n"
"/join room@server.tld/my_nick password\n"
"/join / pass"
"/join / password"
msgstr ""
#: src/gui.py:68
msgid ""
"Usage: /quit\n"
"Quit: Just disconnect from the server and exit poezio."
msgstr ""
#: src/gui.py:69
#: src/core.py:114
msgid ""
"Usage: /exit\n"
"Exit: Just disconnect from the server and exit poezio."
msgstr ""
#: src/gui.py:70
#: src/core.py:115
msgid ""
"Usage: /next\n"
"Next: Go to the next room."
msgstr ""
#: src/gui.py:71
msgid ""
"Usage: /n\n"
"N: Go to the next room."
msgstr ""
#: src/gui.py:72
#: src/core.py:116
msgid ""
"Usage: /prev\n"
"Prev: Go to the previous room."
msgstr ""
#: src/gui.py:73
msgid ""
"Usage: /p\n"
"P: Go to the previous room."
msgstr ""
#: src/gui.py:74
#: src/core.py:117
msgid ""
"Usage: /win <number>\n"
"Win: Go to the specified room."
msgstr ""
#: src/gui.py:75
#: src/core.py:118
msgid ""
"Usage: /w <number>\n"
"W: Go to the specified room."
msgstr ""
#: src/gui.py:76
msgid "Usage: /ignore <nickname> \\Ignore: Ignore a specified nickname."
msgstr ""
#: src/gui.py:77
#: src/core.py:119
msgid ""
"Usage: /unignore <nickname>\\Unignore: Remove the specified nickname from "
"the ignore list."
"Usage: /show <availability> [status message]\n"
"Show: Sets your availability and (optionaly) your status message. The "
"<availability> argument is one of \"available, chat, away, afk, dnd, busy, xa"
"\" and the optional [status] argument will be your status message."
msgstr ""
#: src/gui.py:78
#: src/core.py:120
msgid ""
"Usage: /part [message]\n"
" Part: disconnect from a room. You can specify an optional message."
"Usage: /status <availability> [status message]\n"
"Status: Sets your availability and (optionaly) your status message. The "
"<availability> argument is one of \"available, chat, away, afk, dnd, busy, xa"
"\" and the optional [status] argument will be your status message."
msgstr ""
#: src/gui.py:79
msgid ""
"Usage: /show <availability> [status]\n"
"Show: Change your availability and (optionaly) your status. The "
"<availability> argument is one of \"avail, available, ok, here, chat, away, "
"afk, dnd, busy, xa\" and the optional [message] argument will be your status "
"message"
msgstr ""
#: src/gui.py:80
#: src/core.py:121
msgid ""
"Usage: /away [message]\n"
"Away: Sets your availability to away and (optional) sets your status "
"message. This is equivalent to '/show away [message]'"
"Away: Sets your availability to away and (optionaly) your status message. "
"This is equivalent to '/status away [message]'"
msgstr ""
#: src/gui.py:81
#: src/core.py:122
msgid ""
"Usage: /busy [message]\n"
"Busy: Sets your availability to busy and (optional) sets your status "
"message. This is equivalent to '/show busy [message]'"
"Busy: Sets your availability to busy and (optionaly) your status message. "
"This is equivalent to '/status busy [message]'"
msgstr ""
#: src/gui.py:82
msgid ""
"Usage: /avail [message]\n"
"Avail: Sets your availability to available and (optional) sets your status "
"message. This is equivalent to '/show available [message]'"
msgstr ""
#: src/gui.py:83
#: src/core.py:123
msgid ""
"Usage: /available [message]\n"
"Available: Sets your availability to available and (optional) sets your "
"status message. This is equivalent to '/show available [message]'"
"Available: Sets your availability to available and (optionaly) your status "
"message. This is equivalent to '/status available [message]'"
msgstr ""
#: src/gui.py:84
#: src/core.py:124
msgid ""
"Usage: /bookmark [roomname][/nick]\n"
"Bookmark: Bookmark the specified room (you will then auto-join it on each "
@ -151,7 +146,7 @@ msgid ""
"room (instead of default_nick)"
msgstr ""
#: src/gui.py:85
#: src/core.py:125
msgid ""
"Usage: /set <option> [value]\n"
"Set: Sets the value to the option in your configuration file. You can, for "
@ -160,197 +155,471 @@ msgid ""
"(nothing) by providing no [value] after <option>."
msgstr ""
#: src/gui.py:86
#: src/core.py:126
msgid ""
"Usage: /theme\n"
"Theme: Reload the theme defined in the config file."
msgstr ""
#: src/core.py:127
msgid ""
"Usage: /list\n"
"List: get the list of public chatrooms on the specified server"
msgstr ""
#: src/core.py:128
msgid ""
"Usage: /message <jid> [optional message]\n"
"Message: Open a conversation with the specified JID (even if it is not in "
"our roster), and send a message to it, if specified"
msgstr ""
#: src/core.py:129
msgid ""
"Usage: /version <jid>\n"
"Version: get the software version of the given JID (usually its XMPP client "
"and Operating System)"
msgstr ""
#: src/core.py:130
msgid ""
"Usage: /connect\n"
"Connect: disconnect from the remote server if you are currently connected "
"and then connect to it again"
msgstr ""
#: src/core.py:131
msgid ""
"Usage: /server_cycle [domain] [message]\n"
"Server Cycle: disconnect and reconnects in all the rooms in domain."
msgstr ""
#: src/core.py:192
msgid "Welcome to poezio!"
msgstr ""
#: src/core.py:391
msgid "Connection to remote server failed"
msgstr ""
#: src/core.py:400
msgid "Disconnected from server."
msgstr ""
#: src/core.py:406
msgid "Authentication failed."
msgstr ""
#: src/core.py:412
msgid "Connected to server."
msgstr ""
#: src/core.py:419
msgid "Authentication success."
msgstr ""
#: src/core.py:420
#, python-format
msgid "Your JID is %s"
msgstr ""
#: src/core.py:860
msgid "Unknown error"
msgstr ""
#: src/core.py:862 src/tabs.py:1680
#, python-format
msgid "Error: %(code)s - %(msg)s: %(body)s"
msgstr ""
#: src/core.py:865
#, python-format
msgid "Error: %(msg)s: %(body)s"
msgstr ""
#: src/core.py:868
msgid ""
"To provide a password in order to join the room, type \"/join / password"
"\" (replace \"password\" by the real password)"
msgstr ""
#: src/core.py:874
msgid ""
"You can join the room with an other nick, by typing \"/join /other_nick\""
msgstr ""
#: src/core.py:923
#, python-format
msgid "%(nick)s set the subject to: %(subject)s"
msgstr ""
#: src/core.py:925
#, python-format
msgid "The subject is: %(subject)s"
msgstr ""
#: src/core.py:960
#, python-format
msgid "message received for a non-existing room: %s"
msgstr ""
#: src/core.py:986
msgid "Available commands are: "
msgstr ""
#: src/core.py:991
msgid ""
"\n"
"Type /help <command_name> to know what each command does"
msgstr ""
#: src/core.py:998
#, python-format
msgid "Unknown command: %s"
msgstr ""
#: src/core.py:1060 src/tabs.py:551
msgid "an unknown software"
msgstr ""
#: src/core.py:1061 src/tabs.py:552
msgid "unknown"
msgstr ""
#: src/core.py:1062 src/tabs.py:553
msgid "on an unknown platform"
msgstr ""
#: src/core.py:1215
msgid "You didn't specify a server for the room you want to join"
msgstr ""
#: src/core.py:1276
#, python-format
msgid "Your bookmarks are now: %s"
msgstr ""
#: src/core.py:1347
msgid "No server specified"
msgstr ""
#: src/core.py:1474 src/tabs.py:144
#, python-format
msgid "Unknown command (%s)"
msgstr ""
#: src/core.py:1474 src/tabs.py:144
msgid "Error"
msgstr ""
#: src/tabs.py:59
msgid "busy"
msgstr ""
#: src/tabs.py:60
msgid "away"
msgstr ""
#: src/tabs.py:61
msgid "not available"
msgstr ""
#: src/tabs.py:62
msgid "chatty"
msgstr ""
#: src/tabs.py:63
msgid "available"
msgstr ""
#: src/tabs.py:263
msgid ""
"Usage: /say <message>\n"
"Say: Just send the message.\n"
" Useful if you want your message to "
"begin with a '/'"
msgstr ""
#: src/tabs.py:457
msgid ""
"Usage: /ignore <nickname> \n"
"Ignore: Ignore a specified nickname."
msgstr ""
#: src/tabs.py:458
msgid ""
"Usage: /unignore <nickname>\n"
"Unignore: Remove the specified nickname from the ignore list."
msgstr ""
#: src/tabs.py:459
msgid ""
"Usage: /kick <nick> [reason]\n"
"Kick: Kick the user with the specified nickname. You also can give an "
"optional reason."
msgstr ""
#: src/gui.py:87
#: src/tabs.py:460
msgid ""
"Usage: /topic <subject> \n"
"Usage: /topic <subject>\n"
"Topic: Change the subject of the room"
msgstr ""
#: src/gui.py:88
#: src/tabs.py:461
msgid ""
"Usage: /query <nick>\n"
"Usage: /query <nick> [message]\n"
"Query: Open a private conversation with <nick>. This nick has to be present "
"in the room you're currently in."
"in the room you're currently in. If you specified a message after the "
"nickname, it will immediately be sent to this user"
msgstr ""
#: src/gui.py:90
#: src/tabs.py:462
msgid ""
"Usage: /nick <nickname> \n"
"Usage: /part [message]\n"
" Part: disconnect from a room. You can specify an optional message."
msgstr ""
#: src/tabs.py:463
msgid ""
"Usage: /nick <nickname>\n"
"Nick: Change your nickname in the current room"
msgstr ""
#: src/gui.py:219
msgid "Welcome on Poezio \\o/!"
msgstr ""
#: src/gui.py:220
#, python-format
msgid "Your JID is %s"
msgstr ""
#: src/gui.py:281
msgid "Unknown error"
msgstr ""
#: src/gui.py:282
#, python-format
msgid "Error: %(code)s-%(msg)s: %(body)s"
msgstr ""
#: src/gui.py:285
#: src/tabs.py:464
msgid ""
"To provide a password in order to join the room, type \"/join / password"
"\" (replace \"password\" by the real password)"
"Usage: /recolor\n"
"Recolor: Re-assign a color to all participants of the current room, based on "
"the last time they talked. Use this if the participants currently talking "
"have too many identical colors."
msgstr ""
#: src/gui.py:345
#, python-format
msgid "message received for a non-existing room: %s"
msgstr ""
#: src/gui.py:351
#, python-format
msgid "%(nick)s changed the subject to: %(subject)s"
msgstr ""
#: src/gui.py:353
#, python-format
msgid "The subject is: %(subject)s"
msgstr ""
#: src/gui.py:389
#, python-format
msgid "Your nickname is %s"
msgstr ""
#: src/gui.py:391
#, python-format
msgid "%s is in the room"
msgstr ""
#: src/gui.py:402
#, python-format
msgid "%(nick)s joined the room %(roomname)s"
msgstr ""
#: src/gui.py:414
#, python-format
msgid "%(old)s is now known as %(new)s"
msgstr ""
#: src/gui.py:418
#, python-format
msgid "%(old_nick)s is now known as %(new_nick)s"
msgstr ""
#: src/gui.py:437
#, python-format
msgid "You have been kicked by %(by)s. Reason: %(reason)s"
msgstr ""
#: src/gui.py:439
#, python-format
msgid "You have been kicked. Reason: %s"
msgstr ""
#: src/gui.py:442
#, python-format
msgid "%(nick)s has been kicked by %(by)s. Reason: %(reason)s"
msgstr ""
#: src/gui.py:444
#, python-format
msgid "%(nick)s has been kicked. Reason: %(reason)s"
msgstr ""
#: src/gui.py:450 src/gui.py:453
#, python-format
msgid "%s has left the room"
msgstr ""
#: src/gui.py:457
#, python-format
msgid "%s changed his/her status: "
msgstr ""
#: src/gui.py:459
#, python-format
msgid "affiliation: %s,"
msgstr ""
#: src/gui.py:461
#, python-format
msgid "role: %s,"
msgstr ""
#: src/gui.py:463
#, python-format
msgid "show: %s,"
msgstr ""
#: src/gui.py:465
#, python-format
msgid "status: %s,"
msgstr ""
#: src/gui.py:518
#, python-format
msgid "Error: unknown command (%s)"
msgstr ""
#: src/gui.py:534
msgid "Available commands are: "
msgstr ""
#: src/gui.py:537
#: src/tabs.py:465
msgid ""
"\n"
"Type /help <command_name> to know what each command does"
"Usage: /cycle [message]\n"
"Cycle: Leaves the current room and rejoin it immediately"
msgstr ""
#: src/gui.py:542
#: src/tabs.py:466
msgid ""
"Usage: /info <nickname>\n"
"Info: Display some information about the user in the MUC: his/here role, "
"affiliation, status and status message."
msgstr ""
#: src/tabs.py:467
msgid ""
"Usage: /configure\n"
"Configure: Configure the current room, through a form."
msgstr ""
#: src/tabs.py:468
msgid ""
"Usage: /version <jid or nick>\n"
"Version: get the software version of the given JID or nick in room (usually "
"its XMPP client and Operating System)"
msgstr ""
#: src/tabs.py:602
#, python-format
msgid "Unknown command: %s"
msgid "Cannot find user: %s"
msgstr ""
#: src/gui.py:616
#, python-format
msgid "already in room [%s]"
msgstr ""
#: src/gui.py:720
#, python-format
msgid "%s is now ignored"
msgstr ""
#: src/gui.py:722
#, python-format
msgid "%s is already ignored"
msgstr ""
#: src/gui.py:736
#, python-format
msgid "%s was not ignored"
msgstr ""
#: src/gui.py:741
#, python-format
msgid "%s is now unignored"
msgstr ""
#: src/gui.py:798
#: src/tabs.py:610
#, python-format
msgid "The subject of the room is: %s"
msgstr ""
#: src/window.py:135
#: src/tabs.py:664 src/tabs.py:682
#, python-format
msgid "%(nick)s from room %(room)s"
msgid "%s is not in the room"
msgstr ""
#: src/tabs.py:666
#, python-format
msgid "%s is already ignored"
msgstr ""
#: src/tabs.py:669
#, python-format
msgid "%s is now ignored"
msgstr ""
#: src/tabs.py:684
#, python-format
msgid "%s is not ignored"
msgstr ""
#: src/tabs.py:687
#, python-format
msgid "%s is now unignored"
msgstr ""
#: src/tabs.py:822
#, python-format
msgid "5Your nickname is 3%s"
msgstr ""
#: src/tabs.py:891
#, python-format
msgid "1%(spec)s 3You5 have been banned by 4%(by)s"
msgstr ""
#: src/tabs.py:893
#, python-format
msgid "1%(spec)s 3You5 have been banned."
msgstr ""
#: src/tabs.py:896
#, python-format
msgid "1%(spec)s 3%(nick)s5 has been banned by 4%(by)s"
msgstr ""
#: src/tabs.py:898
#, python-format
msgid "1%(spec)s 3%(nick)s5 has been banned"
msgstr ""
#: src/tabs.py:900
#, python-format
msgid "5 Reason: 6%(reason)s5"
msgstr ""
#: src/tabs.py:914
#, python-format
msgid "1%(spec)s 3You5 have been kicked by 3%(by)s"
msgstr ""
#: src/tabs.py:916
#, python-format
msgid "1%(spec)s 3You5 have been kicked."
msgstr ""
#: src/tabs.py:922
#, python-format
msgid "1%(spec)s 3%(nick)s5 has been kicked by 3%(by)s"
msgstr ""
#: src/tabs.py:924
#, python-format
msgid "1%(spec)s 3%(nick)s5 has been kicked"
msgstr ""
#: src/tabs.py:926
#, python-format
msgid "5 Reason: 6%(reason)s"
msgstr ""
#: src/tabs.py:940
#, python-format
msgid "1%(spec)s 3%(nick)s5 has left the room"
msgstr ""
#: src/tabs.py:942
#, python-format
msgid "1%(spec)s 3%(nick)s5 (4%(jid)s5) has left the room"
msgstr ""
#: src/tabs.py:955
#, python-format
msgid "3%s5 changed: "
msgstr ""
#: src/tabs.py:957
#, python-format
msgid "affiliation: %s, "
msgstr ""
#: src/tabs.py:960
#, python-format
msgid "role: %s, "
msgstr ""
#: src/tabs.py:963
#, python-format
msgid "show: %s, "
msgstr ""
#: src/tabs.py:966
#, python-format
msgid "status: %s, "
msgstr ""
#: src/tabs.py:1002 src/tabs.py:1496
msgid ""
"Usage: /unquery\n"
"Unquery: close the tab"
msgstr ""
#: src/tabs.py:1003 src/tabs.py:1497
msgid "Usage: /part\\Part: close the tab"
msgstr ""
#: src/tabs.py:1113
#, python-format
msgid "\"[%(old_nick)s]\" is now known as \"[%(new_nick)s]\""
msgstr ""
#: src/tabs.py:1122
#, python-format
msgid "%(spec)s \"[%(nick)s]\" has left the room"
msgstr ""
#: src/tabs.py:1124
#, python-format
msgid "%(spec)s \"[%(nick)s]\" has left the room \"(%(status)s)\""
msgstr ""
#: src/tabs.py:1155
msgid ""
"Usage: /deny [jid]\n"
"Deny: Use this command to remove and deny your presence to the provided JID "
"(or the selected contact in your roster), who is asking you to be in his/"
"here roster"
msgstr ""
#: src/tabs.py:1156
msgid ""
"Usage: /accept [jid]\n"
"Accept: Use this command to authorize the provided JID (or the selected "
"contact in your roster), to see your presence, and to ask to subscribe to it "
"(mutual presence subscription)."
msgstr ""
#: src/tabs.py:1157
msgid ""
"Usage: /add <jid>\\Add: Use this command to add the specified JID to your "
"roster. The reverse authorization will automatically be accepted if the "
"remote JID accepts your subscription, leading to a mutual presence "
"subscription."
msgstr ""
#: src/tabs.py:1158
msgid ""
"Usage: /remove [jid]\\Remove: Use this command to remove the specified JID "
"from your roster. This wil unsubscribe you from its presence, cancel its "
"subscription to yours, and remove the item from your roster"
msgstr ""
#: src/tabs.py:1159
msgid ""
"Usage: /export [/path/to/file]\n"
"Export: Use this command to export your contacts into /path/to/file if "
"specified, or $HOME/poezio_contacts if not."
msgstr ""
#: src/tabs.py:1160
msgid ""
"Usage: /import [/path/to/file]\n"
"Import: Use this command to import your contacts from /path/to/file if "
"specified, or $HOME/poezio_contacts if not."
msgstr ""
#: src/tabs.py:1206
msgid "No JID specified"
msgstr ""
#: src/tabs.py:1631
msgid ""
"Usage: /close\n"
"Close: Just close this tab"
msgstr ""

View file

@ -670,23 +670,31 @@ class Core(object):
"""
# curses.ungetch(0) # FIXME
while self.running:
char = self.read_keyboard()
char_list = self.read_keyboard()
# Special case for M-x where x is a number
if char.startswith('M-') and len(char) == 3:
try:
nb = int(char[2])
except ValueError:
pass
else:
if self.current_tab().nb == nb:
self.go_to_previous_tab()
if len(char_list) == 1:
char = char_list[0]
if char.startswith('M-') and len(char) == 3:
try:
nb = int(char[2])
except ValueError:
pass
else:
self.command_win('%d' % nb)
# search for keyboard shortcut
if char in self.key_func:
self.key_func[char]()
if self.current_tab().nb == nb:
self.go_to_previous_tab()
else:
self.command_win('%d' % nb)
# search for keyboard shortcut
if char in self.key_func:
self.key_func[char]()
else:
res = self.do_command(char)
if res:
self.refresh_window()
else:
self.do_command(char)
for char in char_list:
self.do_command(char)
self.refresh_window()
self.doupdate()
def current_tab(self):
@ -1419,9 +1427,7 @@ class Core(object):
def do_command(self, key):
if not key:
return
res = self.current_tab().on_input(key)
if res:
self.refresh_window()
return self.current_tab().on_input(key)
def on_roster_enter_key(self, roster_row):
"""

View file

@ -24,8 +24,6 @@ shortcut, like ^A, M-a or KEY_RESIZE)
import time
last_timeout = time.time()
def get_next_byte(s):
"""
Read the next byte of the utf-8 char
@ -41,44 +39,57 @@ def get_next_byte(s):
return (None, c)
return (ord(c), c.encode('latin-1')) # returns a number and a bytes object
def read_char(s):
def read_char(s, timeout=1000):
"""
Read one utf-8 char
see http://en.wikipedia.org/wiki/UTF-8#Description
"""
global last_timeout
s.timeout(1000)
s.timeout(timeout) # The timeout for timed events to be checked every second
ret_list = []
# The list of all chars. For example if you paste a text, the list the chars pasted
# so that they can be handled at once.
(first, char) = get_next_byte(s)
if first is None and char is None:
last_timeout = time.time()
return None
if not isinstance(first, int): # Keyboard special, like KEY_HOME etc
return char
if first == 127 or first == 8:
return "KEY_BACKSPACE"
if first < 127: # ASCII char on one byte
if first <= 26: # transform Ctrl+* keys
char = chr(first + 64)
# if char == 'M' and time.time() - last_char_time < 0.0005:
# char = 'J'
return "^"+char
if first == 27:
second = read_char(s)
res = 'M-%s' % (second,)
return res
if 194 <= first:
(code, c) = get_next_byte(s) # 2 bytes char
char += c
if 224 <= first:
(code, c) = get_next_byte(s) # 3 bytes char
char += c
if 240 <= first:
(code, c) = get_next_byte(s) # 4 bytes char
char += c
try:
return char.decode('utf-8') # return all the concatened byte objets, decoded
except UnicodeDecodeError:
while first is not None or char is not None:
if not isinstance(first, int): # Keyboard special, like KEY_HOME etc
return [char]
if first == 127 or first == 8:
return ["KEY_BACKSPACE"]
s.timeout(0) # we are now getting the missing utf-8 bytes to get a whole char
if first < 127: # ASCII char on one byte
if first <= 26: # transform Ctrl+* keys
char = chr(first + 64)
ret_list.append("^"+char)
(first, char) = get_next_byte(s)
continue
if first == 27:
second = read_char(s, 0)
res = 'M-%s' % (second[0],)
ret_list.append(res)
(first, char) = get_next_byte(s)
continue
if 194 <= first:
(code, c) = get_next_byte(s) # 2 bytes char
char += c
if 224 <= first:
(code, c) = get_next_byte(s) # 3 bytes char
char += c
if 240 <= first:
(code, c) = get_next_byte(s) # 4 bytes char
char += c
try:
ret_list.append(char.decode('utf-8')) # return all the concatened byte objets, decoded
except UnicodeDecodeError:
return None
# s.timeout(1) # timeout to detect a paste of many chars
(first, char) = get_next_byte(s)
if not ret_list:
# nothing at all was read, thats a timed event timeout
return None
if len(ret_list) != 1:
if ret_list[-1] == '^M':
ret_list.pop(-1)
return [char if char != '^M' else '^J' for char in ret_list]
return ret_list
if __name__ == '__main__':
import curses