U
    ª€lj  ã                   @   sv   d Z ddlZddlmZ eƒ ZG dd„ dƒZG dd„ dƒZd edjej	ƒ¡Z
i Zej	D ]ZeD ]Zeee< q`qX[dS )	zGModule to parse ANSI escape sequences

Maintainer: Jean-Paul Calderone
é    N)ÚLoggerc                   @   sN   e Zd ZdZdZedd„ eD ƒƒZeeeƒƒ\Z	Z
ZZZZZZdZdd„ ZdS )	Ú	ColorTextzb
    Represents an element of text along with the texts colors and
    additional attributes.
    )ÚbÚrÚgÚyÚlÚmÚcÚwc                 c   s   | ]}|  ¡ V  qd S ©N)Úupper)Ú.0Úx© r   ú9/tmp/pip-unpacked-wheel-aghyhbke/twisted/conch/ui/ansi.pyÚ	<genexpr>   s     zColorText.<genexpr>)ZBlackZRedZGreenZYellowZBlueZMagentaZCyanÚWhitec	           	      C   sP   |||  | _ | _| _|| _|| _|| _|| _|| _| jrL| j| j | _| _d S r   )ÚtextÚfgÚbgÚdisplayÚboldÚ	underlineÚflashÚreverse)	Úselfr   r   r   r   r   r   r   r   r   r   r   Ú__init__)   s    zColorText.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCOLORSÚtupleÚBOLD_COLORSÚrangeÚlenÚBLACKÚREDÚGREENÚYELLOWÚBLUEÚMAGENTAÚCYANÚWHITEZCOLOR_NAMESr   r   r   r   r   r      s   r   c                   @   s€   e Zd ZdZdZdZdZdZdZeeeeefZ	dd„ Z
d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zejfdd„Zdd„ ZdS )Ú
AnsiParserz&
    Parser class for ANSI codes.
    )ÚHÚfÚAÚBÚCÚDÚRÚsÚuÚdÚG)ÚJÚKÚP)Úhr   )Úp)r	   c                 C   sD   || | _ | _| j | j | _| _d\| _| _| _| _d| _d| _	d S )N©r   r   r   r   é   Ú )
Ú	defaultFGÚ	defaultBGÚ	currentFGÚ	currentBGr   r   r   r   r   Úprepend)r   rC   rD   r   r   r   r   J   s
    zAnsiParser.__init__c                 C   s„   d}d}d}t |ƒ}||k r€|dkr6|| tkr6d}n@|rv| d|¡}|dkr^|||d…  S ||||…  }|}d}|d }q|S )zF
        Remove all ANSI color escapes from the given string.
        rB   rA   r   úéÿÿÿÿN)r&   Ú_setsÚfind)r   ÚstringÚresultÚshowÚiÚLÚnr   r   r   ÚstripEscapesQ   s     
zAnsiParser.stripEscapesc                 C   s   d S r   r   )r   Zcolorstrr   r   r   ÚwriteStringg   s    zAnsiParser.writeStringc           	      C   sz  | j r| j | }d| _ | d¡}t|ƒdkrD|  |  |d ¡¡ �n2|  |  |d ¡¡ |dd… D �]}t|ƒ}d}d}||k r || tjd kr–q |d7 }qz|s°d| _  dS |d dkrÜ|  |  ||d d… ¡¡ qdn|dd… }|d8 }||d k�r
d| _  dS t || d¡}|dk�r&qd|t	j
k�rj|  |d|d … ¡ ||d d… }|  |  |¡¡ qd|t	jk�r´|d|d … ||d d…  }}|  |¡ |  |  |¡¡ qd|t	jk�rþ|d|d … ||d d…  }}|  |¡ |  |  |¡¡ qd|t	jk�r,||d d… }|  |  |¡¡ qd||k�rBd| | _ qdtjd	|| d
� ||d d… }|  |  |¡¡ qddS )zK
        Turn a string input into a list of L{ColorText} elements.
        rB   rH   rA   r   Nz[;?ú[z[z+Unhandled ANSI control type: {control_type})Zcontrol_type)rG   Úsplitr&   rS   Ú
formatTextrL   ÚdigitsÚ_setmapÚgetr/   Ú	COLOR_SETÚ
parseColorÚ
CURSOR_SETÚparseCursorÚ	ERASE_SETÚ
parseEraseÚMODE_SETÚ_logÚwarn)	r   ÚstrÚpartsr7   rP   rO   ÚtypeÚcursorÚeraser   r   r   ÚparseStringj   sh    



"
"

 ÿzAnsiParser.parseStringc                 C   sØ  |dd… }|sd}zt t| d¡ƒ}W n6 tk
r^   tjd|d� | j| j | _| _	Y dS X |D �]l}|dkr | j| j | _| _	d\| _
| _| _| _d	| _qd|d	kr°d	| _
qdd
|  krÄdkrÔn n|d
 | _qdd|  krêdk� rún n|d | _	qd|dk�r| j| _qd|dk�r"| j| _	qd|dk�r4d	| _qd|dk�rFd	| _qd|dk�rXd	| _qd|dk�rjd| _qd|dk�r|d| _
qd|dk�rŽd| _qd|dk�r d| _qd|dk�r²d| _qd|dk�rÄd	| _qdtjd|d� qddS )z5
        Handle a single ANSI color sequence
        NrI   Ú0ú;z)Invalid ANSI color sequence: {sequence!r})Úsequencer   r@   rA   é   é%   é(   é/   é'   é1   é   é   é   é   é   é   é   é   é   z*Unrecognised ANSI color command: {command})Úcommand)ÚmapÚintrU   Ú
ValueErrorra   ÚerrorrC   rD   rE   rF   r   r   r   r   r   Zblink)r   rc   rd   r   r   r   r   r[   ©   sV    













zAnsiParser.parseColorc                 C   s   d S r   r   )r   rf   r   r   r   r]   Þ   s    zAnsiParser.parseCursorc                 C   s   d S r   r   )r   rg   r   r   r   r_   á   s    zAnsiParser.parseErasec                 C   s*   |rt j| S | jr|| p$t j| S d S r   )r   r"   r   )r   ÚvalueÚmodeZBOLDr   r   r   Ú	pickColorä   s    
zAnsiParser.pickColorc              	   C   s4   t ||  | jd¡|  | jd¡| j| j| j| j| jƒS )Nr   rA   )	r   r‚   rE   rF   r   r   r   r   r   )r   r   r   r   r   rV   ê   s    øzAnsiParser.formatTextN)r   r   r    r!   r\   r^   r`   Z
ASSIGN_SETrZ   ÚSETSr   rR   rS   rh   r[   r]   r_   r   r$   r‚   rV   r   r   r   r   r/   4   s    ?5r/   rB   )r!   rL   Ztwisted.loggerr   ra   r   r/   Újoinr|   rƒ   rJ   rX   r7   r   r   r   r   r   Ú<module>   s   " D
