3 �Z!d?d@�Z"dAdB�Z#dCdD�Z$dEdF�Z%dGdH�Z&dIdJ�Z'dKdL�Z(dMdN�Z)dOdP�Z*dQdR�Z+dSdT�Z,dUdV�Z-dWdX�Z.dYdZ�Z/d[d\�Z0d]d^�Z1d_d`�Z2dadb�Z3dcdd�Z4dedf�Z5dgdh�Z6didj�Z7dkdl�Z8dmdn�Z9dodp�Z:dqdr�Z;dsdt�Zdydz�Z?d{d|�Z@d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d��ZAd�d�d�d��ZBd�d��ZCd�d��ZDd�d��ZEd�d��ZFd�d��ZGd�d��ZHd�d��ZId�d��ZJd�d��ZKd�S)�rcCs<d|_d|_g|_|j�d|_d|_g|_d|_i|_dS)zInitialize the scanner.F�rTN�����) �done� flow_level�tokens�fetch_stream_start� tokens_taken�indent�indents�allow_simple_key�possible_simple_keys)rr r r r0s zScanner.__init__cGsJx|j�r|j�qW|jrF|s$dSx |D]}t|jd|�r*dSq*WdS)NTrF)�need_more_tokens�fetch_more_tokensr� isinstance)r�choicesZchoicer r r � check_tokenqs   zScanner.check_tokencCs*x|j�r|j�qW|jr&|jdSdS)Nr)rr r)rr r r � peek_token}s  zScanner.peek_tokencCs:x|j�r|j�qW|jr6|jd7_|jjd�SdS)Nrr)rr rr�pop)rr r r � get_token�s   zScanner.get_tokencCs2|jr dS|jsdS|j�|j�|jkr.dSdS)NFT)rr�stale_possible_simple_keys�next_possible_simple_keyr)rr r r r�szScanner.need_more_tokenscCs�|j�|j�|j|j�|j�}|dkr4|j�S|dkrL|j�rL|j�S|dkrd|j�rd|j �S|dkr||j �r||j �S|dkr�|j �S|dkr�|j �S|dkr�|j�S|dkr�|j�S|d kr�|j�S|dkr�|j�r�|j�S|d kr�|j�r�|j�S|d k�r|j��r|j�S|d k�r*|j�S|d k�r<|j�S|dk�rN|j�S|dk�rj|j �rj|j�S|dk�r�|j �r�|j�S|dk�r�|j�S|dk�r�|j�S|j��r�|j �St!ddd||j"���dS)N��%�-�.�[�{�]�}�,�?�:r�&�!�|�>�'�"z!while scanning for the next tokenz.found character %r that cannot start any token)#�scan_to_next_tokenr'� unwind_indentr�peek�fetch_stream_end�check_directive�fetch_directive�check_document_start�fetch_document_start�check_document_end�fetch_document_end�fetch_flow_sequence_start�fetch_flow_mapping_start�fetch_flow_sequence_end�fetch_flow_mapping_end�fetch_flow_entry�check_block_entry�fetch_block_entry� check_key� fetch_key� check_value� fetch_value� fetch_alias� fetch_anchor� fetch_tagr� fetch_literal� fetch_folded� fetch_single� fetch_double� check_plain� fetch_plainr�get_mark)r�chr r r r �s^        zScanner.fetch_more_tokenscCs:d}x0|jD]&}|j|}|dks,|j|kr |j}q W|S)N)rr )rZmin_token_number�level�keyr r r r(s    z Scanner.next_possible_simple_keycCs`xZt|j�D]L}|j|}|j|jks6|j|jdkr |jrPtd|jd|j���|j|=q WdS)Nizwhile scanning a simple keyzcould not find expected ':')�listrrrr rrrX)rrZr[r r r r's   z"Scanner.stale_possible_simple_keyscCs^|j o|j|jk}|jrZ|j�|jt|j�}t|||j |j |j|j ��}||j |j<dS)N) rrrr�remove_possible_simple_keyr�lenrr rrrXr)rr r r[r r r �save_possible_simple_key$sz Scanner.save_possible_simple_keycCs@|j|jkr<|j|j}|jr2td|jd|j���|j|j=dS)Nzwhile scanning a simple keyzcould not find expected ':')rrr rrrX)rr[r r r r]5s    z"Scanner.remove_possible_simple_keycCsD|jr dSx4|j|kr>|j�}|jj�|_|jjt||��q WdS)N)rrrXrr%r�appendZ BlockEndToken)rrrr r r r;Bs   zScanner.unwind_indentcCs&|j|kr"|jj|j�||_dSdS)NTF)rrr`)rrr r r � add_indentZs  zScanner.add_indentcCs$|j�}|jjt|||jd��dS)N)�encoding)rXrr`ZStreamStartTokenrb)rrr r r rds zScanner.fetch_stream_startcCsB|jd�|j�d|_i|_|j�}|jjt||��d|_dS)NrFTr) r;r]rrrXrr`ZStreamEndTokenr)rrr r r r=ps zScanner.fetch_stream_endcCs,|jd�|j�d|_|jj|j��dS)NrFr)r;r]rrr`�scan_directive)rr r r r?�s zScanner.fetch_directivecCs|jt�dS)N)�fetch_document_indicatorZDocumentStartToken)rr r r rA�szScanner.fetch_document_startcCs|jt�dS)N)rdZDocumentEndToken)rr r r rC�szScanner.fetch_document_endcCsH|jd�|j�d|_|j�}|jd�|j�}|jj|||��dS)NrF�r)r;r]rrX�forwardrr`)r� TokenClass� start_mark�end_markr r r rd�s  z Scanner.fetch_document_indicatorcCs|jt�dS)N)�fetch_flow_collection_startZFlowSequenceStartToken)rr r r rD�sz!Scanner.fetch_flow_sequence_startcCs|jt�dS)N)rjZFlowMappingStartToken)rr r r rE�sz Scanner.fetch_flow_mapping_startcCsJ|j�|jd7_d|_|j�}|j�|j�}|jj|||��dS)NrT)r_rrrXrfrr`)rrgrhrir r r rj�sz#Scanner.fetch_flow_collection_startcCs|jt�dS)N)�fetch_flow_collection_endZFlowSequenceEndToken)rr r r rF�szScanner.fetch_flow_sequence_endcCs|jt�dS)N)rkZFlowMappingEndToken)rr r r rG�szScanner.fetch_flow_mapping_endcCsJ|j�|jd8_d|_|j�}|j�|j�}|jj|||��dS)NrF)r]rrrXrfrr`)rrgrhrir r r rk�sz!Scanner.fetch_flow_collection_endcCs<d|_|j�|j�}|j�|j�}|jjt||��dS)NT)rr]rXrfrr`ZFlowEntryToken)rrhrir r r rH�s zScanner.fetch_flow_entrycCs�|jsF|jstddd|j���|j|j�rF|j�}|jjt||��nd|_|j �|j�}|j �|j�}|jjt ||��dS)Nz%sequence entries are not allowed hereT) rrrrXrarrr`ZBlockSequenceStartTokenr]rfZBlockEntryToken)rrrhrir r r rJ�s  zScanner.fetch_block_entrycCs�|jsD|jstddd|j���|j|j�rD|j�}|jjt||��|j |_|j �|j�}|j �|j�}|jjt ||��dS)Nz!mapping keys are not allowed here) rrrrXrarrr`�BlockMappingStartTokenr]rf�KeyToken)rrrhrir r r rLs   zScanner.fetch_keycCs|j|jkr||j|j}|j|j=|jj|j|jt|j|j��|jst|j|j �rt|jj|j|jt |j|j��d|_ n\|js�|j s�t ddd|j ���|js�|j|j �r�|j �}|jjt ||��|j |_ |j�|j �}|j�|j �}|jjt||��dS)NFz#mapping values are not allowed here)rrr�insertr rrmrrarrlrrrXr`r]rfZ ValueToken)rr[rrhrir r r rNs2       zScanner.fetch_valuecCs$|j�d|_|jj|jt��dS)NF)r_rrr`� scan_anchorZ AliasToken)rr r r rOVszScanner.fetch_aliascCs$|j�d|_|jj|jt��dS)NF)r_rrr`roZ AnchorToken)rr r r rPaszScanner.fetch_anchorcCs"|j�d|_|jj|j��dS)NF)r_rrr`�scan_tag)rr r r rQlszScanner.fetch_tagcCs|jdd�dS)Nr6)�style)�fetch_block_scalar)rr r r rRwszScanner.fetch_literalcCs|jdd�dS)Nr7)rq)rr)rr r r rSzszScanner.fetch_foldedcCs$d|_|j�|jj|j|��dS)NT)rr]rr`�scan_block_scalar)rrqr r r rr}szScanner.fetch_block_scalarcCs|jdd�dS)Nr8)rq)�fetch_flow_scalar)rr r r rT�szScanner.fetch_singlecCs|jdd�dS)Nr9)rq)rt)rr r r rU�szScanner.fetch_doublecCs$|j�d|_|jj|j|��dS)NF)r_rrr`�scan_flow_scalar)rrqr r r rt�szScanner.fetch_flow_scalarcCs"|j�d|_|jj|j��dS)NF)r_rrr`� scan_plain)rr r r rW�szScanner.fetch_plaincCs|jdkrdSdS)NrT)r)rr r r r>�s zScanner.check_directivecCs.|jdkr*|jd�dkr*|jd�dkr*dSdS)Nrrez---u …

T)r�prefixr<)rr r r r@�s zScanner.check_document_startcCs.|jdkr*|jd�dkr*|jd�dkr*dSdS)Nrrez...u …

T)rrwr<)rr r r rB�s zScanner.check_document_endcCs|jd�dkS)Nru …

)r<)rr r r rI�szScanner.check_block_entrycCs|jr dS|jd�dkSdS)NTru …

)rr<)rr r r rK�szScanner.check_keycCs|jr dS|jd�dkSdS)NTru …

)rr<)rr r r rM�szScanner.check_valuecCs6|j�}|dkp4|jd�dko4|dkp4|j o4|dkS)Nu …

-?:,[]{}#&*!|>'"%@`ru …

