o
    Ni                     @  s   d Z ddlmZ ddlZddlmZmZmZ ddlm	Z	 ddl
mZmZ ddlmZ ddlmZ dd	lmZ erLdd
lmZmZ ddlmZ ddlmZ G dd deZG dd deZG dd de	jZG dd deZdddZdS )ztransforms for code-blocks.    )annotationsN)TYPE_CHECKINGAny
NamedTuple)nodes)PythonConsoleLexerguess_lexer)addnodes)doctest)SphinxTransform)NodeTextElement)Sphinx)ExtensionMetadatac                   @  s&   e Zd ZU ded< ded< ded< dS )HighlightSettingstrlanguageboolforceintlineno_thresholdN)__name__
__module____qualname____annotations__ r   r   Z/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/transforms/post_transforms/code.pyr      s   
 r   c                   @  s   e Zd ZdZdZd
ddZd	S )HighlightLanguageTransformz
    Apply highlight_language to all literal_block nodes.

    This refers both :confval:`highlight_language` setting and
    :rst:dir:`highlight` directive.  After processing, this transform
    removes ``highlightlang`` node from doctree.
    i  kwargsr   returnNonec                 K  sD   t | j| jj}| j| t| jtjD ]}|j	
| qd S N)HighlightLanguageVisitordocumentconfighighlight_language	walkaboutlistfindallr	   highlightlangparentremove)selfr   visitornoder   r   r   apply'   s   
z HighlightLanguageTransform.applyNr   r   r   r    )r   r   r   __doc__default_priorityr/   r   r   r   r   r      s    r   c                      sn   e Zd Zd fddZdddZdddZdddZdddZdddZdddZ	dddZ
d ddZ  ZS )!r"   r#   nodes.documentdefault_languager   r   r    c                   s&   t |dtj| _g | _t | d S )NF)r   sysmaxsizedefault_settingsettingssuper__init__)r,   r#   r4   	__class__r   r   r:   2   s   z!HighlightLanguageVisitor.__init__r.   r   c                 C     d S r!   r   r,   r.   r   r   r   unknown_visit7      z&HighlightLanguageVisitor.unknown_visitc                 C  r=   r!   r   r>   r   r   r   unknown_departure:   r@   z*HighlightLanguageVisitor.unknown_departurec                 C     | j | j d S r!   r8   appendr7   r>   r   r   r   visit_document=      z'HighlightLanguageVisitor.visit_documentc                 C     | j   d S r!   r8   popr>   r   r   r   depart_document@      z(HighlightLanguageVisitor.depart_documentc                 C  rB   r!   rC   r>   r   r   r   visit_start_of_fileC   rF   z,HighlightLanguageVisitor.visit_start_of_filec                 C  rG   r!   rH   r>   r   r   r   depart_start_of_fileF   rK   z-HighlightLanguageVisitor.depart_start_of_fileaddnodes.highlightlangc                 C  s"   t |d |d |d | jd< d S )Nlangr   linenothreshold)r   r8   r>   r   r   r   visit_highlightlangI   s   z,HighlightLanguageVisitor.visit_highlightlangnodes.literal_blockc                 C  sV   | j d }d|vr|j|d< |j|d< d|vr)| d}||jd k|d< d S d S )NrQ   r   r   linenos
   )r8   r   r   astextcountr   )r,   r.   settinglinesr   r   r   visit_literal_blockN   s   


z,HighlightLanguageVisitor.visit_literal_block)r#   r3   r4   r   r   r    )r.   r   r   r    )r.   rN   r   r    )r.   rS   r   r    )r   r   r   r:   r?   rA   rE   rJ   rL   rM   rR   r[   __classcell__r   r   r;   r   r"   1   s    






r"   c                   @  s<   e Zd ZdZejd ZdddZdddZedddZ	dS )TrimDoctestFlagsTransformz
    Trim doctest flags like ``# doctest: +FLAG`` from python code-blocks.

    see :confval:`trim_doctest_flags` for more information.
    rV   r   r   r   r    c                 K  sJ   | j tjD ]}| |r| | q| j tjD ]}| | qd S r!   )r#   r(   r   literal_blockis_pyconsolestrip_doctest_flagsdoctest_block)r,   r   lbnodedbnoder   r   r   r/   a   s   

zTrimDoctestFlagsTransform.applyr.   r   c                 C  sT   | d| jjs
d S |j}tjd|}tjd|}||_t	|g|d d < d S )N
trim_flags )
getr$   trim_doctest_flags	rawsourcer
   blankline_resubdoctestopt_rer   Text)r,   r.   sourcer   r   r   r`   i   s   z-TrimDoctestFlagsTransform.strip_doctest_flagsrS   r   c                 C  st   | j |  kr	dS | d}|dv rdS |dv r| j dS |dkr8zt| j }t|tW S  ty7   Y dS w dS )NFr   >   pyconpycon3T>   pypy3pythondefaultpython3z>>>guess)rh   rW   rf   
startswithr   
isinstancer   	Exception)r.   r   lexerr   r   r   r_   s   s    

z&TrimDoctestFlagsTransform.is_pyconsoleNr0   )r.   r   r   r    )r.   rS   r   r   )
r   r   r   r1   r   r2   r/   r`   staticmethodr_   r   r   r   r   r]   X   s    



r]   appr   r   r   c                 C  s    |  t |  t ddddS )NbuiltinT)versionparallel_read_safeparallel_write_safe)add_post_transformr   r]   )r{   r   r   r   setup   s   

r   )r{   r   r   r   ) r1   
__future__r   r5   typingr   r   r   docutilsr   pygments.lexersr   r   sphinxr	   
sphinx.extr
   sphinx.transformsr   docutils.nodesr   r   sphinx.applicationr   sphinx.util.typingr   r   r   NodeVisitorr"   r]   r   r   r   r   r   <module>   s$    '/