
    Fe(                    t   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
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mZ ddlmZmZmZ ddlmZ e
rddlmZ  ej@                  e!      Z"dZ# ejH                  d      Z% G d de      Z& G d de&      Z' G d de&      Z(ddZ) G d de&      Z*ddZ+y)z#Docutils transforms used by Sphinx.    )annotationsN)sha1)ceil)TYPE_CHECKINGAny)nodes)__)SphinxTransform)loggingrequests)epoch_to_rfc1123rfc1123_to_epoch)get_image_extensionguess_mimetypeparse_data_uri)	ensuredir)Sphinx    z
[:;<>|*" ]c                  6    e Zd ZddZddZddZed	d       Zy)
BaseImageConverterc                    | j                   j                  t        j                        D ]%  }| j	                  |      s| j                  |       ' y N)documentfindallr   imagematchhandle)selfkwargsnodes      J/usr/lib/python3/dist-packages/sphinx/transforms/post_transforms/images.pyapplyzBaseImageConverter.apply   s<    MM))%++6 	"Dzz$D!	"    c                     y)NT r   r    s     r!   r   zBaseImageConverter.match#   s    r#   c                     y r   r%   r&   s     r!   r   zBaseImageConverter.handle&   s    r#   c                j    t         j                  j                  | j                  j                  d      S )Nimages)ospathjoinapp
doctreedirr   s    r!   imagedirzBaseImageConverter.imagedir)   s!    ww||DHH//::r#   N)r   r   returnNoner    nodes.imager1   boolr    r4   r1   r2   )r1   str)__name__
__module____qualname__r"   r   r   propertyr0   r%   r#   r!   r   r      s%    "
 ; ;r#   r   c                       e Zd ZdZddZddZy)ImageDownloaderd   c                    | j                   j                  j                  g k(  ry| j                   j                  j                  ryd|d   v S )NF://uri)r-   buildersupported_image_typessupported_remote_imagesr&   s     r!   r   zImageDownloader.match1   sB    8811R78833U##r#   c                   	 t         j                  j                  |d         }d|v r|j                  d      d   }|dk(  st	        |      t
        kD  rQt         j                  j                  |d         \  }}t        |j                         d      j                         |z   }t        j                  t        d|      }|d   j                  dd	      j                  t        d      d	t        d
      d	i      }t	        |      t
        kD  r)t        |j                         d      j                         }t!        t         j                  j#                  | j$                  |             t         j                  j#                  | j$                  ||      }i }t         j                  j'                  |      r6t)        t        j*                  |      j,                        }t/        |      |d<   t1        j2                  |d   |      }	|	j4                  dk\  r1t6        j9                  t;        d      |d   |	j4                  fz         y |d   | j<                  j>                  j@                  |<   |	j4                  dk(  r0tC        |d      5 }
