o
    Ni&*                     @  sP  d Z ddlmZ ddlZddl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 dd
lmZ ddlmZmZ ddlmZ ddlmZmZ ddlmZmZmZ ddl m!Z! erpddl"m#Z# ddl$m%Z% e&e'Z(dZ)e*dZ+G dd deZ,G dd de,Z-G dd de,Z.d'ddZ/G d d! d!e,Z0d(d%d&Z1dS ))z#Docutils transforms used by Sphinx.    )annotationsN)sha1)ceil)Path)TYPE_CHECKINGAny)nodes)__)SphinxTransform)loggingrequests)_StrPath)epoch_to_rfc1123rfc1123_to_epoch)get_image_extensionguess_mimetypeparse_data_uri)	ensuredir)Sphinx)ExtensionMetadata    z
[:;<>|*" ]c                   @  s8   e Zd ZdddZdd
dZdddZedddZdS )BaseImageConverterkwargsr   returnNonec                 K  s,   | j tjD ]}| |r| | qd S N)documentfindallr   imagematchhandle)selfr   node r#   \/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/transforms/post_transforms/images.pyapply!   s
   

zBaseImageConverter.applyr"   nodes.imageboolc                 C  s   dS )NTr#   r!   r"   r#   r#   r$   r   &      zBaseImageConverter.matchc                 C  s   d S r   r#   r(   r#   r#   r$   r    )   r)   zBaseImageConverter.handlestrc                 C  s   t j| jjdS )Nimages)ospathjoinapp
doctreedirr!   r#   r#   r$   imagedir,   s   zBaseImageConverter.imagedirN)r   r   r   r   r"   r&   r   r'   r"   r&   r   r   )r   r*   )__name__
__module____qualname__r%   r   r    propertyr2   r#   r#   r#   r$   r       s    


r   c                   @  s8   e Zd ZdZdddZdd	d
ZdddZdddZdS )ImageDownloaderd   r"   r&   r   r'   c                 C  s(   | j jjsdS | j jjrdS d|d v S )NFz://uri)r/   buildersupported_image_typessupported_remote_imagesr(   r#   r#   r$   r   4   s
   

zImageDownloader.matchr   c           	   
   C  s   z]t j|d }d|v r|dd }|dkst|tkr4t j|d \}}t| dd	 | }t
d|}t|d  dd	 }t| j||}|jjddd	 | || W d S  ty} } ztd
}t||d | W Y d }~d S d }~ww )Nr;   ?r    Fusedforsecurity_T)parentsexist_okz%Could not fetch remote image: %s [%s])r,   r-   basenamesplitlenMAX_FILENAME_LENsplitextr   encode	hexdigestCRITICAL_PATH_CHAR_REsubr   r2   parentmkdir_download_image	Exceptionr	   loggerwarning)	r!   r"   rF   filenameexturi_hashr-   excmsgr#   r#   r$   r    ;   s$    zImageDownloader.handler-   r   c           	      C  s   i }|  rt| j}t||d< | jj}tj|d ||j	|j
|jfd}|jdkr<td}t||d |j d S |d | jjjt|< |jdkrR||j |jd }rft|}t|||f | || d S )NzIf-Modified-Sincer;   )headers_user_agent	_tls_infoi  z%Could not fetch remote image: %s [%d]   zLast-Modified)existsr   statst_mtimer   r/   configr   get
user_agent
tls_verifytls_cacertsstatus_coder	   rS   rT   envoriginal_image_urir   write_bytescontentrZ   r   r,   utime_process_image)	r!   r"   r-   rZ   	timestampra   rrY   last_modifiedr#   r#   r$   rQ   P   s*   


zImageDownloader._download_imagec                 C  s   t |}|d | jjj|< t|dd}|dkrE|jdkrEt|p!d}||j| }t	
|| | jjj| |d | jjjt |< |}t|}|d d ||d |< ||d< | jjj| jj| d S )Nr;   *)defaultr@   
candidatesr?   )r   r/   rg   rh   r   suffixr   	with_namenamer,   replacepopr*   r+   add_filedocname)r!   r"   r-   str_pathmimetyperV   with_extpath_strr#   r#   r$   rl   k   s   zImageDownloader._process_imageNr3   r4   )r"   r&   r-   r   r   r   )r5   r6   r7   default_priorityr   r    rQ   rl   r#   r#   r#   r$   r9   1   s    


r9   c                   @  s$   e Zd ZdZdddZdd	d
ZdS )DataURIExtractor   r"   r&   r   r'   c                 C  s    | j jjdu r	dS |d dS )NTFr;   zdata:)r/   r<   supported_data_uri_images
startswithr(   r#   r#   r$   r      s   zDataURIExtractor.matchr   c                 C  s  t |d }|d usJ t|j}|d u r'tjtd|d d d |d d S ttj	| j
d t|jdd }t| j
d|| }|d | jjj|< t|d}||j W d    n1 sbw   Y  t|}|d	 d
 ||d	 |j< ||d< | jjj| jj| d S )Nr;   zUnknown image format: %s...r   )locationembededFrA   wbrr   r?   )r   r   r{   rS   rT   r	   r   r,   r-   r.   r2   r   datarL   r   r/   rg   rh   openwriter*   rw   r+   rx   ry   )r!   r"   r   rV   digestr-   fr}   r#   r#   r$   r       s(   
