o
    Niu                     @  s   d Z ddlmZ ddlZddlmZ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mZ ddlmZ ddlmZ ddlmZmZ e e!Z"G dd deZ#d!ddZ$d"ddZ%d#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Any)nodesutils)__)SphinxPostTransform)loggingrst)split_explicit_title)Sequence)Nodesystem_message)Inliner)Sphinx)ExtensionMetadataRoleFunctionc                   @  s(   e Zd ZdZdZdddZdddZdS )ExternalLinksCheckerz
    For 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                 K  s.   | j jsd S | jtjD ]}| | qd S N)configextlinks_detect_hardcoded_linksdocumentfindallr   	reference	check_uri)selfr   refnode r    G/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/ext/extlinks.pyrun6   s
   zExternalLinksChecker.runr   nodes.referencec                 C  s   d|v sd|vr
dS |d }|  }| jjj D ]Y\}\}}tt|dd}|	|}|rr|
 drrd|
 d vrrtd}	|
 d}
||kr`d	| d
t| d|
 d}n	d	| d
|
 d}tj|	|||d q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_patternr3   msgr&   replacementr    r    r!   r   =   s(   
 zExternalLinksChecker.check_uriN)r   r   r   r   )r   r#   r   r   )__name__
__module____qualname____doc__default_priorityr"   r   r    r    r    r!   r   -   s
    
r   namestrbase_urlcaptionr   r   c                   s   	 	dd fdd}|S )Nr    typrF   rawtexttextlinenointinlinerr   optionsdict[str, Any] | NonecontentSequence[str]r   'tuple[list[Node], list[system_message]]c                   sj   t |}t|\}}}	 |	 }
|sd u r|
}n|	 }tj||d|
d}|d d  |gg fS )NF)r$   r%   classeszextlink-)r   unescaper   r   r   append)rI   rJ   rK   rL   rN   rO   rQ   has_explicit_titler9   partfull_urlpnoderG   rH   rE   r    r!   roleb   s   

zmake_link_role.<locals>.role)Nr    )rI   rF   rJ   rF   rK   rF   rL   rM   rN   r   rO   rP   rQ   rR   r   rS   r    )rE   rG   rH   r\   r    r[   r!   make_link_role\   s   r]   r,   r   r   c                 C  s2   | j j D ]\}\}}| |t||| qd S r   )r   r-   r.   add_roler]   )r,   rE   rG   rH   r    r    r!   setup_link_rolest   s   r_   r   c                 C  s>   |  di d |  ddd | dt | t tjddS )Nr-   envr   Fzbuilder-initedT)versionparallel_read_safe)add_config_valueconnectr_   add_post_transformr   sphinx__display_version__)r,   r    r    r!   setupy   s
   
rh   )rE   rF   rG   rF   rH   rF   r   r   )r,   r   r   r   )r,   r   r   r   )'rC   
__future__r   r/   typingr   r   docutilsr   r   rf   sphinx.localer   !sphinx.transforms.post_transformsr   sphinx.utilr	   r
   sphinx.util.nodesr   collections.abcr   docutils.nodesr   r   docutils.parsers.rst.statesr   sphinx.applicationr   sphinx.util.typingr   r   	getLoggerr@   r6   r   r]   r_   rh   r    r    r    r!   <module>   s*    

/
