30-11-2008

blip, curses i dynamiczna podmiana kodu w pythonie

W związku z poniedziałkiem zacząłem się zastanawiać, czy nie lepiej poszukać konsolowej metody na blipanie. Coby blipa odpalić pod konsolą w domu, połączenie via ssh, coby mi nikt w pakiety nie zaglądał.
Ponieważ ^leafnode powiedział, że napisać klienta blipa w curses to dwie godziny, a za mną od dawna chodziło poprawienie mojej innej cursesowej aplikacyjki (tej), aka zobaczenie co w curses możnaby nowego poznać, zakasałem rękawy i napisałem coś.
Owo coś miało bugi, nie umiało czytać polskich literek w obiekcie curses.textpad.Textbox, więc trzeba było coś poprawić. Skończyło się na zajrzeniu do źródełem modułów curses.textpad i curses.ascii i dynamicznej podmianie dwóch funkcji w moim kodzie. A oto co zrobiłem:

wyświetlanie polskich liter w Textboksie


Textbox korzysta z funkcji zdefiniowanych w module curses.ascii żeby rozpoznać, co za znak mu wklepaliśmy. Wyświetlane są znaki, dla których funkcja isprint(c) zwraca True. A jak to sprawdza?

def isprint(c): return _ctoi(c) >= 32 and _ctoi(c) <= 126

Bóóó.
Polskie literki, jako nienależące do podstawowych znaków ascii nie nadały się do tego.
Zapytałem o radę na stackoverflow.com. Zgodnie z sugestią tam w moim kodzie zdefiniowałem funkcję:

def isprint(ch):
try:
x = unicodedata.category(chr(ch).decode('iso-8859-2'))[0] in 'LNPS'
if x or (curses.ascii._ctoi(ch) >= 32 and curses.ascii._ctoi(ch) <= 126):
return True
except:
pass
return False
curses.ascii.isprint = isprint # WOW!!

Ostatnia linijka dynamicznie podmienia fukcję zdefiniowaną zupełnie gdzie indziej na moją. Dzięki czemu, bez ingerencji w źródło oryginalnego modułu (bo naprawdę nie wiem co moje rozwiązanie może popsuć na dłuższą metę) możemy modyfikować zachowanie tegoż.
Teraz już wpisywanie polskich literek zaczęło działać.

odczyt z pola Textbox


mnie trochę zaskoczył. W trakcie wołana jest fukcja curses.ascii.ascii, która w oryginale wygląda tak:

def ascii(c):
if type(c) == type(""):
return chr(_ctoi(c) & 0x7f)
else:
return _ctoi(c) & 0x7f

W jej wyniku moje wpisane w pole tekstowe 'ą' było zwracane jako '1'.
Bóó again.
No ale wystarczyło znów dokonać podmiany w moim kodzie na coś prostszego:

def asci(ch):
if type(ch) == type(""):
return chr(curses.ascii._ctoi(ch))
else:
return curses.ascii._ctoi(ch)
curses.ascii.ascii = asci

...i naprawdę nie wiem co w ten sposób popsułem, ale wolę nie myśleć. W każdym razie teraz 'ą' jest zwracane jako 'ą'.

I tym samym

blipCurses pozwala wysyłać polskie literki:)


To tytułem ogłoszenia.
Tutaj można pobrać blipcursesa i nawet zobaczyć screena!

Enjoy it as I do.

1 comments:

Anonimowy pisze...

Nice brief and this post helped me alot in my college assignement. Thank you seeking your information.