U
    ‰d"&  ã                   @  sò   d dl mZ d dlmZ d dlmZmZmZ d dlm	Z	m
Z
 d dlmZ ddlmZ dd	gZG d
d„ dƒZdd„ e
 ¡ D ƒZdd„ e	 ¡ D ƒZi ZeejƒD ]*\Z\ZZZded›ed›ed›ee< qœdddœdd	„ZG dd„ deƒZeƒ ZdS )é    )Úannotations)Ú	Formatter)Ú	GeneratorÚListÚOptional)ÚBG_ANSI_COLORSÚFG_ANSI_COLORS)Ú_256_colorsé   )ÚStyleAndTextTuplesÚANSIÚansi_escapec                   @  sŠ   e Zd ZdZdddœdd„Zddœd	d
„Zdddœdd„Zddœdd„Zddœdd„Zddœdd„Z	ddd dœdd„Z
dd dœdd„ZdS )r   aÒ  
    ANSI formatted text.
    Take something ANSI escaped text, for use as a formatted string. E.g.

    ::

        ANSI('\x1b[31mhello \x1b[32mworld')

    Characters between ``\001`` and ``\002`` are supposed to have a zero width
    when printed, but these are literally sent to the terminal output. This can
    be used for instance, for inserting Final Term prompt commands.  They will
    be translated into a prompt_toolkit '[ZeroWidthEscape]' fragment.
    ÚstrÚNone)ÚvalueÚreturnc                 C  sl   || _ g | _d | _d | _d| _d| _d| _d| _d| _d| _	d| _
|  ¡ }| d ¡ |D ]}| |¡ qXd S )NF)r   Ú_formatted_textÚ_colorÚ_bgcolorÚ_boldÚ
_underlineÚ_strikeÚ_italicÚ_blinkÚ_reverseÚ_hiddenÚ_parse_corotÚsend)Úselfr   ÚparserÚc© r!   úF/tmp/pip-unpacked-wheel-4x_7prb2/prompt_toolkit/formatted_text/ansi.pyÚ__init__    s    
zANSI.__init__zGenerator[None, str, None])r   c                 c  s>  d}| j }d}dV }|dkrXd}|dkrXdV }|dkrN| d|f¡ dV }qXq ||7 }q |dkrxdV }|dkr
d	}q„q
n|d
kr„d	}|r*d}g }dV }	|	 ¡ rª||	7 }q’| tt|p¸dƒdƒ¡ |	dkrÐd}q’|	dkrð|  |¡ |  ¡ }q8q’|	dkr(t|d ƒD ]}
| |df¡ qq8q’q8q’q
| ||f¡ q
dS )zB
        Coroutine that parses the ANSI escape sequences.
        Ú FNúúz[ZeroWidthEscape]úú[Tõ   Â›r   i'  ú;ÚmÚCú )r   ÚappendÚisdigitÚminÚintÚ_select_graphic_renditionÚ_create_style_stringÚrange)r   ÚstyleZformatted_textZcsir    Zescaped_textZsquare_bracketÚcurrentÚparamsÚcharÚir!   r!   r"   r   5   sN    



zANSI._parse_corotz	list[int])Úattrsr   c                 C  sp  |sdg}nt |ddd… ƒ}|rl| ¡ }|tkr@t| | _q|tkrTt| | _q|dkrdd| _q|dkrtd| _q|dkr„d| _q|dkr”d| _	q|d	kr¤d| _	q|d
kr´d| _
q|dkrÄd| _q|dkrÔd| _q|dkräd| _q|dk röd| _q|dkrd| _q|dkrd| _	q|dkr,d| _
q|dkr>d| _q|dkrPd| _q|sŽd| _d| _d| _d| _d| _d| _d| _	d| _
d| _q|dkrt|ƒdkr| ¡ }|dkr t|ƒdkr |dkrâ| ¡ }t |¡| _n|dkr | ¡ }t |¡| _|dkrt|ƒdkrzd | ¡ | ¡ | ¡ ¡}W n tk
rH   Y qX |dkr\|| _q|dkr|| _qdS )zH
        Taken a list of graphics attributes and apply changes.
        r   Néÿÿÿÿr
   Té   é   é   é   é   é   é	   é   Fé   é   é   é   é   é   )é&   é0   rJ   rK   é   z#{:02x}{:02x}{:02x})ÚlistÚpopÚ