r+z?:)r<r)rrYr r r rV�szScanner.check_plaincCs�|jdkr|j�dkr|j�d}xb|s�x|j�dkr@|j�q*W|j�dkrhx|j�dkrf|j�qPW|j�r~|js�d|_q$d}q$WdS)NruF� �#u …

T)rr<rf�scan_line_breakrr)r�foundr r r r:�s   zScanner.scan_to_next_tokencCs�|j�}|j�|j|�}d}|dkr:|j|�}|j�}n>|dkrV|j|�}|j�}n"|j�}x|j�dkrv|j�q`W|j|�t||||�S)NZYAMLZTAGu …

)rXrf�scan_directive_name�scan_yaml_directive_value�scan_tag_directive_valuer<�scan_directive_ignored_lineZDirectiveToken)rrh�name�valuerir r r rcs       zScanner.scan_directivecCs�d}|j|�}xfd|ko"dkns`d|ko:dkns`d|koRdkns`|dkrt|d 7}|j|�}qW|s�td |d ||j���|j|�}|j|�|j�}|d kr�td |d ||j���|S) Nr�0�9�A�Z�a�zz-_rzwhile scanning a directivez6expected alphabetic or numeric character, but found %ru …

)r<rrXrwrf)rrh�lengthrYr�r r r r|#s$ J  zScanner.scan_directive_namecCs�x|j�dkr|j�qW|j|�}|j�dkrJtd|d|j�|j���|j�|j|�}|j�dkr�td|d|j�|j���||fS)Nrxr,zwhile scanning a directivez%expected a digit or '.', but found %ru …