|
jE                  |	jF                         d d d        |	jH                  j3                  d      }|r#tK        |      }t        jL                  |||f       tO        |d      }|dk7  rt         j                  j                  |      d   dk(  rtQ        |      }t         j                  j#                  | j$                  |||z         }t        j                  ||       | j<                  j>                  j@                  jS                  |       |d   | j<                  j>                  j@                  |<   |}|d   jS                  d       ||d   |<   ||d<   | j<                  j>                  jT                  jW                  | j>                  jX                  |       y # 1 sw Y   xY w# tZ        $ r0}t6        j9                  t;        d      |d   |fz         Y d }~y d }~ww xY w)NrA   ?r    Fusedforsecurity_r@   /&zIf-Modified-Since)headersi  z%Could not fetch remote image: %s [%d]   wbzlast-modified*)default   
candidatesz%Could not fetch remote image: %s [%s]).r*   r+   basenamesplitlenMAX_FILENAME_LENsplitextr   encode	hexdigestresubCRITICAL_PATH_CHAR_REreplace	translateordr   r,   r0   existsr   statst_mtimer   r   getstatus_codeloggerwarningr	   r-   envoriginal_image_uriopenwritecontentrM   r   utimer   r   popr)   add_filedocname	Exception)r   r    rT   filenameextdirnamer+   rM   	timestamprflast_modifiedmimetypenewpathexcs                  r!   r   zImageDownloader.handle8   sv   3	]ww''U4Hh#>>#.q12~X1A!A " 0 0e =# 15ISSUX[[vv3S(CH5k))%5??S3ADS3AP QG7|..w~~/GQQSbggll4==':;77<<wADGww~~d##'(>(>#?	/?	/J+,T%[':A}}#r"IJ $UQ]]; < = 9=U//5==C'dD) +Q		*+ !"		o >  0 ?IHHTIy#9:)$<s?rww'7'7'A!'D'J-h7C ggll4=='8c>RGJJtW-HHLL3377=?CE{DHHLL33G<"D\"&&s+/3\"8,"U##,,TXX-=-=tD)+ +*  	]NN2EF$u+WZI[[\\	]s8   I P8 AP8 P+ F
P8 +P50P8 8	Q1&Q,,Q1Nr3   r6   r8   r9   r:   default_priorityr   r   r%   r#   r!   r=   r=   .   s    $4]r#   r=   c                       e Zd ZdZddZddZy)DataURIExtractor   c                    | j                   j                  j                  g k(  ry| j                   j                  j                  du ry|d   j	                  d      S )NFTrA   zdata:)r-   rB   rD   supported_data_uri_images
startswithr&   s     r!   r   zDataURIExtractor.matchr   sM    8833r98855=E{%%g..r#   c                T   t        |d         }|J t        |j                        }|(t        j	                  t        d      |d   d d |       y t        t        j                  j                  | j                  d             t        |j                  d      j                         }t        j                  j                  | j                  d||z         }|d   | j                  j                  j                   |<   t#        |d      5 }|j%                  |j                         d d d        |d	   j'                  d
       ||d	   |j                  <   ||d<   | j                  j                  j(                  j+                  | j                  j,                  |       y # 1 sw Y   yxY w)NrA   zUnknown image format: %s...r   )locationembededFrH   rO   rS   rF   )r   r   ry   rf   rg   r	   r   r*   r+   r,   r0   r   datarZ   r-   rh   ri   rj   rk   rn   r)   ro   rp   )r   r    r   rs   digestr+   rw   s          r!   r   zDataURIExtractor.handley   sS   tE{+   !%..1;NN2;<d5k#2>N$(  *"'',,t}}i89ejj%8BBDww||DMM9fslC04U''-$ 	 GGEJJ	  	\s#-1\5>>*U$$TXX%5%5t<	  	 s   
FF'Nr3   r6   r|   r%   r#   r!   r   r   o   s    /=r#   r   c                    t         j                  j                  |       }t        j                  t
        d|      }t         j                  j                  |      d   t        |      xs dz   S )NrJ   r   rG   )r*   r+   rT   r[   r\   r]   rX   r   )rr   ry   rT   s      r!   get_filename_forr      sS    ww)Hvv+S(;H77H%a(,?,I,ORPPr#   c                  v     e Zd ZU dZdZdZded<   g Zded<   d fdZdd	Z	dd
Z
ddZddZddZddZ xZ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`
    rN   Nzbool | None	availablezlist[tuple[str, str]]conversion_rulesc                $    t        |   |i | y r   )super__init__)r   argsr   	__class__s      r!   r   zImageConverter.__init__   s    $)&)r#   c                   | j                   j                  j                  syd|d   v ryt        | j	                  |            t        | j                   j                  j                        z  ry| j
                  | j                         | j                  _        | j
                  sy	 | j                  |       y# t        $ r Y yw xY w)NFrF   rS   T)
r-   rB   rC   setguess_mimetypesr   is_availabler   get_conversion_rule
ValueErrorr&   s     r!   r   zImageConverter.match   s    xx55$|$$t##D)*S1A1A1W1W-XX>>!'+'8'8':DNN$~~((.   s   (B: :	CCc                    | j                  |      D ]?  }| j                  j                  j                  D ]  }||f}|| j                  v s|c c S  A d}t        |      )NzNo conversion rule found)r   r-   rB   rC   r   r   )r   r    	candidate	supportedrulemsgs         r!   r   z"ImageConverter.get_conversion_rule   si    --d3 	 I!XX--CC  	!9-4000K 	  )or#   c                    t         )z/Return the image converter is available or not.NotImplementedErrorr/   s    r!   r   zImageConverter.is_available   s    !!r#   c                r    d|d   v rg S d|d   v rt        |d         }||gS g S |d   j                         S )NrF   rS   rP   rA   )r   keys)r   r    guesseds      r!   r   zImageConverter.guess_mimetypes   sU    $|$$ID&&$T%[1G ' 3G9;;%**,,r#   c                   | j                  |      \  }}||d   v r	|d   |   }n|d   d   }| j                  j                  |   d   }t        ||      }t	        | j
                         t        j                  j                  | j
                  |      }t        j                  j                  | j                  j                  |      }| j                  ||      rqd|d   v r	||d   d<   n||d   |<   ||d<   || j                  j                  |<   | j                  j                  j                  | j                  j                  |       y y )NrS   rP   rR   rA   )r   rh   r)   r   r   r0   r*   r+   r,   r-   srcdirconvertri   ro   rp   )r   r    _from_tosrcpathrr   destpathabs_srcpaths           r!   r   zImageConverter.handle   s!   --d3
sD&&<(/G<(-G88??7+A.#Hc2$-- 77<<x8ggll488??G<<<X.d<((*2\"3'*2\"3'"DK4;DHH''1HHOO$$TXX%5%5x@ /r#   c                    t         )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   s      r!   r   zImageConverter.convert  s
     "!r#   )r   r   r   r   r1   r2   r3   )r    r4   r1   ztuple[str, str])r1   r5   )r    r4   r1   z	list[str]r6   )r   r7   r   r7   r1   r5   )r8   r9   r:   __doc__r}   r   __annotations__r   r   r   r   r   r   r   r   __classcell__)r   s   @r!   r   r      sN    (  "I{! /1+0*,"-A0"r#   r   c                b    | j                  t               | j                  t               ddddS )NbuiltinT)versionparallel_read_safeparallel_write_safe)add_post_transformr=   r   )r-   s    r!   setupr     s4    ?++, "# r#   )rr   r7   ry   r7   r1   r7   )r-   r   r1   zdict[str, Any]),r   
__future__r   r*   r[   hashlibr   mathr   typingr   r   docutilsr   sphinx.localer	   sphinx.transformsr
   sphinx.utilr   r   sphinx.util.http_dater   r   sphinx.util.imagesr   r   r   sphinx.util.osutilr   sphinx.applicationr   	getLoggerr8   rf   rW   compiler]   r   r=   r   r   r   r   r%   r#   r!   <module>r      s    ) " 	 	   %   - ) D R R ()			8	$ "

<0 ; ;">]( >]B=) =BQw"' w"tr#   