_fg_colorsr   Ú
_bg_colorsr   r   r   r   r   r   r   r   Úlenr	   ÚgetÚformatÚ
IndexError)r   r:   ÚattrÚnr+   Z	color_strr!   r!   r"   r2   Š   sŽ    







ý
zANSI._select_graphic_renditionc                 C  s¦   g }| j r| | j ¡ | jr,| d| j ¡ | jr<| d¡ | jrL| d¡ | jr\| d¡ | jrl| d¡ | jr|| d¡ | jrŒ| d¡ | j	rœ| d¡ d	 
|¡S )
zW
        Turn current style flags into a string for usage in a formatted text.
        zbg:ZboldZ	underlineÚstrikeZitalicZblinkÚreverseÚhiddenr-   )r   r.   r   r   r   r   r   r   r   r   Újoin)r   Úresultr!   r!   r"   r3   â   s(    






zANSI._create_style_stringc                 C  s   d| j ›dS )NzANSI(ú))r   ©r   r!   r!   r"   Ú__repr__ü   s    zANSI.__repr__r   c                 C  s   | j S ©N)r   r]   r!   r!   r"   Ú__pt_formatted_text__ÿ   s    zANSI.__pt_formatted_text__)ÚargsÚkwargsr   c                 O  s   t t | j||¡ƒS )z†
        Like `str.format`, but make sure that the arguments are properly
        escaped. (No ANSI escapes can be injected.)
        )r   Ú	FORMATTERÚvformatr   )r   ra   rb   r!   r!   r"   rS     s    zANSI.formatÚobjectc                 C  s0   t |tƒs|f}tdd„ |D ƒƒ}t| j| ƒS )z+
        ANSI('<b>%s</b>') % value
        c                 s  s   | ]}t |ƒV  qd S r_   )r   )Ú.0r9   r!   r!   r"   Ú	<genexpr>  s     zANSI.__mod__.<locals>.<genexpr>)Ú
isinstanceÚtupler   r   )r   r   r!   r!   r"   Ú__mod__	  s    
zANSI.__mod__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r   r2   r3   r^   r`   rS   rj   r!   r!   r!   r"   r      s   UXc                 C  s   i | ]\}}||“qS r!   r!   ©rf   ÚkÚvr!   r!   r"   Ú
<dictcomp>  s      rr   c                 C  s   i | ]\}}||“qS r!   r!   ro   r!   r!   r"   rr     s      ú#Z02xre   r   )Útextr   c                 C  s   t | ƒ dd¡ dd¡S )z4
    Replace characters with a special meaning.
    r'   ú?ú)r   Úreplace)rt   r!   r!   r"   r     s    c                   @  s   e Zd Zddddœdd„ZdS )ÚANSIFormatterre   r   )r   Úformat_specr   c                 C  s   t t||ƒƒS r_   )r   rS   )r   r   ry   r!   r!   r"   Úformat_field'  s    zANSIFormatter.format_fieldN)rk   rl   rm   rz   r!   r!   r!   r"   rx   &  s   rx   N)Ú
__future__r   Ústringr   Útypingr   r   r   Zprompt_toolkit.output.vt100r   r   r	   Z_256_colors_tableÚbaser   Ú__all__r   ÚitemsrO   rP   Ú	enumerateÚcolorsr9   ÚrÚgÚbr   rx   rc   r!   r!   r!   r"   Ú<module>   s&   þ  