z%expected a digit or ' ', but found %r)r<rf�scan_yaml_directive_numberrrX)rrh�major�minorr r r r}8s         z!Scanner.scan_yaml_directive_valuecCs�|j�}d|kodkns6td|d||j���d}x*d|j|�koTdknrd|d7}q|j�q(W|j�}|dkrftd|d||j���|j�dS)Nrxryu …

zwhile scanning a directivez0expected a comment or a line break, but found %r)r<rfrrXrz)rrhrYr r r rrs   z#Scanner.scan_directive_ignored_linec Cs|j�}|j�}|dkrd}nd}|j�d}|j|�}xfd|koLdkns�d|koddkns�d |ko|d kns�|d kr�|d 7}|j|�}q:W|s�td ||d||j���|j|�}|j|�|j�}|dkr�td ||d||j���|j�}||||�S)Nr�aliasZanchorrr�r�r�r�r�r�z-_rzwhile scanning an %sz6expected alphabetic or numeric character, but found %ru …

?:,]}%@`)rXr<rfrrw) rrgrhZ indicatorr�r�rYr�rir r r ro�s2  J    zScanner.scan_anchorc Cs&|j�}|jd�}|dkrdd}|jd�|jd|�}|j�dkrZtd|d|j�|j���|j�n~|dkr~d}d }|j�ndd}d }x,|d kr�|d kr�d }P|d7}|j|�}q�Wd }|r�|jd|�}n d }|j�|jd|�}|j�}|d k�r td |d||j���||f}|j�}t|||�S)Nr�<��tagr7zwhile parsing a tagzexpected '>', but found %ru …

r5Fu …

Tzwhile scanning a tagzexpected ' ', but found %r)rXr<rfr�rr�ZTagToken) rrhrYr��suffixr�Z use_handler�rir r r rp�sH           zScanner.scan_tagcCs�|dkrd}nd}g}|j�}|j�|j|�\}}|j|�|jd}|dkrTd}|dkrv|j�\}} } t|| �} n||d} |j| �\}} d} x�|j| ko�|j �dk�rt|j |�|j �dk} d}x|j |�d kr�|d7}q�W|j |j |��|j|�|j �} |j| �\}} |j| k�rp|j �dk�rp|�rd| d k�rd| �rd|j �dk�rd|�sn|j d �n |j | �q�Pq�W|dk �r�|j | �|dk�r�|j |�tdj|�d|| |�S) Nr7TFr�r)z ru …

� rx)rXrf�scan_block_scalar_indicators�scan_block_scalar_ignored_liner�scan_block_scalar_indentation�max�scan_block_scalar_breaksrr<�extendr`rwrz� ScalarToken�join)rrqZfolded�chunksrh�chomping� incrementZ min_indent�breaks� max_indentrir� line_breakZleading_non_spacer�r r r rs�sP              zScanner.scan_block_scalarcCs�d}d}|j�}|dkrn|dkr&d}nd}|j�|j�}|dkr�t|�}|dkrdtd|d|j���|j�n\|dkr�t|�}|dkr�td|d|j���|j�|j�}|dkr�|dkr�d}nd}|j�|j�}|d kr�td|d ||j���||fS) Nz+-�+TF� 0123456789rzwhile scanning a block scalarz|j�q(W|j�}|dkrftd|d||j���|j�dS)Nrxryu …

