U
    祡cNP                  	   @   sD  d dl 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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 ddlm Z m!Z! ddl"m#Z# ddl$m%Z%m&Z& G dd dZ'G dd de'Z(G dd de'Z)G dd de)Z*G dd de)Z+G dd de)Z,G dd de)Z-G dd de'Z.G d d! d!e'Z/G d"d# d#e)Z0G d$d% d%e)Z1G d&d' d'Z2G d(d) d)eZ3e4d*kr@d d+l5Z5d d+l6Z6e5j7d,d-Z8e8j9d.d/d0d1 e8j9d2d3d4d5d+d6d7 e8j9d8d9d:d;d<d= e8j9d>d?d@d+d@d= e8j9dAdBdCd5dDdE e8j9dFdGe:dHd+dIdJ e8j9dKdLdMd5dNdE e8j9dOdPdQd5dRdE e8; Z<d dSl=mZ e<j>dTkre6j?@ ZAn$eBe<j>dUdVdWZCeC@ ZAW 5 Q R X e3eAe<jDrdXndYe<jEe<jFe<jGdZZHe<jIr&d d+lJZJd d+lKZKeJL ZMeeMe<jNe<jOd[ZePeH eKQeMR  nee<jNe<jOd\ZePeH d+S )]    )AnyClassVarDictListOptionalTypeUnion)Parser   )box)
loop_first)Stack)ConsoleConsoleOptionsJustifyMethodRenderResult)Renderables)JupyterMixin)Panel)Rule)Segment)Style
StyleStack)Syntax)TextTextTypec                   @   s   e Zd ZU dZee ed< eded dddZ	ddd	d
dZ
deddddZddd	ddZdd edddZddddddZdS )MarkdownElementTnew_lineMarkdownmarkdownnodereturnc                 C   s   |  S zFactory to create markdown element,

        Args:
            markdown (Markdown): The parent Markdown object.
            node (Any): A node from Pygments.

        Returns:
            MarkdownElement: A new markdown element
         clsr    r!   r$   r$   1/tmp/pip-unpacked-wheel-qkhzhrww/rich/markdown.pycreate   s    zMarkdownElement.createMarkdownContextNcontextr"   c                 C   s   dS )zuCalled when the node is entered.

        Args:
            context (MarkdownContext): The markdown context.
        Nr$   selfr+   r$   r$   r'   on_enter$   s    zMarkdownElement.on_enterr+   textr"   c                 C   s   dS )zpCalled when text is parsed.

        Args:
            context (MarkdownContext): The markdown context.
        Nr$   r-   r+   r0   r$   r$   r'   on_text+   s    zMarkdownElement.on_textc                 C   s   dS )zwCalled when the parser leaves the element.

        Args:
            context (MarkdownContext): [description]
        Nr$   r,   r$   r$   r'   on_leave2   s    zMarkdownElement.on_leaver+   childr"   c                 C   s   dS )a|  Called when a child element is closed.

        This method allows a parent element to take over rendering of its children.

        Args:
            context (MarkdownContext): The markdown context.
            child (MarkdownElement): The child markdown element.

        Returns:
            bool: Return True to render the element, or False to not render the element.
        Tr$   r-   r+   r5   r$   r$   r'   on_child_close9   s    zMarkdownElement.on_child_closer   r   r   consoleoptionsr"   c                 C   s   dS )Nr$   r$   r-   r9   r:   r$   r$   r'   __rich_console__I   s    z MarkdownElement.__rich_console__)__name__
__module____qualname__r   r   bool__annotations__classmethodr   r(   r.   r   r2   r3   r7   r<   r$   r$   r$   r'   r      s   
  r   c                   @   s   e Zd ZdZdS )UnknownElementzAn unknown element.

    Hopefully there will be no unknown elements, and we will have a MarkdownElement for
    everything in the document.

    N)r=   r>   r?   __doc__r$   r$   r$   r'   rC   O   s   rC   c                   @   sF   e Zd ZdZdZdddddZdeddd	d
