)L i dZddlmZddlZddlmZmZmZddlm Z ddl m Z dd l m Z d gZejd ej d zd zZejd ej d zdzZejd ej d zdzZejd ej d zdzZGddZGddeeefZeZGdd Zy)z Parser for VT100 input stream. ) annotationsN)CallableDict Generator)KeyPress)Keys)ANSI_SEQUENCES Vt100Parser^z \d+;\d+R\Zz(z:_IsPrefixOfLongerMatchCache.__missing__..9s/Aq<<'AKs%()_cpr_response_prefix_rematch_mouse_event_prefix_reanyr items)selfr results ` r __missing__z'_IsPrefixOfLongerMatchCache.__missing__0s] # ( ( 04J4P4P 5 F*002F V  rN)r strreturnbool)rrrrr)rrrrr*s  rrcfeZdZdZd dZd ddZddZddZddZ ddZ ddZ dd Z dd Z y )r aZ Parser for VT100 input stream. Data can be fed through the `feed` method and the given callback will be called with KeyPress objects. :: def callback(key): pass i = Vt100Parser(callback) i.feed('data...') :attr feed_key_callback: Function that will be called when a key is parsed. c2||_|jyr)feed_key_callbackreset)r'r/s r__init__zVt100Parser.__init__Ys!2 rc2d|_|jy)NF)_in_bracketed_paste _start_parser)r'requests rr0zVt100Parser.reset]s#(  rcd|j|_|jjdy)z- Start the parser coroutine. N)_input_parser_generator _input_parsersendr's rr4zVt100Parser._start_parseras)"99; %rctj|rtjStj|rtj S t |S#t$rYywxYw)zD Return the key (or keys) that maps to this prefix. N)_cpr_response_rer#r CPRResponse_mouse_event_reVt100MouseEventr KeyError)r'r s r _get_matchzVt100Parser._get_matchhsZ  ! !& )## #  " "6 *'' ' !&) )  s A A! A!c#Kd}d}d} d}|rd}nd}t|trd}n||z }|rt|}|j|}|s|s|r|j ||d}nw|s|ss|sqd}d}t t |ddD]5}|j|d|}|s|j ||d|||d}d}7|s|j |d|d|dd}ҭw)zA Coroutine (state machine) for the input parser. FTNrr ) isinstancer _IS_PREFIX_OF_LONGER_MATCH_CACHErA _call_handlerrangelen) r'r retryflushcis_prefix_of_longer_matchr#foundis rr7z#Vt100Parser._input_parser_generator{s Ea( EaKF,LV,T)/!:&&uf5F#Cct|tr-t|D]\}}|j||dk(r|nd y|tj k(rd|_d|_y|jt||y)z& Callback to handler. rrCTN) rEtuple enumeraterGr BracketedPaster3 _paste_bufferr/r)r'key insert_textrOrs rrGzVt100Parser._call_handlersv c5 ! "# E1""1Q!VkD Ed)))+/(%'"&&x['ABrc$|jr|xj|z c_d}||jvr|jj|}|jd|}|jt t j |d|_|j|t|zd}d|_|j|yyt|D]B\}}|jr|j||dy|jj|Dy)zV Feed the input stream. :param data: Input string (unicode). z[201~NFrC) r3rTindexr/rr rSrIfeedrRr8r9)r'dataend_mark end_index paste_content remainingrOrLs rrYzVt100Parser.feeds  # #   $ & "H4--- ..44X> !% 2 2:I > &&x0C0C]'ST,1( ..y3x=/H/JK %'" )$. "$ /1++IId12h'&&++A. /rcJ|jjty)a= Flush the buffer of the input stream. This will allow us to handle the escape key (or maybe meta) sooner. The input received by the escape key is actually the same as the first characters of e.g. Arrow-Up, so without knowing what follows the escape sequence, we don't know whether escape has been pressed, or whether it's something else. This flush function should be called after a timeout, and processes everything that's still in the buffer as-is, so without assuming any characters will follow. N)r8r9rr:s rrKzVt100Parser.flushs )rcF|j||jy)z8 Wrapper around ``feed`` and ``flush``. N)rYrK)r'rZs rfeed_and_flushzVt100Parser.feed_and_flushs $ rN)r/zCallable[[KeyPress], None]r+None)F)r5r,r+rb)r+rb)r r*r+zNone | Keys | tuple[Keys, ...])r+z#Generator[None, str | _Flush, None])rUzstr | Keys | tuple[Keys, ...]rVr*r+rb)rZr*r+rb) rrrrr1r0r4rAr7rGrYrKrarrrr r FsR $&&0,dC0C?BC C($/L *r)r __future__rretypingrrrkey_binding.key_processorrkeysr ansi_escape_sequencesr __all__compileescaper<r>r"r$rr*r,rrFr rrrrls# ,,01 2::cIBIIg$66FG"**S9299W#558PPQ %"**S9299W+=%= %KL#C)"))G*<$