o
    Ni,T                     @  s  d Z ddlmZ ddlZddl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mZ ddlmZmZ ddlmZ ddlmZmZ erddlmZ ddlm Z  ddlm!Z! ddl"m#Z#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/m0Z0m1Z1 dPd$d%Z2dQd-d.Z3dRd3d4Z4dSd5d6Z5dTd8d9Z6dUd:d;Z7dVd<d=Z8dWd>d?Z9dXdBdCZ:G dDdE dEeZ;G dFdG dGeZ<G dHdI dIeZ=dYdNdOZ>dS )ZzKThis module provides logic for resolving references to intersphinx targets.    )annotationsN)TYPE_CHECKINGcast)nodes)relative_path)pending_xref)_deprecation_warning)ExtensionError)LOGGERInventoryAdapter)___)ReferencesResolver)CustomReSTDispatcher
SphinxRole)Iterable)
ModuleType)Any)NodeTextElementsystem_message)Reporter)Sphinx)Domain)BuildEnvironment)InventoryName)	InventoryInventoryItemRoleFunctiondomainr   inv_nameInventoryName | Nonedatar   noder   contnoder   returnnodes.referencec                 C  s  |\}}}}d|vr| drtt|d d|}|r%td||f }	ntd|f }	tjddd||	d}
| d	rB|
| |
S |d
ksQ| jdkr|d dkr|	 }|d ur{|
|d r{|
||t|d d  |t|d d   |
S |
| |
S |
||| |
S )Nz://refdoc.z(in %s v%s)z(in %s) F)internalrefurireftitlerefexplicit-stdreftypekeyword:   )get	posixpathjoinr   r   r   	referenceappendnameastext
startswith	__class__len)r   r    r"   r#   r$   projversionuridispnamer,   newnodetitle rD   S/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/ext/intersphinx/_resolve.py_create_element_from_result#   s.   

$

rF   	inventoryr   objtypesIterable[str]targetstrnodes.reference | Nonec              
     s   |D ]x vr	q|  v r  | }n[dv rp|  ttfdd   }t|dkrd fdd|D }	| p@d}
t|	dkrVtjtd|
|d	d
|d ntjtd|
|d	d
|d |ro  |d  }nqqt	|| |||  S d S )N>   std:term	std:labelc                   s   |    kS N)lower)k)target_lowerrD   rE   <lambda>^   s    z8_resolve_reference_in_domain_by_target.<locals>.<lambda>r3   c                   s   h | ]}  | qS rD   rD   ).0match)rG   objtyperD   rE   	<setcomp>a   s    z9_resolve_reference_in_domain_by_target.<locals>.<setcomp>main_inventoryz1inventory '%s': duplicate matches found for %s:%sintersphinxexternaltypesubtypelocationz0inventory '%s': multiple matches found for %s:%sr   )
rP   listfilterkeysr=   r
   debugr   warningrF   )r    rG   r   rH   rJ   r#   r$   r"   insensitive_matches
data_itemsinv_descriptorrD   )rG   rV   rR   rE   &_resolve_reference_in_domain_by_targetG   sP   	
	rg   envr   honor_disabled_refsboolc                   s   i  |}|jdkrd|v rd |d< |jdkrd|v rd |d< |jfdd|D }|r<t| jj  fd	d|D }g | }t|||||d
 ||}	|	d urT|	S ||}
|
d u r_d S t|||||
||S )Nr/   	cmdoptionoptionpy	attributemethodc                   s   i | ]
}  d | dqS r2   NrD   rT   obj_type)domain_namerD   rE   
<dictcomp>   s    z0_resolve_reference_in_domain.<locals>.<dictcomp>c                   s   i | ]	}| vr|d qS rO   rD   rq   )disabledrD   rE   rt      s    	reftarget)fromkeysr9   setconfigintersphinx_disabled_reftypesra   rg   get_full_qualified_name)rh   r    rG   ri   r   rH   r#   r$   	obj_typesresfull_qualified_namerD   )ru   rs   rE   _resolve_reference_in_domain   s0   



r   c              
   C  s   |o|d u }| j j}|rd|v rd S |d }|dkrG| j D ]%}|r,|j d|v r,q|j }	t| |||||	||}
|
d urD|
  S qd S |d}|sPd S |r[| d|v r[d S | 	|}|
|pfd}	|	skd S t| |||||	||S )N*r0   anyz:*	refdomainrD   )ry   rz   domainssortedr9   object_typesra   r   r4   
get_domainobjtypes_for_role)rh   r    rG   ri   r#   r$   rz   typr   rH   r}   rs   rD   rD   rE   _resolve_reference   sZ   	



r   r   c                 C  s   |t | jv S rO   )r   named_inventory)rh   r    rD   rD   rE   inventory_exists   s   r   c                 C  s*   t | |sJ t| |t| j| d||S )zAttempt to resolve a missing reference via intersphinx references.

    Resolution is tried in the given inventory with the target as is.

    Requires ``inventory_exists(env, inv_name)``.
    F)r   r   r   r   )rh   r    r#   r$   rD   rD   rE   resolve_reference_in_inventory   s   r   c                 C  s   t | dt| j|||S )zAttempt to resolve a missing reference via intersphinx references.

    Resolution is tried with the target as is in any inventory.
    N)r   r   rX   )rh   ri   r#   r$   rD   rD   rE   resolve_reference_any_inventory  s   
