
    -Ph                       d Z ddlmZ ddlZddlmZ ddlmZm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 er(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mZ  ej         e!          Z" G d de          Z#d dZ$d!dZ%d"dZ&dS )#a  Extension to save typing and prevent hard-coding of base URLs in reST files.

This adds a new config value called ``extlinks`` that is created like this::

   extlinks = {'exmpl': ('https://example.invalid/%s.html', caption), ...}

Now you can use e.g. :exmpl:`foo` in your documents.  This will create a
link to ``https://example.invalid/foo.html``.  The link caption depends on
the *caption* value given:

- If it is ``None``, the caption will be the full URL.
- If it is a string, it must contain ``%s`` exactly once.  In this case the
  caption will be *caption* with the role content substituted for ``%s``.

You can also give an explicit caption, e.g. :exmpl:`Foo <foo>`.

Both, the url string and the caption string must escape ``%`` as ``%%``.
    )annotationsN)TYPE_CHECKING)nodesutils)__)SphinxPostTransform)loggingrst)split_explicit_title)Sequence)Any)Nodesystem_message)Inliner)Sphinx)ExtensionMetadataRoleFunctionc                  &    e Zd ZdZdZddZdd
ZdS )ExternalLinksCheckerzFor each external link, check if it can be replaced by an extlink.

    We treat each ``reference`` node without ``internal`` attribute as an external link.
    i  kwargsr   returnNonec                    | j         j        sd S | j                            t          j                  D ]}|                     |           d S N)configextlinks_detect_hardcoded_linksdocumentfindallr   	reference	check_uri)selfr   refnodes      S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sphinx/ext/extlinks.pyrunzExternalLinksChecker.run6   sT    {: 	F},,U_== 	$ 	$GNN7####	$ 	$    r"   nodes.referencec                   d|v sd|vrdS |d         }|                                 }| j        j        j                                        D ]\  }\  }}t          j        t          j        |                              dd                    }|	                    |          }|r|
                                                    d          rd|
                                d         vrt          d          }	|
                                                    d          }
||k    rd	| d
t          j        |           d|
 d}n	d	| d
|
 d}t                              |	|||           !dS )z{If the URI in ``refnode`` has a replacement in ``extlinks``,
        emit a warning with a replacement suggestion.
        internalrefuriNz%sz(?P<value>.+)value/zHhardcoded link %r could be replaced by an extlink (try using %r instead):z:`z <z>``)location)astextappr   extlinksitemsrecompileescapereplacematch	groupdictgetr   r
   loggerwarning)r!   r"   urititlealiasbase_uri_captionuri_patternr7   msgr*   replacements               r#   r    zExternalLinksChecker.check_uri=   s      HG$;$;Fh  +/8?+C+I+I+K+K 	H 	H'E'Hh*RYx%8%8%@%@%W%WXXK%%c**EHOO%%))'22H u00999 -  ))--g66%<<"Me"M"Msz%/@/@"M"ME"M"M"MKK"7e"7"7u"7"7"7KsCwGGG'	H 	Hr%   N)r   r   r   r   )r"   r&   r   r   )__name__
__module____qualname____doc__default_priorityr$   r     r%   r#   r   r   .   sT         
 $ $ $ $H H H H H Hr%   r   namestrbase_urlcaption
str | Noner   r   c                "     	 	 dd fd}|S )NrI   typrK   rawtexttextlinenointinlinerr   optionsdict[str, Any] | NonecontentSequence[str]r   'tuple[list[Node], list[system_message]]c                    t          j        |          }t          |          \  }}}	|	z  }
|s
|
}n|	z  }t          j        ||d|
          }|d                             d            |gg fS )NF)r(   r)   classeszextlink-)r   unescaper   r   r   append)rP   rQ   rR   rS   rU   rV   rX   has_explicit_titler=   partfull_urlpnoderL   rM   rJ   s               r#   rolezmake_link_role.<locals>.rolec   s     ~d##*>t*D*D'E4d?! 	' $uuXNNNi 14 1 1222w{r%   )NrI   )rP   rK   rQ   rK   rR   rK   rS   rT   rU   r   rV   rW   rX   rY   r   rZ   rI   )rJ   rL   rM   rc   s   ``` r#   make_link_rolerd   ]   sA     *.!#        * Kr%   r0   r   r   c           	         | j         j                                        D ]-\  }\  }}|                     |t	          |||                     .d S r   )r   r1   r2   add_rolerd   )r0   rJ   rL   rM   s       r#   setup_link_rolesrg   {   s]    %(Z%8%>%>%@%@ D D!!xT>$'BBCCCCD Dr%   r   c                :   |                      di dt          t          h                     |                      dddt          t          h                     |                     dt
                     |                     t                     t          j	        ddS )	Nr1   env)typesr   Fzbuilder-initedT)versionparallel_read_safe)
add_config_value	frozensetdictboolconnectrg   add_post_transformr   sphinx__display_version__)r0   s    r#   setupru      s    Ri6G6GHHH)5%y$?P?P     KK "2333/000-"  r%   )rJ   rK   rL   rK   rM   rN   r   r   )r0   r   r   r   )r0   r   r   r   )'rG   
__future__r   r3   typingr   docutilsr   r   rs   sphinx.localer   !sphinx.transforms.post_transformsr   sphinx.utilr	   r
   sphinx.util.nodesr   collections.abcr   r   docutils.nodesr   r   docutils.parsers.rst.statesr   sphinx.applicationr   sphinx.util.typingr   r   	getLoggerrD   r:   r   rd   rg   ru   rI   r%   r#   <module>r      s   & # " " " " " 				             ! ! ! ! ! ! ! !        A A A A A A $ $ $ $ $ $ $ $ 2 2 2 2 2 2 C((((((33333333333333))))))BBBBBBBB		8	$	$,H ,H ,H ,H ,H. ,H ,H ,H^   <D D D D
     r%   