ZdddddZdS )TextElementz)Base class for elements that render text.noner)   Nr*   c                 C   s   | | j| _tdd| _d S Nleftjustify)enter_style
style_namestyler   r0   r,   r$   r$   r'   r.   ]   s    zTextElement.on_enterr/   c                 C   s"   | j |t|tr|jnd  d S N)r0   append
isinstancestrcurrent_styler1   r$   r$   r'   r2   a   s    zTextElement.on_textc                 C   s   |   d S rN   )leave_styler,   r$   r$   r'   r3   d   s    zTextElement.on_leave)	r=   r>   r?   rD   rL   r.   r   r2   r3   r$   r$   r$   r'   rE   X   s
   rE   c                   @   sV   e Zd ZU dZdZeed< eded dddZ	edd	d
dZ
eeedddZdS )	ParagraphzA Paragraph.zmarkdown.paragraphrJ   r   r   c                 C   s   | |j p
ddS rG   rI   r%   r$   r$   r'   r(   n   s    zParagraph.createN)rJ   r"   c                 C   s
   || _ d S rN   rI   )r-   rJ   r$   r$   r'   __init__r   s    zParagraph.__init__r8   c                 c   s   | j | j_ | jV  d S rN   )rJ   r0   r;   r$   r$   r'   r<   u   s    
zParagraph.__rich_console__)r=   r>   r?   rD   rL   r   rA   rB   r   r(   rU   r   r   r   r<   r$   r$   r$   r'   rT   h   s   
 rT   c                       s`   e Zd ZdZeded dddZdddd	d
Zedd fddZ	e
eedddZ  ZS )Headingz
A heading.r   r   c                 C   s   | |j }|S rN   )level)r&   r    r!   headingr$   r$   r'   r(      s    
zHeading.creater)   Nr*   c                 C   s   t  | _|| j d S rN   )r   r0   rK   rL   r,   r$   r$   r'   r.      s    zHeading.on_enter)rW   r"   c                    s    || _ d| | _t   d S )Nz
markdown.h)rW   rL   superrU   )r-   rW   	__class__r$   r'   rU      s    zHeading.__init__r8   c                 c   sH   | j }d|_| jdkr*t|tjddV  n| jdkr>tdV  |V  d S )Ncenterr
   zmarkdown.h1.border)r   rM       )r0   rJ   rW   r   r   ZDOUBLEr   )r-   r9   r:   r0   r$   r$   r'   r<      s    



zHeading.__rich_console__)r=   r>   r?   rD   rB   r   r(   r.   intrU   r   r   r   r<   __classcell__r$   r$   rZ   r'   rV   |   s    rV   c                   @   sN   e Zd ZdZdZeded dddZeeddd	d
Z	e
eedddZdS )	CodeBlockz&A code block with syntax highlighting.zmarkdown.code_blockr   r   c                 C   s(   |j pd}|dd }| |p d|jS )Nr^    r   r0   )info	partition
code_theme)r&   r    r!   Z	node_info
lexer_namer$   r$   r'   r(      s    
zCodeBlock.createN)rf   themer"   c                 C   s   || _ || _d S rN   )rf   rg   )r-   rf   rg   r$   r$   r'   rU      s    zCodeBlock.__init__r8   c                 c   s.   t | j }t|| j| jddd}|V  d S )NTr   )rg   Z	word_wrappadding)rQ   r0   rstripr   rf   rg   )r-   r9   r:   codesyntaxr$   r$   r'   r<      s        zCodeBlock.__rich_console__)r=   r>   r?   rD   rL   rB   r   r(   rQ   rU   r   r   r   r<   r$   r$   r$   r'   ra      s    ra   c                   @   sF   e Zd ZdZdZddddZdded	d
dZee	e
dddZdS )
BlockQuotezA block quote.zmarkdown.block_quoteNr"   c                 C   s   t  | _d S rN   r   elementsr-   r$   r$   r'   rU      s    zBlockQuote.__init__r)   r   r4   c                 C   s   | j | dS NFro   rO   r6   r$   r$   r'   r7      s    zBlockQuote.on_child_closer8   c           	      c   sb   |j |jd d}|j| j|| jd}| j}td}td|}|D ]}|V  |E d H  |V  qBd S )N   widthrM   
u   ▌ )update	max_widthrender_linesro   rM   r   )	r-   r9   r:   render_optionslinesrM   r   rh   liner$   r$   r'   r<      s    

zBlockQuote.__rich_console__)r=   r>   r?   rD   rL   rU   r@   r7   r   r   r   r<   r$   r$   r$   r'   rl      s     rl   c                   @   s&   e Zd ZdZdZeeedddZdS )HorizontalRulez%A horizontal rule to divide sections.Fr8   c                 c   s   |j ddd}t|dV  d S )Nzmarkdown.hrrF   defaultrv   )	get_styler   )r-   r9   r:   rM   r$   r$   r'   r<      s    zHorizontalRule.__rich_console__N)	r=   r>   r?   rD   r   r   r   r   r<   r$   r$   r$   r'   r~      s    r~   c                   @   s`   e Zd ZdZeded dddZeee	 dddd	Z
d
dedddZeeedddZdS )ListElementzA list element.r   r   c                 C   s   |j }| |d |d S )Ntypestart)	list_data)r&   r    r!   r   r$   r$   r'   r(      s    zListElement.createN)	list_type
list_startr"   c                 C   s   g | _ || _|| _d S rN   )itemsr   r   )r-   r   r   r$   r$   r'   rU      s    zListElement.__init__r)   r   r4   c                 C   s   t |tst| j| dS rq   )rP   ListItemAssertionErrorr   rO   r6   r$   r$   r'   r7      s    zListElement.on_child_closer8   c                 c   sz   | j dkr*| jD ]}|||E d H  qnL| jd kr8dn| j}|t| j }| jD ]"}|||||E d H  |d7 }qRd S )Nbulletr
   )r   r   render_bulletr   lenrender_number)r-   r9   r:   itemnumberlast_numberr$   r$   r'   r<      s    


