o
    tf#                     @   s   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d	Zd d
lmZ edd ZG dd dejZG dd dejZdS )    )QtGui)qstring_length)HtmlFormatter)
RegexLexer
_TokenTypeTextError)Python3Lexer)get_style_by_namerootc                 c   s   d}| j }t| drt| j}nt|}||d  }	 |D ]|\}}}	|||}
|
r|durHt|tu r=|||
 fV  n|| |
D ]}|V  qB|
 }|	durt|	t	ru|	D ]}|dkrb|
  qW|dkrn||d  qW|| qWnt|	tr||	d= n|	dkr||d  nJ d	|	 ||d  } n2qz'|| d
kr|d7 }dg}|d }|td
fV  W q|t|| fV  |d7 }W n	 ty   Y nw qt|| _dS )a   Split ``text`` into (tokentype, text) pairs.

        Monkeypatched to store the final stack on the object itself.

        The `text` parameter this gets passed is only the current line, so to
        highlight things like multiline strings correctly, we need to retrieve
        the state from the previous line (this is done in PygmentsHighlighter,
        below), and use it to continue processing the current line.
    r   _saved_state_stack   Nz#popz#pushFzwrong state def: %r
r   )_tokenshasattrlistr   typer   groupend
isinstancetuplepopappendintr   r   
IndexError)selftextstackpos	tokendefs
statestackstatetokensrexmatchaction	new_statemitemstate r*   g/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/qtconsole/pygments_highlighter.pyget_tokens_unprocessed   s`   





+r,   )contextmanagerc                  c   s.    zt j} tt _d V  W 	 | t _d S 	 | t _w N)r   r,   )origr*   r*   r+   	_lexpatchP   s   
r0   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )PygmentsBlockUserDataz: Storage for the user data associated with each line.
    r   c                 K   s.   |  D ]
\}}t| || qtj|  d S r.   )itemssetattrr   QTextBlockUserData__init__)r   kwdskeyvaluer*   r*   r+   r5   b   s   zPygmentsBlockUserData.__init__c                    s&   dg}d  fdd|D }d| S )Nsyntax_stackz, c                    s   g | ]}d |t  |f qS )z%s=%r)getattr).0attrr   r*   r+   
<listcomp>i   s    z2PygmentsBlockUserData.__repr__.<locals>.<listcomp>zPygmentsBlockUserData(%s))join)r   attrsr6   r*   r=   r+   __repr__g   s
   zPygmentsBlockUserData.__repr__N)__name__
__module____qualname____doc__r9   r5   rA   r*   r*   r*   r+   r1   \   s
    r1   c                       sj   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Z  ZS )PygmentsHighlighterz4 Syntax highlighter that uses Pygments for parsing. Nc                    sJ   t  | |  | _tdd| _| d |d ur|| _d S t | _d S )NT)Znowrapdefault)	superr5   document	_documentr   
_formatter	set_style_lexerr	   )r   parentlexer	__class__r*   r+   r5   u   s   


zPygmentsHighlighter.__init__c              	   C   s   |     }t Z |dur|j| j_n	t| jdr| j`d}| j|D ]\}}t	|}| 
||| | ||7 }q't| jdr]t| jjd}|   | | j`W d   dS W d   dS 1 shw   Y  dS )z$ Highlight a block of text.
        Nr   r   )r9   )ZcurrentBlockpreviousZuserDatar0   r9   rM   r   r   
get_tokensr   Z	setFormat_get_formatr1   ZsetUserData)r   stringZ	prev_dataindextokenr   lengthdatar*   r*   r+   highlightBlock   s(   
"z"PygmentsHighlighter.highlightBlockc                 C   s$   t |tr	t|}|| _|   dS )z9 Sets the style to the specified Pygments style.
        N)r   strr
   _style_clear_caches)r   styler*   r*   r+   rL      s   
zPygmentsHighlighter.set_stylec                 C   s   | j | d| _|   dS )a    Sets a CSS stylesheet. The classes in the stylesheet should
        correspond to those generated by:

            pygmentize -S <style> -f html

        Note that 'set_style' and 'set_style_sheet' completely override each
        other, i.e. they cannot be used in conjunction.
        N)rJ   ZsetDefaultStyleSheetr\   r]   )r   
stylesheetr*   r*   r+   set_style_sheet   s   	z#PygmentsHighlighter.set_style_sheetc                 C   s   i | _ i | _dS )z/ Clear caches for brushes and formats.
        N)_brushes_formatsr=   r*   r*   r+   r]      s   
z!PygmentsHighlighter._clear_cachesc                 C   sJ   || j v r
| j | S | jdu r| || j}n| || j}|| j |< |S )z6 Returns a QTextCharFormat for token or None.
        N)rb   r\   _get_format_from_documentrJ   _get_format_from_style)r   rW   resultr*   r*   r+   rT      s   



zPygmentsHighlighter._get_formatc                 C   s6   t | j|dfg\}}| j| t| j S )z0 Returns a QTextCharFormat for token by
        dummy)nextrK   Z_format_linesrJ   ZsetHtmlr   ZQTextCursorZ
charFormat)r   rW   rI   codehtmlr*   r*   r+   rc      s   z-PygmentsHighlighter._get_format_from_documentc                 C   s   t  }|| D ]e\}}|rp|dkr|| | q|dkr+|| | q|dkr7|t jj	 q|dkrA|
d q|dkrM|t jj q|dkrY|t jj q|dkre|t jj q|d	krp|t jj q|S )
zJ Returns a QTextCharFormat for token by reading a Pygments style.
        colorbgcolorbolditalicT	underlinesansromanmono)r   ZQTextCharFormatstyle_for_tokenr2   ZsetForeground
_get_brushZsetBackgroundZsetFontWeightZQFontZBoldZsetFontItalicZsetUnderlineStyleZSingleUnderlineZsetFontStyleHintZ	SansSerifZTimesZ
TypeWriter)r   rW   r^   re   r7   r8   r*   r*   r+   rd      s.   z*PygmentsHighlighter._get_format_from_stylec                 C   s6   | j |}|du r| |}t|}|| j |< |S )z( Returns a brush for the color.
        N)ra   get
_get_colorr   ZQBrush)r   rj   re   qcolorr*   r*   r+   rs      s   


zPygmentsHighlighter._get_brushc                 C   sJ   t  }|t|dd ddt|dd ddt|dd dd |S )z> Returns a QColor built from a Pygments color string.
        N      )base      )r   ZQColorZsetRgbr   )r   rj   rv   r*   r*   r+   ru      s   zPygmentsHighlighter._get_colorr.   )rB   rC   rD   rE   r5   rZ   rL   r`   r]   rT   rc   rd   rs   ru   __classcell__r*   r*   rP   r+   rF   n   s    
rF   N)r   )Zqtpyr   Zqtconsole.qstringhelpersr   Zpygments.formatters.htmlr   Zpygments.lexerr   r   r   r   Zpygments.lexersr	   Zpygments.stylesr
   r,   
contextlibr-   r0   r4   r1   ZQSyntaxHighlighterrF   r*   r*   r*   r+   <module>   s   
@