r   c                 C  sn   t | d||}|dur|S |d }d|vrdS |dd\}}t| |s&dS ||d< t| |||}||d< |S )ag  Attempt to resolve a missing reference via intersphinx references.

    Resolution is tried first with the target as is in any inventory.
    If this does not succeed, then the target is split by the first ``:``,
    to form ``inv_name:newtarget``. If ``inv_name`` is a named inventory, then resolution
    is tried in that inventory with the new target.
    TNrv   r2   r3   )r   splitr   r   )rh   r#   r$   r}   rJ   r    	newtargetres_invrD   rD   rE   "resolve_reference_detect_inventory#  s   
r   appr   c                 C  s   t |||S )zBAttempt to resolve a missing reference via intersphinx references.)r   )r   rh   r#   r$   rD   rD   rE   missing_reference?  s   r   c                      s"   e Zd ZdZd fddZ  ZS )IntersphinxDispatcherzyCustom dispatcher for external role.

    This enables :external:***:/:external+***: roles on parsing reST document.
    	role_namerK   language_moduler   linenointreporterr   r%   )tuple[RoleFunction, list[system_message]]c                   s4   t |dkr|drt|g fS t ||||S )N	   )z	external:z	external+)r=   r;   IntersphinxRolesuperrole)selfr   r   r   r   r<   rD   rE   r   L  s   zIntersphinxDispatcher.role)
r   rK   r   r   r   r   r   r   r%   r   )__name__
__module____qualname____doc__r   __classcell__rD   rD   r   rE   r   F  s    r   c                   @  sp   e Zd ZedZ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.ddZd/d!d"Zd0d%d&Zd'S )1r   z(\+([^:]+))?:(.*)	orig_namerK   r%   Nonec                 C  s
   || _ d S rO   )r   )r   r   rD   rD   rE   __init___  s   
zIntersphinxRole.__init__'tuple[list[Node], list[system_message]]c                   s  | j | j ks
J | | j\}}|r&t| j|s&| td| g g fS | |\}}|d u r=| td| g g fS |d ur|| jj	vrS| td| g g fS | jj	| }|j
|}|d u rd}|j|}|d ur|j
r| t| d||| |j
 g g fS | t||| g g fS ng }	| jjd }
r|	|
 | jj	j }d ur||	vr|	| d }|	D ]}|j
| }d ur|j } nq|d u s|d u r%| dd |	D }d	}t }|	D ]  j| }r| fd
d|j
D  q|r| d}| t|||| | g g fS | t||| g g fS || d| | j| j| j| j| j| j\}}|D ]}t|trNd|d< ||d< q>||fS )Nz4inventory for external cross-reference not found: %rz+invalid external cross-reference suffix: %rz1domain for external cross-reference not found: %rz<role for external cross-reference not found in domain %r: %rz (perhaps you meant one of: %s)default_domainc                 s  s    | ]}|j V  qd S rO   r9   )rT   drD   rD   rE   	<genexpr>      z&IntersphinxRole.run.<locals>.<genexpr>z=role for external cross-reference not found in domains %s: %rc                 3  s     | ]} j  d | V  qdS rp   r   )rT   rr   rD   rE   r     s    r2   TrY   rG   )r9   r   rP   get_inventory_and_name_suffixr   rh   _emit_warningr   _get_domain_roler   rolesr4   r   _concat_strings	temp_datar8   standard_domainrx   updaterawtexttextr   inlineroptionscontent
isinstancer   )r   rG   name_suffixrs   r   r   	role_funcmsgr   r   r   
std_domaindomains_strpossible_rolesoresultmessagesr#   rD   r   rE   runb  s   




zIntersphinxRole.runr9   tuple[str | None, str]c                 C  sh   | ds	J ||dd }|d dkr!|dd\}}||fS |d dkr+d|fS d| }t|)	a  Extract an inventory name (if any) and ``domain+name`` suffix from a role *name*.
        and the domain+name suffix.

        The role name is expected to be of one of the following forms:

        - ``external+inv:name`` -- explicit inventory and name, any domain.
        - ``external+inv:domain:name`` -- explicit inventory, domain and name.
        - ``external:name`` -- any inventory and domain, explicit name.
        - ``external:domain:name`` -- any inventory, explicit domain and name.
        rZ   r   N   +r2   r3   z Malformed :external: role name: )r;   r   
ValueError)r   r9   suffixr    r   rD   rD   rE   r     s   
z-IntersphinxRole.get_inventory_and_name_suffixtuple[str | None, str | None]c                 C  sB   | d}t|dkrd|d fS t|dkr|d |d fS dS )a  Convert the *name* string into a domain and a role name.

        - If *name* contains no ``:``, return ``(None, name)``.
        - If *name* contains a single ``:``, the domain/role is split on this.
        - If *name* contains multiple ``:``, return ``(None, None)``.
        r2   r3   Nr      )NN)r   r=   )r   r9   namesrD   rD   rE   r     s   