zListElement.__rich_console__)r=   r>   r?   rD   rB   r   r(   rQ   r   r_   rU   r@   r7   r   r   r   r<   r$   r$   r$   r'   r      s     r   c                   @   s\   e Zd ZdZdZddddZdded	d
dZee	e
dddZee	eee
dddZdS )r   zAn item in a list.zmarkdown.itemNrm   c                 C   s   t  | _d S rN   rn   rp   r$   r$   r'   rU     s    zListItem.__init__r)   r   r4   c                 C   s   | j | dS rq   rr   r6   r$   r$   r'   r7     s    zListItem.on_child_closer8   c                 c   s   |j |jd d}|j| j|| jd}|jddd}td|}td|}td	}t|D ]&\}	}
|	rh|n|V  |
E d H  |V  qXd S )
N   rt   rv   zmarkdown.item.bulletrF   r   u    • z   rw   )rx   ry   rz   ro   rM   r   r   r   )r-   r9   r:   r{   r|   Zbullet_styler   rh   r   firstr}   r$   r$   r'   r     s    


zListItem.render_bullet)r9   r:   r   r   r"   c                 c   s   t t|d }|j|j| d}|j| j|| jd}|jddd}td}	td| |}
t| 	|d	 d |}t
|D ]&\}}|r|n|
V  |E d H  |	V  q|d S )
Nr]   rt   rv   zmarkdown.item.numberrF   r   rw   rb   r
   )r   rQ   rx   ry   rz   ro   rM   r   r   rjustr   )r-   r9   r:   r   r   Znumber_widthr{   r|   Znumber_styler   rh   Znumeralr   r}   r$   r$   r'   r     s    