zwhile scanning a block scalarz0expected a comment or a line break, but found %r)r<rfrrXrz)rrhrYr r r r�As    z&Scanner.scan_block_scalar_ignored_linecCshg}d}|j�}xL|j�dkr\|j�dkrB|j|j��|j�}q|j�|j|kr|j}qW|||fS)Nru …

rx)rXr<r`rzrfr)rr�r�rir r r r�Os    z%Scanner.scan_block_scalar_indentationcCs�g}|j�}x"|j|kr.|j�dkr.|j�qWxJ|j�dkrz|j|j��|j�}x"|j|krv|j�dkrv|j�qVWq2W||fS)Nrxu …

)rXrr<rfr`rz)rrr�rir r r r�^s z Scanner.scan_block_scalar_breakscCs�|dkrd}nd}g}|j�}|j�}|j�|j|j||��x4|j�|krt|j|j||��|j|j||��qBW|j�|j�}tdj|�d|||�S)Nr9TFr�)rXr<rfr��scan_flow_scalar_non_spaces�scan_flow_scalar_spacesr�r�)rrq�doubler�rhZquoterir r r rukszScanner.scan_flow_scalarr)��� r�� � � �rxr9�\�…� u
u
)r�r��b�tr��n�v�f�r�erxr9r��N�_�L�Pr���)�x�u�UcCs�g}�x�d}x|j|�dkr&|d7}qW|rF|j|j|��|j|�|j�}| r�|dkr�|jd�dkr�|jd�|jd�q|r�|dks�| r�|dkr�|j|�|j�q|o�|dk�r�|j�|j�}||jkr�|j|j|�|j�n�||jk�r||j|}|j�xBt|�D]6}|j|�dk�rtd |d ||j|�f|j����qWt |j|�d �}|jt |��|j|�n<|d k�r�|j �|j |j ||��ntd |d ||j���q|SqWdS)Nru'"\ …

rr8r�z"\r��0123456789ABCDEFabcdefz%while scanning a double-quoted scalarz?expected escape sequence of %d hexdecimal numbers, but found %r�u …

