
    Fe'                       U d Z ddlmZ ddlZddl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mZmZmZ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 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*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5  e!jl                  e7      Z8 ejr                  d      Z:de;d<    ejr                  d      Z<de;d<   d:dZ=d;dZ> G d de?      Z@d<dZAd<dZB G d d e?      ZC ejr                  d!      ZD G d" d#      ZE G d$ d%      ZFd=d&ZGd>d?d'ZHd@d(ZIdAd)ZJd* ZKe#j                  d+fej                  d,fej                  d-fej                  d.fej                  d/fej                  d0fej                  d1fej                  d2fej                  d3feKd4fe j                  d5fe j                  d6feAd7feBd7fd8ZVd9 ZWy)BzUtility functions for Sphinx.    )annotationsN)import_module)path)IOAny)	parse_qsl
quote_plus	urlencodeurlsplit
urlunsplit)ExtensionErrorFiletypeNotFoundError)__)display)
exceptions)	http_date)index_entries)logging)osutil)strip_colors)	patfilter)caption_ref_reexplicit_title_renested_parse_with_titlessplit_explicit_title)SEPcopyfile	copytimes	ensuredirmake_filenamemtimes_of_filesos_pathrelative_uriz\s+zre.Pattern[str]ws_rez(?P<schema>.+)://.*url_rec                b    t        j                  t        j                  d| z   d|            dd  S )N/z..   )	posixpathnormpathjoin)basedocnamedocnames     6/usr/lib/python3/dist-packages/sphinx/util/__init__.pydocname_joinr/   5   s.    innS;->gNOPQPRSS    c                p    | j                         D ]  \  }}|j                  |      s|xs dc S  t        )Nrestructuredtext)itemsendswithr   )source_suffixfilenamesuffixfiletypes       r.   get_filetyper9   9   sA    )//1 2V$1112  r0   c                  @    e Zd ZdZd	dZd
dZddZddZddZddZ	y)FilenameUniqDictz
    A dictionary that automatically generates unique names for its keys,
    interpreted as filenames, and keeps track of a set of docnames they
    appear in.  Used for images and downloadable files in the environment.
    c                "    t               | _        y N)set	_existingselfs    r.   __init__zFilenameUniqDict.__init__G   s    #&5r0   c                D   || v r| |   d   j                  |       | |   d   S t        j                  |      }t        j                  |      \  }}d}|| j                  v r|dz  }| | | }|| j                  v r|h|f| |<   | j                  j                  |       |S )Nr   r(   )addr   basenamesplitextr?   )rA   r-   newfile
