U
    Sh;                     @  s   d Z ddlmZ ddlZddlmZ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 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# ddl$m%Z% e&e'Z(G dd deZ)dS )zA post-transform for overriding the behaviour of sphinx reference resolution.

This is applied to MyST type references only, such as ``[text](target)``,
and allows for nested syntax
    )annotationsN)Anycast)nodes)Elementdocument)normalizeLink)addnodes)pending_xref)StandardDomain)NoUri)InventoryAdapter)ReferencesResolver)docname_joinlogging)clean_astextmake_refnode)	inventory)findall)MystWarningsc                   @  s   e Zd ZdZdZddddddd	Zdd
dddZddddZddddddddZd$ddddddZ	ddddddZ
ddddd d!d"d#ZdS )%MystReferenceResolverztResolves cross-references on doctrees.

    Overrides default sphinx implementation, to allow for nested syntax
    	   z
None | strstrr   r   )targetmsgsubtypekwargsc                   sv    r | j jr d f| j jkr dS  rJ| j jrJt fdd| j jD rJdS tj|d|j d fd|jd| dS )z5Log a warning, with a myst type and specific subtype.mystNc                 3  s*   | ]"\}}t |d o t | V  qdS )r   N)re	fullmatch).0Zignore_typeZignore_targetr    S/root/rtd-docs/venv/lib/python3.8/site-packages/myst_parser/sphinx_ext/myst_refs.py	<genexpr>9   s   z4MystReferenceResolver.log_warning.<locals>.<genexpr>z [myst.])typer   )configZnitpick_ignoreZnitpick_ignore_regexanyLOGGERwarningvalue)selfr   r   r   r   r"   r!   r#   log_warning'   s0    
z!MystReferenceResolver.log_warningNone)r   returnc              	   K  s~  |  t | jtjD ]b}|d dkr(q|d dkr@| | qd }ttj|d  }|d }|	d| j
j}| j
jj}z| ||||}W n tk
r   |}Y nX |d kr| ||||}|d kr| j|d|tj|d	 |st }t||d
< ||d   t|jdkrTt|d tjrT|d jsT|d t|| n|jsn|t|| || qd S )NZreftyper   Z	refdomaindocr   	reftargetrefdocz)'myst' cross-reference target not found: locationZrefid   )r   r   r	   r
   resolve_myst_ref_docr   r   ZTextElementdeepcopygetenvdocnamer'   Zmyst_ref_domainsresolve_myst_ref_anyr   _resolve_myst_ref_intersphinxr-   r   XREF_MISSING	referencer   appendlenchildren
isinstanceinlinereplace_selfliteral)r,   r   nodenewnodecontnoder   r2   Zsearch_domainsr"   r"   r#   runJ   sb    

   
   zMystReferenceResolver.runr
   )rF   c                 C  sn  | d| jj}|d }|d }|| jjkr\| j|d|tj|d ||d   dS d}d}d	d
g}|r| jj	|  di }||kr| j|d|d|tj|d |}n|| \}	}}d	dg}nt
| jj| }|d r| }
tj|
d|d}||d j ntj|||d}| jjs,tzt| jj||||}W n tk
r^   |}Y nX || dS )zResolve a reference, from a markdown link, to another document,
        optionally with a target id within that document.
        r2   r1   ZreftargetidzUnknown source document r3   r   N stdzstd-docZ
myst_slugszlocal id not found in doc : zstd-refrefexplicitclasses)r8   r9   r:   all_docsr-   r   r=   rD   r7   metadatar   titlesastextr   rC   extendrA   appbuilderAssertionErrorr   r   )r,   rF   Zfrom_docnameZref_docnameZref_idZtargetidZimplicit_textZinner_classesZslug_to_section_caption	innernoderef_noder"   r"   r#   r6      sb    

      
z*MystReferenceResolver.resolve_myst_ref_docr   zNone | list[str]zElement | None)r2   rF   rH   only_domainsr/   c                   s  |d }g }|  ||}|r*|d|f | ||}|rH|d|f | jjsTt|dksdd|krtt| j	d}|j
D ]l}	|	|f}
|	dkr|	| f}
|
|jkr||j|
 \}}d||	pd }t| jj||||}|||f q|| jj D ]}|jdkr
