o
    Ni                     @  s  d 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mZ dd
lmZ ddlmZ erhd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'G dd deZ(G dd deZ)dddZ*dS )zThe index domain.    )annotations)TYPE_CHECKINGAnyClassVar)nodes)
directives)addnodes)Domain)logging)ReferenceRoleSphinxDirective)split_index_msg)process_index_entry)Set)Nodesystem_message)Sphinx)BuildEnvironment)ExtensionMetadata
OptionSpecc                   @  sD   e Zd ZdZdZdZedddZdd
dZdddZ	dddZ
dS )IndexDomainzIndex domain.indexreturn6dict[str, list[tuple[str, str, str, str, str | None]]]c                 C  s   | j di S Nentries)data
setdefault)self r   H/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/domains/index.pyr   $   s   zIndexDomain.entriesdocnamestrNonec                 C  s   | j |d  d S )N)r   pop)r   r!   r   r   r    	clear_doc(   s   zIndexDomain.clear_docdocnamesSet[str]	otherdatadict[str, Any]c                 C  s    |D ]}|d | | j |< qd S r   r   )r   r&   r(   r!   r   r   r    merge_domaindata+   s   zIndexDomain.merge_domaindataenvr   documentr   c                 C  s   | j |jg }t|tjD ]C}z|d D ]\}}}}	}
t|| qW n! tyF } zt	j
t||d |j| W Y d}~qd}~ww |d D ]}|| qKqdS )z7Process a document after it is read by the environment.r   )locationN)r   r   r!   listfindallr   r   r   
ValueErrorloggerwarningr"   parentremoveappend)r   r,   r!   r-   r   node
entry_typevalue
_target_id_main_category_keyexcentryr   r   r    process_doc/   s   zIndexDomain.process_docN)r   r   )r!   r"   r   r#   )r&   r'   r(   r)   r   r#   )r,   r   r!   r"   r-   r   r   r#   )__name__
__module____qualname____doc__namelabelpropertyr   r%   r+   r?   r   r   r   r    r      s    

r   c                   @  s>   e Zd ZU dZdZdZdZdZdej	iZ
ded< dddZdS )IndexDirectivez0
    Directive to add entries to the index.
    F   r   TrD   zClassVar[OptionSpec]option_specr   
list[Node]c                 C  s   | j d d}d| jv r| jd }tjdd|gd}nd| jd }tjdd|gd}| jj	| t
 }g |d	< d
|d< | | |D ]}|d	 t||d d  qG||gS )Nr   
rD    )namesindex-%sr   idsr   FinlinerP   )	argumentssplitoptionsr   targetr,   new_serialnostater-   note_explicit_targetr   r   set_source_infoextendr   )r   rR   
targetname
targetnodetargetid	indexnoder>   r   r   r    runK   s   


zIndexDirective.runN)r   rJ   )r@   rA   rB   rC   has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer   	unchangedrI   __annotations__r_   r   r   r   r    rG   >   s   
 rG   c                   @  s   e Zd ZdddZdS )	IndexRoler   'tuple[list[Node], list[system_message]]c                 C  s   d| j d }| jr| j}t| j|}n'| jdr0| jdd  }d| jdd  |dd fg}n| j}d| j|dd fg}tj|d}t	jdd|gd	}t	
|}| | |||gg fS )
NrN   r   !rH   singlemainrL   r*   rO   )r,   rV   has_explicit_titletitler   rU   
startswithr   r   r   TextrY   )r   	target_idrl   r   r   rU   textr   r   r    r_   `   s   

zIndexRole.runN)r   rg   )r@   rA   rB   r_   r   r   r   r    rf   _   s    rf   appr   r   r   c                 C  s2   |  t | dt | dt  dddddS )Nr   builtinrH   T)versionenv_versionparallel_read_safeparallel_write_safe)
add_domainr   add_directiverG   add_rolerf   )rq   r   r   r    setupv   s   
rz   N)rq   r   r   r   )+rC   
__future__r   typingr   r   r   docutilsr   docutils.parsers.rstr   sphinxr   sphinx.domainsr	   sphinx.utilr
   sphinx.util.docutilsr   r   sphinx.util.index_entriesr   sphinx.util.nodesr   collections.abcr   docutils.nodesr   r   sphinx.applicationr   sphinx.environmentr   sphinx.util.typingr   r   	getLoggerr@   r2   r   rG   rf   rz   r   r   r   r    <module>   s,    
 !