U
    祡c                     @   s  d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ e de jZe dZG dd de
Ze	e Zeegef Zeeegef Z e dj!fee edddZ"eeee#ee ee f  dddZ$d'eeeef e%ee edddZ&e'dkrddddd gZ(d d!l)m*Z* d d"l+m,Z, e,d#d$d%d&Z-e(D ]Z.e-/ee.e. qe*e- dS )(    N)literal_eval)
attrgetter)CallableIterableListMatch
NamedTupleOptionalTupleUnion   )_emoji_replace)EmojiVariant)MarkupError)Style)SpanTextz((\\*)\[([a-z#/@][^[]*?)])z^([\w.]*?)(\(.*?\))?$c                   @   sF   e Zd ZU dZeed< ee ed< edddZeedddZ	d	S )
TagzA tag in console markup.name
parameters)returnc                 C   s"   | j d kr| jS | j d| j  S )N r   r   self r   //tmp/pip-unpacked-wheel-qkhzhrww/rich/markup.py__str__   s     zTag.__str__c                 C   s.   | j dkrd| j dS d| j d| j  dS )z*Get the string representation of this tag.N[]=r   r   r   r   r   markup!   s    z
Tag.markupN)
__name__
__module____qualname____doc__str__annotations__r	   r   propertyr!   r   r   r   r   r      s   
r   z(\\*)(\[[a-z#/@][^[]*?]))r!   _escaper   c                 C   s"   t t tddd}||| } | S )zEscapes text so that it won't be interpreted as markup.

    Args:
        markup (str): Content to be inserted in to markup.

    Returns:
        str: Markup with square brackets escaped.
    )matchr   c                 S   s   |   \}}| | d| S )z!Called by re.sub replace matches.\)groups)r*   backslashestextr   r   r   escape_backslashes=   s    z"escape.<locals>.escape_backslashes)r   r&   )r!   r)   r/   r   r   r   escape0   s    
r0   )r!   r   c                 c   s   d}t }t}t| D ]}| \}}}| \}}	||krP|| || dfV  |r|t|d\}
}|
r|d|
 dfV  ||
d 7 }|r||t|d dfV  |	}q|d\}}}|d|||r|ndfV  |	}q|t| k r|| |d dfV  dS )zParse markup in to an iterable of tuples of (position, text, tag).

    Args:
        markup (str): A string containing console markup

    r   N   r+   r    )divmodr   RE_TAGSfinditerr,   spanlen	partition)r!   positionZ_divmod_Tagr*   Z	full_textZescapesZtag_textstartendr-   escapedr.   equalsr   r   r   r   _parseF   s,    r>    T)r!   styleemojiemoji_variantr   c                    s,  t }d| kr(t|r|| |dn| |dS t|d}|j}tj}g j g }|j}	t}
t}tt	t
tf d fdd}t| D ]L\}}}|dk	r|dd}||r||n| q|dk	r|jd	r|jd
d  }|r0||}z||\}}W n0 tk
r,   td|j d| ddY nX n8z  \}}W n( tk
rf   td| ddY nX |jdr|jrjd}|j }t|}|dk	r| \}}|dkrdn|}zt|}W n| tk
r } z"td|d|jd|j W 5 d}~X Y n< tk
rF } ztd|jd| dW 5 d}~X Y nX |rn|t|tr`|n|ff}nd}|	|
|t|t|j|id n|	|
|t|t| q|||j|j}t||f qt|}r \}}t|}|r|	|
||| qt|ddd t dd|_!|S )a9  Render console markup in to a Text instance.

    Args:
        markup (str): A string containing console markup.
        emoji (bool, optional): Also render emoji code. Defaults to True.

    Raises:
        MarkupError: If there is a syntax error in the markup.

    Returns:
        Text: A test instance.
    r   )Zdefault_variant)r@   )
style_namer   c                    s@   t tdD ]$\}\}}|j| kr |   S qt| dS )z"Pop tag matching given style name.r   N)	enumeratereversedr   KeyError)rC   index_tagpopZstyle_stackr   r   	pop_style   s    
zrender.<locals>.pop_styleNz\[/r   zclosing tag 'z' at position z doesn't match any open tagzclosing tag '[/]' at position z has nothing to close@r?   z()zerror parsing z in z; r   )metar:   )key)"r   r   appendr   	normalizerK   r   r   r&   r
   intr>   replacer   
startswithstriprF   r   r!   
IndexErrorr   
RE_HANDLERr*   r,   r   SyntaxErrormsg	Exception
isinstancetupler6   sortedr   spans)r!   r@   rA   rB   Zemoji_replacer.   rR   rS   r`   Zappend_spanZ_Spanr9   rL   r8   Z
plain_textrI   rC   r:   Zopen_tagZhandler_namer   Zhandler_matchZmatch_parametersZmeta_paramserrorZnormalized_tagZtext_lengthr   rJ   r   renderg   s    





  rb   __main__z[red]Hello World[/red]z[magenta]Hello [b]World[/b]z9[bold]Bold[italic] bold and italic [/bold]italic[/italic]zDClick [link=https://www.willmcgugan.com]here[/link] to visit my Blogz+:warning-emoji: [bold red blink] DANGER![/])print)TableZMarkupZResult)r   r   )padding)r?   TN)0reastr   operatorr   typingr   r   r   r   r   r	   r
   r   r   rA   r   errorsr   r@   r   r.   r   r   compileVERBOSEr3   rY   r   r&   Z_ReStringMatchZ_ReSubCallableZ_EscapeSubMethodsubr0   rT   r>   boolrb   r"   ZMARKUPZrichrd   Z
rich.tablere   Zgridr!   Zadd_rowr   r   r   r   <module>   s^   (

&#   
}