q|dk	r"|j|kr"qz$||| j|| jj||| W q tk
r   t|d	dd
s| jdd|j d|j dtjdd |jD ]^}|| j|| jj||||}|rt|rt|d tj r||j d| |f qY qX q|s
dS t|dkrXdd  d! fdd|D }| j|d| d| tj"|d |d \}}|#dd }t|dkrt|d tj r|d $dg ||%ddg |d d< |S )a  Resolve reference generated by the "myst" role; ``[text](#reference)``.

        This builds on the sphinx ``any`` role to also resolve:

        - Document references with extensions; ``[text](./doc.md)``
        - Document references with anchors with anchors; ``[text](./doc.md#target)``
        - Nested syntax for explicit text with std:doc and std:ref;
          ``[**nested**](reference)``

        r1   zstd:refzstd:docNrK   termzstd:rJ   
__module__zsphinx.zDomain 'z::z1' has not implemented a `resolve_any_xref` methodT)oncer   :r5   c                 S  s"   | d| }d|  d| dS )Nreftitler`   z:``)r8   rS   )namerF   ra   r"   r"   r#   	stringify  s    z=MystReferenceResolver.resolve_myst_ref_any.<locals>.stringifyz or c                 3  s   | ]\}} ||V  qd S Nr"   )r    rc   rolerd   r"   r#   r$     s     z=MystReferenceResolver.resolve_myst_ref_any.<locals>.<genexpr>z6more than one target found for 'myst' cross-reference z: could be r3   rO   -)&_resolve_ref_nestedr?   _resolve_doc_nestedrU   rV   rW   r   r   r9   
get_domainZobject_typeslowerobjectsZrole_for_objtyper   domainsvaluesrc   rT   Zresolve_any_xrefNotImplementedErrorgetattr
startswithr-   r^   r   ZLEGACY_DOMAINZrolesZresolve_xrefr@   rB   r   r   joinZXREF_AMBIGUOUSsplitr8   replace)r,   r2   rF   rH   r\   r   resultsres	stddomainobjtypekeyr:   labelidZdomain_roler[   domainrf   
candidatesZres_rolerG   Z
res_domainr"   rg   r#   r;      s    

         
      "& 
z*MystReferenceResolver.resolve_myst_ref_anyN)rF   fromdocnamer/   c           	      C  s   t t| jd}|p |d  }|d rb|j|d\}}| }t	|d}|
|d j n |j|d\}}}t	||}|sdS | jjstt| jj||||S )	zThis is the same as ``sphinx.domains.std._resolve_ref_xref``,
        but allows for nested syntax, rather than converting the inner node to raw text.
        rK   r1   rM   )rJ   rJ   rJ   r   )rJ   rJ   rJ   N)r   r   r9   rk   rl   Z
anonlabelsr8   rS   r   rC   rT   rA   labelsrU   rV   rW   r   )	r,   rF   r~   r   rx   r:   r{   sectnamerZ   r"   r"   r#   ri   )  s    z)MystReferenceResolver._resolve_ref_nestedc                 C  s   t |d||d }|| jjkr&dS |d rZ| }tj|ddgd}||d j n"t	| jj
| }tj||dgd}| jjstt| jj||d|S )	zThis is the same as ``sphinx.domains.std._resolve_doc_xref``,
        but allows for nested syntax, rather than converting the inner node to raw text.

        It also allows for extensions on document names.
        r2   r1   NrM   rJ   r0   rN   r   )r   r8   r9   rP   rS   r   rC   rT   rA   r   rR   rU   rV   rW   r   )r,   rF   r~   r:   rY   rZ   r"   r"   r#   rj   E  s    z)MystReferenceResolver._resolve_doc_nestedznodes.Elementzlist[str] | NonezNone | nodes.reference)rF   rH   r   r\   r/   c           
        s8   fddt jt| jj|dD }|s,dS t|dkrd}ddd |d| D }t||krl|d	7 }| j|d
|d| tj	|d |d }t
jddd|jd}	d|kr|d |	d< n|j d|j  |	d< |dr|	| nF|jr|	|j|j|jddgd n|	t
j|j|jddgd |	S )z5Resolve a myst reference to an intersphinx inventory.c                   s"   g | ]} d ks|j  kr|qS re   )r|   r    mr\   r"   r#   
<listcomp>e  s    
zGMystReferenceResolver._resolve_myst_ref_intersphinx.<locals>.<listcomp>)targetsNr5      z, c                 S  s$   g | ]}t |j|j|j|jqS r"   )r   Zfilter_stringinvr|   otyperc   r   r"   r"   r#   r   s  s   z, ...zMultiple matches found for rL   r3   r   rJ   F)ZinternalZrefurira    rM   Zirefr   rN   )r   Zfilter_sphinx_inventoriesr   r9   Znamed_inventoryr@   rs   r-   r   ZIREF_AMBIGUOUSr   r>   locprojectversionstripr8   r?   text	__class__rE   rc   )
r,   rF   rH   r   r\   matchesZshow_numZmatches_strmatchrG   r"   r   r#   r<   ]  sL    



z3MystReferenceResolver._resolve_myst_ref_intersphinx)N)__name__r^   __qualname____doc__Zdefault_priorityr-   rI   r6   r;   ri   rj   r<   r"   r"   r"   r#   r      s   #<8l r   )*r   
__future__r   r   typingr   r   Zdocutilsr   Zdocutils.nodesr   r   Z markdown_it.common.normalize_urlr   Zsphinxr	   Zsphinx.addnodesr
   Zsphinx.domains.stdr   Zsphinx.errorsr   Zsphinx.ext.intersphinxr   Z!sphinx.transforms.post_transformsr   Zsphinx.utilr   r   Zsphinx.util.nodesr   r   Zmyst_parserr   Zmyst_parser._compatr   Zmyst_parser.warnings_r   	getLoggerr   r)   r   r"   r"   r"   r#   <module>   s&   