zListItem.render_number)r=   r>   r?   rD   rL   rU   r@   r7   r   r   r   r   r_   r   r$   r$   r$   r'   r     s       r   c                       sj   e Zd ZdZdZededdddZee	dd	 fd
dZ
ddd fddZeeedddZ  ZS )	ImageItemz#Renders a placeholder for an image.Fr   r   r   c                 C   s   | |j |jS r#   )destination
hyperlinksr%   r$   r$   r'   r(   4  s    zImageItem.createN)r   r   r"   c                    s    || _ || _d | _t   d S rN   )r   r   linkrY   rU   )r-   r   r   rZ   r$   r'   rU   A  s    zImageItem.__init__r)   r*   c                    s&   |j j| _tdd| _t | d S rG   )rR   r   r   r0   rY   r.   r,   rZ   r$   r'   r.   G  s    
zImageItem.on_enterr8   c                 c   s`   t | jp| jpd d}| jp6t| jdddd }| jrH|| tj	d|dddV  d S )	Nr   /r
   u   🌆 rb   r^   )end)
r   r   r   r0   r   striprsplitr   Zstylizeassemble)r-   r9   r:   
link_styletitler$   r$   r'   r<   L  s
    "
zImageItem.__rich_console__)r=   r>   r?   rD   r   rB   r   r(   rQ   r@   rU   r.   r   r   r   r<   r`   r$   r$   rZ   r'   r   /  s    r   c                   @   sx   e Zd ZdZdeeeee eddddZ	e
eddd	Zeedd
ddZeeef edddZedddZdS )r)   z!Manages the console render state.Nmonokai)r9   r:   rM   inline_code_lexerinline_code_themer"   c                 C   s@   || _ || _t|| _t | _d | _|d k	r<td||d| _d S )Nr^   )rg   )r9   r:   r   style_stackr   stack_syntaxr   )r-   r9   r:   rM   r   r   r$   r$   r'   rU   Y  s    
zMarkdownContext.__init__rm   c                 C   s   | j jS )z>Current style which is the product of all styles on the stack.)r   currentrp   r$   r$   r'   rR   j  s    zMarkdownContext.current_style)r0   	node_typer"   c                 C   sZ   |dkrF| j dk	rF| j |}|  | jj| tj|| jj	d n| jj| | dS )z#Called when the parser visits text.rj   Nrv   )
r   Z	highlightri   r   topr2   r   r   r   r   )r-   r0   r   Zhighlight_textr$   r$   r'   r2   o  s     zMarkdownContext.on_text)rL   r"   c                 C   s"   | j j|dd}| j| | jS )zEnter a style context.rF   r   )r9   r   r   pushrR   )r-   rL   rM   r$   r$   r'   rK   z  s    zMarkdownContext.enter_stylec                 C   s   | j  }|S )zLeave a style context.)r   pop)r-   rM   r$   r$   r'   rS     s    
zMarkdownContext.leave_style)Nr   )r=   r>   r?   rD   r   r   r   r   rQ   rU   propertyrR   r2   r   rK   rS   r$   r$   r$   r'   r)   V  s      r)   c                
   @   s   e Zd ZU dZeeeeee	e
edZeeeee f  ed< ddddhZdeeee eeef eee ee d	dddZeeedddZd	S )r   a  A Markdown renderable.

    Args:
        markup (str): A string containing markdown.
        code_theme (str, optional): Pygments theme for code blocks. Defaults to "monokai".
        justify (JustifyMethod, optional): Justify value for paragraphs. Defaults to None.
        style (Union[str, Style], optional): Optional style to apply to markdown.
        hyperlinks (bool, optional): Enable hyperlinks. Defaults to ``True``.
        inline_code_lexer: (str, optional): Lexer to use if inline code highlighting is
            enabled. Defaults to None.
        inline_code_theme: (Optional[str], optional): Pygments theme for inline code
            highlighting, or None for no highlighting. Defaults to None.
    )Z	paragraphrX   Z