z!found unknown escape character %r)r<r`rwrf�ESCAPE_REPLACEMENTS� ESCAPE_CODES�rangerrXr��chrrzr��scan_flow_scalar_breaks)rr�rhr�r�rY�k�coder r r r��sL            z#Scanner.scan_flow_scalar_non_spacesc Cs�g}d}x|j|�dkr"|d7}q W|j|�}|j|�|j�}|dkr\td|d|j���nT|dkr�|j�}|j||�}|dkr�|j|�n|s�|jd �|j|�n |j|�|S) Nrz rr)zwhile scanning a quoted scalarzfound unexpected end of streamu …

r�rx) r<rwrfrrXrzr�r`r�) rr�rhr�r�� whitespacesrYr�r�r r r r��s(        zScanner.scan_flow_scalar_spacescCs�g}xx|jd�}|dks |dkr@|jd�dkr@td|d|j���x|j�dkrX|j�qBW|j�dkrv|j|j��q|SqWdS) Nrez---z...u …

zwhile scanning a quoted scalarz#found unexpected document separatorz u …

)rwr<rrXrfr`rz)rr�rhr�rwr r r r��s    zScanner.scan_flow_scalar_breakscCsNg}|j�}|}|jd}g}�xd}|j�dkr4PxP|j|�}|dksx|j rj|dkrj|j|d�dksx|jrz|dkrzP|d7}q6W|jr�|dkr�|j|d�dkr�|j|�td|d |j�d ��|dkr�Pd |_|j|�|j|j |��|j|�|j�}|j ||�}| �s4|j�dk�s4|j r"|j |kr"Pq"Wt d j |�d ||�S)Nrrryu …

r3z,:?[]{}u …

,[]{}zwhile scanning a plain scalarzfound unexpected ':'zGPlease check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.Fr�T)rXrr<rrfrrr�r`rw�scan_plain_spacesrr�r�)rr�rhrirZspacesr�rYr r r rv�sF        zScanner.scan_plainc Cs.g}d}x|j|�dkr"|d7}q W|j|�}|j|�|j�}|dk�r|j�}d|_|jd�}|dksr|dkr�|jd�d kr�dSg} x`|j�d kr�|j�dkr�|j�q�| j|j��|jd�}|dks�|dkr�|jd�d kr�dSq�W|d kr�|j|�n| �s|jd�|j| �n|�r*|j|�|S) Nrrxru …

Trez---z...u …

u …

r�)r<rwrfrzrr`r�) rrrhr�r�r�rYr�rwr�r r r r�!s>            zScanner.scan_plain_spacescCs�|j�}|dkr*td||d||j���d}|j|�}|dkr�xfd|koTdkns�d|kold kns�d |ko�d kns�|d kr�|d7}|j|�}qBW|dkr�|j|�td||d||j���|d7}|j|�}|j|�|S) Nr5zwhile scanning a %szexpected '!', but found %rrrxr�r�r�r�r�r�z-_)r<rrXrfrw)rr�rhrYr�r�r r r r�Fs&  J    zScanner.scan_tag_handlecCs�g}d}|j|�}x�d|ko&dknsdd|ko>dknsdd|koVdknsd|dkr�|d kr�|j|j|��|j|�d}|j|j||��n|d 7}|j|�}qW|r�|j|j|��|j|�d}|s�td ||d ||j���d j|�S)Nrr�r�r�r�r�r�z-;/?:@&=+$,_.!~*'()[]%r*rzwhile parsing a %szexpected URI, but found %rr�)r<r`rwrf�scan_uri_escapesrrXr�)rr�rhr�r�rYr r r r�^s( J   zScanner.scan_tag_uricCs�g}|j�}xx|j�dkr�|j�x>td�D]2}|j|�dkr,td||d|j|�|j���q,W|jt|jd�d��|jd�qWyt|�j d�}Wn8t k r�}ztd||t |�|��WYdd}~XnX|S)Nr*r�r�zwhile scanning a %szBexpected URI escape sequence of 2 hexdecimal numbers, but found %rr�zutf-8) rXr<rfr�rr`r�rw�bytes�decode�UnicodeDecodeError�str)rr�rhZcodesrr�r��excr r r r�ws  (zScanner.scan_uri_escapescCsN|j�}|dkr6|jd�dkr*|jd�n|j�dS|dkrJ|j�|SdS)Nu Â…r�z r�u

r�)r<rwrf)rrYr r r rz�s  zScanner.scan_line_breakN)Lrrrrr#r$r&rr r(r'r_r]r;rarr=r?rArCrdrDrErjrFrGrkrHrJrLrNrOrPrQrRrSrrrTrUrtrWr>r@rBrIrKrMrVr:rcr|r}r�r~r�r�rrorprsr�r�r�r�rur�r�r�r�r�rvr�r�r�r�rzr r r r r.s�A   l    !8       #    $)L( +/%N)�__all__�errorrrrr rr r r r �s