uniquenamebaseextis          r.   add_filezFilenameUniqDict.add_fileJ   s    d?M!  )=##]]7+
MM*-	cDNN*FA 6!SE*J DNN* "J/W:&r0   c                    t        | j                               D ]:  \  }\  }}|j                  |       |r| |= | j                  j                  |       < y r=   )listr3   discardr?   )rA   r-   r6   docsuniques        r.   	purge_doczFilenameUniqDict.purge_docX   sM    (,TZZ\(: 	/$HntVLL!N&&v.		/r0   c                    |j                         D ]-  \  }\  }}|t        |      z  D ]  }| j                  ||        / y r=   r3   r>   rL   )rA   docnamesotherr6   rP   _uniquedocs          r.   merge_otherzFilenameUniqDict.merge_other_   sF    ). 	-%HotWc(m+ -c8,-	-r0   c                    | j                   S r=   r?   r@   s    r.   __getstate__zFilenameUniqDict.__getstate__d   s    ~~r0   c                    || _         y r=   r[   )rA   states     r.   __setstate__zFilenameUniqDict.__setstate__g   s	    r0   NreturnNone)r-   strrG   rc   ra   rc   r-   rc   ra   rb   rU   set[str]rV   zdict[str, tuple[set[str], Any]]ra   rb   )ra   rf   )r^   rf   ra   rb   )
__name__
__module____qualname____doc__rB   rL   rR   rY   r\   r_    r0   r.   r;   r;   A   s%    
)/-
r0   r;   c                0    t        j                  | d      S )zKDeprecated wrapper around hashlib.md5

    To be removed in Sphinx 9.0
    Fusedforsecurity)hashlibmd5data_kws     r.   _md5rt   k   s    
 ;;tU33r0   c                0    t        j                  | d      S )zLDeprecated wrapper around hashlib.sha1

    To be removed in Sphinx 9.0
    Frm   )ro   sha1rq   s     r.   _sha1rw   s   s    
 <<e44r0   c                  (    e Zd ZdZddZddZddZy)	DownloadFileszA special dictionary for download files.

    .. important:: This class would be refactored in nearly future.
                   Hence don't hack this directly.
    c                   || vrft        j                  |j                         d      j                         }| dt        j
                  j                  |       }t               |f| |<   | |   d   j                  |       | |   d   S )NFrm   r'   r   r(   )	ro   rp   encode	hexdigestosr   rE   r>   rD   )rA   r-   r6   digestdests        r.   rL   zDownloadFiles.add_file   s    4[[!2EJTTVFXQrww//9:;D!eT]DNXqg&H~a  r0   c                z    t        | j                               D ]  \  }\  }}|j                  |       |r| |= ! y r=   )rN   r3   rO   )rA   r-   r6   rP   _dests        r.   rR   zDownloadFiles.purge_doc   s;    '+DJJL'9 	##HmtULL!N	#r0   c                    |j                         D ]-  \  }\  }}|t        |      z  D ]  }| j                  ||        / y r=   rT   )rA   rU   rV   r6   rP   r   r-   s          r.   rY   zDownloadFiles.merge_other   sF    ',{{} 	1#HmtU#h-/ 1gx01	1r0   N)r-   rc   r6   rc   ra   rc   rd   re   )rg   rh   ri   rj   rL   rR   rY   rk   r0   r.   ry   ry   {   s    !#1r0   ry   zcoding[:=]\s*([-\w.]+)c                       e Zd ZdZddZddZy)UnicodeDecodeErrorHandlerz8Custom error handler for open() that warns and replaces.c                    || _         y r=   )r-   )rA   r-   s     r.   rB   z"UnicodeDecodeErrorHandler.__init__   s	    r0   c                V   |j                   j                  dd|j                        }|j                   j                  d|j                        }|dk(  rt	        |j                         }|j                   j                  dd|j                        dz   }t        j                  t        d      |j                   |dz   |j                   dz   |j                   |j                  |j                   z   dz   |j                   |j                  | z   | j                  |f       d	|j                  fS )
N   
r   r(   z5undecodable source characters, replacing with "?": %rs   >>>s   <<<)location?)objectrfindstartfindlencountloggerwarningr   endr-   )rA   error	linestartlineendlinenos        r.   __call__z"UnicodeDecodeErrorHandler.__call__   s    LL&&ua=	,,##E5;;7b=%,,'G##E1ekk:Q>rQRY]5;;?&HU[[;<>DEUYYw78 "&v 6	 	 	8
 UYYr0   Nrd   )r   UnicodeDecodeErrorra   ztuple[str, int])rg   rh   ri   rj   rB   r   rk   r0   r.   r   r      s    B r0   r   c                  (    e Zd ZdZddZddZddZy)	Teez2
    File-like object writing to two streams.
    c                     || _         || _        y r=   )stream1stream2)rA   r   r   s      r.   rB   zTee.__init__   s    r0   c                p    | j                   j                  |       | j                  j                  |       y r=   )r   writer   )rA   texts     r.   r   z	Tee.write   s&    4 4 r0   c                    t        | j                  d      r| j                  j                          t        | j                  d      r| j                  j                          y y )Nflush)hasattrr   r   r   r@   s    r.   r   z	Tee.flush   sC    4<<)LL 4<<)LL  *r0   N)r   r   r   r   ra   rb   )r   rc   ra   rb   r`   )rg   rh   ri   rj   rB   r   r   rk   r0   r.   r   r      s    !!r0   r   c                   g }| j                  d      }|D ]  }	 |j                         j                  d      }ddg|k(  rt        t        |      dk(  r!|j	                  t        |d         dz
         nlt        |      dk(  rXt        |d   xs d      }t        |d   xs t        ||            }||kD  rt        |j                  t        |dz
  |             nt         |S # t        $ r}d| }	t        |	      |d}~ww xY w)	z_Parse a line number spec (such as "1,2,4-6") and return a list of
    wanted line numbers.
    ,- r(   r      zinvalid line number spec: N)	splitstrip
ValueErrorr   appendintmaxextendrange)
spectotalr3   partspartbegendr   r   excmsgs
             r.   parselinenosr      s    EJJsOE +	+ZZ\'',FBx6!  6{aS^a/0V!F1IN+&)8s5%'893;$$U519c23  +& L	  	+.th7CS/s*	+s   CC%%	D.C??Dc                H   	 | j                  d      }|j                  d      }t        |      }|D ]  }|d|z   z  }	 t        ||      } |S # t        $ r t        |      }Y 2w xY w# t        t
        f$ r+}|rt        d| d|d|      |t        d| z  |      |d}~ww xY w)z!Import python object by qualname..r   zCould not import z (needed for )zCould not import %sN)r   popr   getattrAttributeErrorImportErrorr   )objnamesourceobjpathmodnameobjnamer   s          r.   import_objectr      s    L--$++a.G$ 	-DsTz!G-c4(	- 
 " -#G,- K( L ")6"3479>AB2W<cBK	Ls:   :A' A	A' A$!A' #A$$A' 'B!6&BB!c                T   t        t        |             }|d   j                  d      j                  d      |d<   t	        |d   j                         d      |d<   t        |d         D cg c]  \  }}||j                         f }}}t        |      |d<   t        |      S c c}}w )Nr(   idnaasciir   r'      )rN   r   r{   decoder	   r   r
   r   )urir   qvquerys        r.   
encode_urir      s    #EQxv&--g6E!H%(//+S1E!H+4U1X+>?!Qa_?E?E!He @s   ,B$c                $    t        |       xr d| v S )zCheck *url* is URL or not.z://)bool)urls    r.   isurlr      s    9%#%r0   c                     ddl m}  | S )Nr   _XML_NAME_PATTERN)sphinx.builders.epub3r   r   s    r.   _xml_name_checkerr     s    7r0   z!sphinx.util.osutil.path_stabilizez!sphinx.util.display.display_chunkz#sphinx.util.display.status_iteratorz'sphinx.util.display.SkipProgressMessagez$sphinx.util.display.progress_messagez!sphinx.http_date.epoch_to_rfc1123z!sphinx.http_date.rfc1123_to_epochz sphinx.exceptions.save_tracebackz-sphinx.exceptions.format_exception_cut_framesz'sphinx.builders.epub3._XML_NAME_PATTERNz)sphinx.util.index_entries.split_index_msgz$sphinx.util.index_entries.split_intor   )path_stabilizedisplay_chunkstatus_iteratorSkipProgressMessageprogress_messageepoch_to_rfc1123rfc1123_to_epochsave_tracebackformat_exception_cut_framesxmlname_checkersplit_index_msg
split_intorp   rv   c                    | t         vrdt        d| }t        |      ddlm} t         |    \  }} |t        | |d       |S )Nzmodule z has no attribute r   )_deprecation_warning)   r   )remove)_DEPRECATED_OBJECTSrg   r   sphinx.deprecationr   )r   r   r   deprecated_objectcanonical_names        r.   __getattr__r      sP    &&|#5dX>S!!7(;D(A%~4Gr0   )r,   rc   r-   rc   ra   rc   )r5   zdict[str, str]r6   rc   ra   rc   )r0   )r   rc   r   r   ra   z	list[int]r=   )r   rc   r   z
str | Nonera   r   )r   rc   ra   rc   )r   rc   ra   r   )Xrj   
__future__r   ro   r}   r)   re	importlibr   r   typingr   r   urllib.parser   r	   r
   r   r   sphinx.errorsr   r   sphinx.localer   sphinx.utilr   _displayr   _exceptionsr   
_http_dater   _index_entriesr   r   _osutilsphinx.util.consoler   sphinx.util.matchingr   sphinx.util.nodesr   r   r   r   sphinx.util.osutilr   r   r   r   r    r!   r"   r#   	getLoggerrg   r   compiler$   __annotations__r%   r/   r9   dictr;   rt   rw   ry   
_coding_rer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rk   r0   r.   <module>r     s   # "  	  	 #   O O ?  + 1 / 7  ) , * 	 	 	 
		8	$ $F+ +$"**%;< <
T 't 'T451D 1: RZZ12
   ,! !&8L*&
 --/RS,,.QR 002WX$88EG!224Z[#446YZ#446YZ"113UV$/$K$K$S$U)+TU&66CE!113YZ":BK# *	r0   