code_blockZblock_quoteZthematic_breaklistr   imagero   Zemphstrongrj   striker   NrF   T)markupre   rJ   rM   r   r   r   r"   c           	      C   sD   || _ t }||| _|| _|| _|| _|| _|| _|p<|| _	d S rN   )
r   r	   parseparsedre   rJ   rM   r   r   r   )	r-   r   re   rJ   rM   r   r   r   parserr$   r$   r'   rU     s    
zMarkdown.__init__r8   c                 c   s  |j | jdd}|jdd}t|||| j| jd}| j }| j}d}|D ]\}}	|j	}
|
dkrz|
|jdd	|
 qJ|
d
kr|	r|
d|
 qJ|
dkr|	r|
d	|
 qJ|
dkrN|	r|j ddd}| jr|t|jd7 }|| n`|  | js|
d|
 tdd|j ddd }|| |
|j|
 |  |
d|
 qJ|
|kr| r|	rz|d|
  n|  n.|d|
  |jr|
|j|
 |  qJ| j|
pt}| r|	r|| |}|j| || n|j }|jrZ|jj||rN|r.tdV  |||jE dH  | | n
| | n| | |||jE dH  |j!}qJ|| |}|j| || |jr|
||j"  |j  |jj||r|rtdV  |||jE dH  | | n
| | |j!}qJdS )zRender markdown to the console.rF   r   N)height)r   r   F)Zhtml_inlineZ
html_blockr0   rw   rb   Z	linebreakZ	softbreakr   zmarkdown.linkr   z (T)Z	underlinezmarkdown.link_url)z	markdown.)#r   rM   rx   r)   r   r   r   walkerinlinestr2   literalreplacer   r   r   rK   rS   is_containerro   getrC   r(   r   r   r.   r   r   r7   r   renderr:   r3   r   ri   )r-   r9   r:   rM   r+   Znodesr   r   r   Zenteringr   r   Zelement_classelementr$   r$   r'   r<     s    

 












zMarkdown.__rich_console__)r   NrF   TNN)r=   r>   r?   rD   rT   rV   ra   rl   r~   r   r   r   ro   r   r   rQ   r   r   rA   r   r   r   r   r   r@   rU   r   r   r   r<   r$   r$   r$   r'   r     s>   

      
 r   __main__Nz(Render Markdown to the console with Rich)descriptionpathPATHz%path to markdown file, or - for stdin)metavarhelpz-cz--force-colorforce_color
store_truezforce color for non-terminals)destactionr   r   z-tz--code-themere   r   zpygments code theme)r   r   r   z-iz--inline-code-lexerr   z-yz--hyperlinksr   zenable hyperlinks)r   r   r   z-wz--widthru   z*width of output (default will auto-detect))r   r   r   r   z-jz	--justifyrJ   zenable full text justifyz-pz--pagepagezuse pager to scroll output)r   -rtzutf-8)encodingfullrH   )rJ   re   r   r   )fileforce_terminalru   )r   ru   )Stypingr   r   r   r   r   r   r   Zcommonmark.blocksr	   r^   r   Z_loopr   _stackr   r9   r   r   r   r   Z
containersr   Zjupyterr   Zpanelr   Zruler   segmentr   rM   r   r   rk   r   r0   r   r   r   rC   rE   rT   rV   ra   rl   r~   r   r   r   r)   r   r=   argparsesysArgumentParserr   add_argumentr_   
parse_argsargsZrich.consoler   stdinreadZmarkdown_bodyopenZmarkdown_filerJ   re   r   r   r    r   iopydocStringIOZfileior   ru   printZpagergetvaluer$   r$   r$   r'   <module>   s   $<	$",'0 
  