z IntersphinxRole._get_domain_roler   argsr   c                G  s*   t j|g|R dd| jj| jfd d S )NrY   rZ   r[   )r
   rc   rh   docnamer   )r   r   r   rD   rD   rE   r     s   zIntersphinxRole._emit_warningstringsrI   c                 C  s   d dd t|D S )Nz, c                 s  s    | ]}|V  qd S rO   rD   )rT   srD   rD   rE   r     r   z2IntersphinxRole._concat_strings.<locals>.<genexpr>)r6   r   )r   r   rD   rD   rE   r     s   zIntersphinxRole._concat_stringstuple[str, str] | Nonec                 C  s   t t| jj dddd |d}t|dkr+| jjd}|r$|jnd }|d }nt|d	kr:|d }|d }nd S |rH| 	||rH||fS | 	d
|rRd
|fS d S )Nz.get_role_namer)   r   r   remover2   r3   r   r   r   r/   )
r   r   r<   r   r=   rh   r   r4   r9   is_existent_role)r   r9   r   r   r   r   rD   rD   rE   get_role_name  s"   


zIntersphinxRole.get_role_namers   r   rj   c                 C  sH   t t| jj dddd z| j|}||jv W S  ty#   Y dS w )Nz.is_existent_roler)   r   r   F)r   r   r<   rh   r   r   r	   )r   rs   r   r   rD   rD   rE   r     s   z IntersphinxRole.is_existent_roler   tuple[str, str]c                 C  sv   t t| jj dddd | j|d }|r7||d }|dus$J |d|| j| j| j	| j
| j| jS g g fS )	z<Invoke the role described by a ``(domain, role name)`` pair.z.invoke_roler)   r   r   r   r3   Nr2   )r   r   r<   rh   r   r   r6   r   r   r   r   r   r   )r   r   r   r   rD   rD   rE   invoke_role  s"   
zIntersphinxRole.invoke_roleN)r   rK   r%   r   )r%   r   )r9   rK   r%   r   )r9   rK   r%   r   )r   rK   r   r   r%   r   )r   rI   r%   rK   )r9   rK   r%   r   )rs   rK   r   rK   r%   rj   )r   r   r%   r   )r   r   r   recompile_re_inv_refr   r   r   r   r   r   r   r   r   rD   rD   rD   rE   r   Y  s    



`


	


r   c                   @  s$   e Zd ZdZejd Zd
ddZd	S )IntersphinxRoleResolverzpending_xref node resolver for intersphinx role.

    This resolves pending_xref nodes generated by :intersphinx:***: role.
    r3   kwargsr   r%   r   c                 K  s   | j tD ][}d|vrqttj|d  }|d }|d ur0t| j|s'J t	| j|||}nt
| jd||}|d u r\|d }td|d ||d f }tj||d	|d
 || q|| qd S )NrY   r   rG   Fr0   z-external %s:%s reference target not found: %sr   rv   ref)r^   r\   r]   )documentfindallr   r   r   r   deepcopyr   rh   r   r   r   r
   rc   replace_self)r   r   r#   r$   r    rB   r   r   rD   rD   rE   r   8  s0   

zIntersphinxRoleResolver.runN)r   r   r%   r   )r   r   r   r   r   default_priorityr   rD   rD   rD   rE   r   0  s    
r   r   source	list[str]r   c                 C  s   t  }|  dS )zEnable IntersphinxDispatcher.

    .. note:: The installed dispatcher will be uninstalled on disabling sphinx_domain
              automatically.
    N)r   enable)r   r   r   
dispatcherrD   rD   rE   install_dispatcherT  s   r   )r   r   r    r!   r"   r   r#   r   r$   r   r%   r&   )r    r!   rG   r   r   r   rH   rI   rJ   rK   r#   r   r$   r   r%   rL   )rh   r   r    r!   rG   r   ri   rj   r   r   rH   rI   r#   r   r$   r   r%   rL   )rh   r   r    r!   rG   r   ri   rj   r#   r   r$   r   r%   rL   )rh   r   r    r   r%   rj   )
rh   r   r    r   r#   r   r$   r   r%   rL   )
rh   r   ri   rj   r#   r   r$   r   r%   rL   )rh   r   r#   r   r$   r   r%   rL   )
r   r   rh   r   r#   r   r$   r   r%   rL   )r   r   r   rK   r   r   r%   r   )?r   
__future__r   r5   r   typingr   r   docutilsr   docutils.utilsr   sphinx.addnodesr   sphinx.deprecationr   sphinx.errorsr	   sphinx.ext.intersphinx._sharedr
   r   sphinx.localer   r   !sphinx.transforms.post_transformsr   sphinx.util.docutilsr   r   collections.abcr   typesr   r   docutils.nodesr   r   r   r   sphinx.applicationr   sphinx.domainsr   sphinx.environmentr   r   sphinx.util.typingr   r   r   rF   rg   r   r   r   r   r   r   r   r   r   r   r   rD   rD   rD   rE   <module>   sN    

$
@
1
<



 X$