zDataURIExtractor.handleNr3   r4   )r5   r6   r7   r~   r   r    r#   r#   r#   r$   r      s    
r   rU   r*   r{   r   c                 C  s4   t j| }td|}t j|d t|pd S )NrC   r   r@   )r,   r-   rF   rM   rN   rJ   r   )rU   r{   rF   r#   r#   r$   get_filename_for   s   r   c                   @  sj   e Zd ZU dZdZdZded< g Zded< 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S )$ImageConvertera  A base class for image converters.

    An image converter is kind of Docutils transform module.  It is used to
    convert image files which are not supported by a builder to the
    appropriate format for that builder.

    For example, :py:class:`LaTeX builder <.LaTeXBuilder>` supports PDF,
    PNG and JPEG as image formats.  However it does not support SVG images.
    For such case, using image converters allows to embed these
    unsupported images into the document.  One of the image converters;
    :ref:`sphinx.ext.imgconverter <sphinx.ext.imgconverter>` can convert
    a SVG image to PNG format using Imagemagick internally.

    There are three steps to make your custom image converter:

    1. Make a subclass of ``ImageConverter`` class
    2. Override ``conversion_rules``, ``is_available()`` and ``convert()``
    3. Register your image converter to Sphinx using
       :py:meth:`.Sphinx.add_post_transform`
    r]   Nzbool | None	availablezlist[tuple[str, str]]conversion_rulesr"   r&   r   r'   c                 C  s   | j jjsdS d|d v rdS t| |}t| j jj}||@ r#dS | jd u r.|  | j_| js3dS z| | W dS  t	yE   Y dS w )NFr?   rr   T)
r/   r<   r=   setguess_mimetypesr   is_available	__class__get_conversion_rule
ValueError)r!   r"   node_mime_typesr=   r#   r#   r$   r      s$   

zImageConverter.matchtuple[str, str]c                 C  sJ   |  |D ]}| jjjD ]}||f}|| jv r|    S qqd}t|)NzNo conversion rule found)r   r/   r<   r=   r   r   )r!   r"   	candidate	supportedrulerY   r#   r#   r$   r      s   
z"ImageConverter.get_conversion_rulec                 C     t )z/Return the image converter is available or not.NotImplementedErrorr1   r#   r#   r$   r      s   zImageConverter.is_available	list[str]c                 C  sX   d|d v rg S d|d v r&t j| jj|d }t|}|d ur$|gS g S |d  S )Nr?   rr   rp   r;   )r,   r-   r.   r/   srcdirr   keys)r!   r"   r-   guessedr#   r#   r$   r      s   zImageConverter.guess_mimetypesr   c                 C  s   |  |\}}||d v r|d | }n|d d }| jj| d }t||}t| j tj| j|}tj| j	j
|}| ||rnd|d v rP||d d< n||d |< ||d< || jjt|< | jj| jj| d S d S )Nrr   rp      r;   )r   rg   r+   r   r   r2   r,   r-   r.   r/   r   convertrh   r   rx   ry   )r!   r"   _from_tosrcpathrU   destpathabs_srcpathr#   r#   r$   r      s"   

zImageConverter.handler   r*   r   c                 C  r   )zConvert an image file to the expected format.

        *_from* is a path of the source image file, and *_to* is a path
        of the destination file.
        r   )r!   r   r   r#   r#   r$   r     s   zImageConverter.convertr3   )r"   r&   r   r   )r   r'   )r"   r&   r   r   r4   )r   r*   r   r*   r   r'   )r5   r6   r7   __doc__r~   r   __annotations__r   r   r   r   r   r    r   r#   r#   r#   r$   r      s   
 





r   r/   r   r   c                 C  s    |  t |  t ddddS )NbuiltinT)versionparallel_read_safeparallel_write_safe)add_post_transformr9   r   )r/   r#   r#   r$   setup"  s   

r   )rU   r*   r{   r*   r   r*   )r/   r   r   r   )2r   
__future__r   r,   rehashlibr   mathr   pathlibr   typingr   r   docutilsr   sphinx.localer	   sphinx.transformsr
   sphinx.utilr   r   sphinx.util._pathlibr   sphinx.util.http_dater   r   sphinx.util.imagesr   r   r   sphinx.util.osutilr   sphinx.applicationr   sphinx.util.typingr   	getLoggerr5   rS   rI   compilerM   r   r9   r   r   r   r   r#   r#   r#   r$   <module>   s8    

N
!|