o
    Nii                     @  s  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	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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& ddl'm(Z(m)Z)m*Z*m+Z+m,Z, erddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 e"5e6Z7dZ8edej9dZ:d<d(d)Z;d=d+d,Z<G d-d. d.eZ=G d/d0 d0Z>G d1d2 d2eZ?G d3d4 d4eZ@G d5d6 d6eZAG d7d8 d8eZBd>d:d;ZCdS )?z:Docutils transforms used by Sphinx when reading documents.    )annotationsN)path)DOTALLmatch)indent)TYPE_CHECKINGAnyTypeVar)nodes)StringInput)addnodes)make_glossary_termsplit_term_classifiers)ConfigError)__)init)SphinxTransform)get_filetypelogging)docname_to_domain)split_index_msg)IMAGE_TYPE_NODESLITERAL_TYPE_NODESNodeMatcherextract_messagestraverse_translatable_index)Sequence)Sphinx)Config)ExtensionMetadata)refexplicitN)boundappr   sourcestrsource_pathsource_lineintconfigr   settingsr   returnnodes.Elementc                 C  s   zV|j }d|_ ddlm} | }||  t|j|}	| j| |	}
|jt	|| d| dd|
|d}t
t |d W  d   W ||_ S 1 sLw   Y  |W ||_ S ||_ w )a  Publish msgstr (single line) into docutils document

    :param sphinx.application.Sphinx app: sphinx application
    :param str source: source text
    :param str source_path: source path for warning indication
    :param source_line: source line for warning indication
    :param sphinx.config.Config config: sphinx config
    :param docutils.frontend.Values settings: docutils settings
    :return: document
    :rtype: docutils.nodes.document
    Nr   )SphinxI18nReader:z:<translated>)r$   r&   )r$   parserr*   )
rst_prolog	sphinx.ior-   setupr   source_suffixregistrycreate_source_parserreadr   
contextlibsuppress
IndexError)r#   r$   r&   r'   r)   r*   r0   r-   readerfiletyper/   doc r=   J/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/transforms/i18n.pypublish_msgstr3   s,   
r?   tuple[str, bool]c                 C  s&   t d| t}|r|ddfS | dfS )Nz(.*)(?<!\\)#\s*noqa\s*$   TF)r   r   group)r$   mr=   r=   r>   
parse_noqa_   s   rD   c                   @     e Zd ZdZdZd
ddZd	S )PreserveTranslatableMessageszD
    Preserve original translatable messages before translation
    
   kwargsr   r+   Nonec                 K  s    | j tjD ]}|  qd S N)documentfindallr   translatablepreserve_original_messages)selfrH   noder=   r=   r>   applyn   s   
z"PreserveTranslatableMessages.applyNrH   r   r+   rI   __name__
__module____qualname____doc__default_priorityrQ   r=   r=   r=   r>   rF   g       rF   c                   @  sj   e Zd Z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d&d d!Zd"S )'_NodeUpdaterzAContains logic for updating one node with the translated content.rP   r,   patchrK   nodes.documentnoqaboolr+   rI   c                 C  s   || _ || _|| _|| _d S rJ   )rP   r[   rK   r]   )rO   rP   r[   rK   r]   r=   r=   r>   __init__v   s   
z_NodeUpdater.__init__old_refsSequence[nodes.Element]new_refswarning_msgr%   c                 C  sZ   | j s)t|t|kr+dd |D }dd |D }tj|||| jddd dS dS dS )zLWarn about mismatches between references in original and translated content.c                 S     g | ]}|j qS r=   	rawsource.0refr=   r=   r>   
<listcomp>       z3_NodeUpdater.compare_references.<locals>.<listcomp>c                 S  rd   r=   re   rg   r=   r=   r>   rj      rk   i18ninconsistent_references)locationtypesubtypeN)r]   lenloggerwarningformatrP   )rO   r`   rb   rc   old_ref_rawsourcesnew_ref_rawsourcesr=   r=   r>   compare_references   s   

z_NodeUpdater.compare_referencesc           
      C  s   d}t | jtjr|t | jjtjr|| jj}t| j }t| j }||kr||	dg }|
| | jj|d }| jj|d }|rf|s`| jj|d  | jj|d  | jj|d  | j| ttj|d}|| jD ]}	||	d< qsd}|S )NFnamesrefnamerz   T)
isinstancerP   r
   titleparentsectionfully_normalize_namer[   astext
setdefaultappendrK   nameidsget	nametypespopidsnote_implicit_targetr   targetrL   )
rO   	processedsection_nodenew_nameold_namerx   _idexplicitmatcher
old_targetr=   r=   r>   update_title_mapping   s0   
	
z!_NodeUpdater.update_title_mappingc                 C  s@  ddd	}t tjtd
}t|| j}t|| j}| ||t	d i }|D ]}|
|dg | q)|D ]c}|d}||g }	|	sP|j| q:|	d}
|
d |d< |d D ]}|| jj|< q_|d dkrw|| jj|
| n|| jj|
| |r| jj
|g }|||
| | jj
|g }|||
| q:d S )Nlstlist[N]oldr!   newr+   rI   c                 S  s(   || v r|| |  |< d S | | d S rJ   )indexr   )r   r   r   r=   r=   r>   list_replace_or_append   s   zK_NodeUpdater.update_autofootnote_references.<locals>.list_replace_or_append)autoVinconsistent footnote references in translated message. original: {0}, translated: {1}rz   r   r   r   rA   )r   r   r   r!   r   r!   r+   rI   )r   r
   footnote_referencer   listrL   rP   r[   rw   r   r   r   r   r}   remover   rK   r   autofootnote_refssymbol_footnote_refsfootnote_refsrefnames)rO   r   is_autofootnote_refold_foot_refsnew_foot_refsold_foot_namerefsrnewfrz   refsoldfidr   r   r=   r=   r>   update_autofootnote_references   sD   


z+_NodeUpdater.update_autofootnote_referencesc                 C  s   t tjtd}t|| j}t|| j}| ||t	d dd |D }dd |D }g h |h | }|D ]}| j
|d sO|rN|d|d< n	 | j
| q:d S )Nry   zMinconsistent references in translated message. original: {0}, translated: {1}c                 S     g | ]}|d  qS ry   r=   rh   r   r=   r=   r>   rj         z;_NodeUpdater.update_refnamed_references.<locals>.<listcomp>c                 S  r   ry   r=   r   r=   r=   r>   rj     r   rz   r   )r   r
   	referencer   r   rL   rP   r[   rw   r   rK   has_namer   note_refname)rO   is_refnamed_refr`   rb   old_ref_namesnew_ref_namesorphansnewrr=   r=   r>   update_refnamed_references  s(   z'_NodeUpdater.update_refnamed_referencesc                 C  s   t tjtd}t|| j}t|| j}i }| ||t	d |D ]}|
|d g |d  q$|D ]}|d }||rJ|| d|d< q6d S )Nry   r   rz   r   r   )r   r
   r   r   r   rL   rP   r[   rw   r   r   r   r   r   )rO   is_refnamed_footnote_refr   r   refname_ids_mapr   r   rz   r=   r=   r>   #update_refnamed_footnote_references'  s&   
z0_NodeUpdater.update_refnamed_footnote_referencesc                 C  s   t tjtd}t|| j}t|| j}| ||t	d i }|D ]}|
|d g |d  q$|D ]}|d }||rI||  |d< q6d S )Nry   zVinconsistent citation references in translated message. original: {0}, translated: {1}rz   r   )r   r
   citation_referencer   r   rL   rP   r[   rw   r   r   r   r   r   )rO   is_citation_refold_cite_refsnew_cite_refsr   oldcnewcrz   r=   r=   r>   update_citation_references<  s&   
z'_NodeUpdater.update_citation_referencesc           
      C  s   g | j tj}g | jtj}| ||td i }ddd}|D ]}||}|r1|j||< q$|D ]}||}||i 	 D ]\}}	|t
vrN|	||< qBq4d S )	NzRinconsistent term references in translated message. original: {0}, translated: {1}rP   addnodes.pending_xrefr+   tuple[str, str, str] | Nonec                 S  s2   | d | d f}|dkrd S | d | d | d fS )N	refdomainreftype)stdterm	reftargetr=   )rP   caser=   r=   r>   get_ref_keyb  s   z6_NodeUpdater.update_pending_xrefs.<locals>.get_ref_key)rP   r   r+   r   )rP   rL   r   pending_xrefr[   rw   r   
attributesr   items EXCLUDED_PENDING_XREF_ATTRIBUTES)
rO   	old_xrefs	new_xrefsxref_reftarget_mapr   r   keyr   kvr=   r=   r>   update_pending_xrefsQ  s0   	

z!_NodeUpdater.update_pending_xrefsc                 C  s&   | j jD ]}| j|_q| j j| j_d S rJ   )r[   childrenrP   r}   )rO   childr=   r=   r>   update_leavesy  s   
z_NodeUpdater.update_leavesN)
rP   r,   r[   r,   rK   r\   r]   r^   r+   rI   )r`   ra   rb   ra   rc   r%   r+   rI   )r+   r^   )r+   rI   )rT   rU   rV   rW   r_   rw   r   r   r   r   r   r   r   r=   r=   r=   r>   rZ   s   s    



C
0
 

(rZ   c                   @  rE   )LocalezC
    Replace translatable nodes with their translated doctree.
       rH   r   r+   rI   c           "   
     s   j j j d }}d}t jj jj} fdd jjD }t| jj	|\}}|s.d S t
|dd g}	|j }d urL|	t
|dd  |j }d us<i }
td t|	D ]}|
|O }
qUt j D ]\}}|
|d}t|tsvt|\}}| dkrd|d< qa||krd|d< qa| d	r|d
7 }t|trdt|d }t j|||j j|}t|tjsqat|| j dd}| }t|tjr|d D ]&}t|\}}t j|pd||j j|}t  j||||j| j |_!d}q|r|"  d|d< qad|d< qat j D ]\}}|#ddrq|
|d}d}t|ts)t|\}}|r1||kr7d|d< qt|t$j%rF|&|| qt|tj'rW||d< d|d< qt|tj(rl|d|krl||d< q| d	rx|d
7 }t|trdt|d }t|tj)r|d dt*| d  }t j|||j j|}t|tj)r|+ }tjtj)f}|t7 }|t,7 }t||sŐqt|| j |}|-  |.  |/  |0  |1  |"  t|tr|2 |_3t|tj(r|d|kr|d |d< d|d< qd|d< qd jj4v rdt5 j D ]H\}}g }|D ]4\}}}}}t6||}g }|D ]} |
| d}|sB| }|| q5|d7|||d f}!||! q%||d< ||d< qd S d S )Nr$    c                   s   g | ]
}t  jj|qS r=   )r   joinenvsrcdir)rh   	directoryrO   r=   r>   rj     s    z Locale.apply.<locals>.<listcomp>_catalogF
translatedTz::z

   dummy literalz::

z   )r]   r   contentalt
=   urir   ;raw_entriesentries)8rK   r*   r   r   docnamer)   gettext_compactlocale_dirsinit_localelanguagegetattr	_fallbackr   filterreversedr   r   r{   r   rD   stripendswithr   r?   r#   liner
   	paragraphrZ   r   r   r   r   r[   r   r   r   rM   apply_translated_messagemetaimager|   rq   	next_noder   r   r   r   r   r   r   rf   gettext_additional_targetsr   r   r   )"rO   rH   r*   r$   msgstr
textdomaindirscataloghas_catalog
cataloguesmerged	cataloguerP   msg_r[   updaterr   r   r   first_classifierr]   
unexpectedr   new_entries
entry_typevalue	target_idmain_category_key	msg_partsmsgstr_partspart	new_entryr=   r   r>   rQ     s$  




	

	

zLocale.applyNrR   rS   r=   r=   r=   r>   r     rY   r   c                   @  rE   )TranslationProgressTotaliserzD
    Calculate the number of translated and untranslated nodes.
       rH   r   r+   rI   c                 K  sn   ddl m} t| jj|rd S d }}ttjtd	| j
D ]}|d7 }|d r,|d7 }q||d| j
d< d S )Nr   MessageCatalogBuilderr   rA   r   )totalr   translation_progress)sphinx.builders.gettextr  r{   r#   builderr   r
   Elementr   rL   rK   )rO   rH   r  r  r   rP   r=   r=   r>   rQ   m  s   z"TranslationProgressTotaliser.applyNrR   rS   r=   r=   r=   r>   r  f  rY   r  c                   @  rE   )AddTranslationClasseszX
    Add ``translated`` or ``untranslated`` classes to indicate translation status.
    i  rH   r   r+   rI   c                 K  s   ddl m} t| jj|rd S | jjsd S | jjdu r d }}n| jjdkr+d}d}n| jjdkr6d}d}nd}t|tt	j
td| jD ]}|d rY|rX|d	g d qG|rd|d	g d qGd S )
Nr   r  Tr   FuntranslatedzPtranslation_progress_classes must be True, False, "translated" or "untranslated"r  classes)r  r  r{   r#   r  r)   translation_progress_classesr   r   r
   r  r   rL   rK   r   r   )rO   rH   r  add_translatedadd_untranslatedr  rP   r=   r=   r>   rQ     s2   
zAddTranslationClasses.applyNrR   rS   r=   r=   r=   r>   r    rY   r  c                   @  rE   )RemoveTranslatableInlinezC
    Remove inline nodes used for translation as placeholders.
    i  rH   r   r+   rI   c                 K  s^   ddl m} t| jj|rd S ttjtd}|	| j
D ]}|j| | j|j7  _qd S )Nr   r  )rM   )r  r  r{   r#   r  r   r
   inliner   rL   rK   r}   r   r   )rO   rH   r  r   r&  r=   r=   r>   rQ     s   zRemoveTranslatableInline.applyNrR   rS   r=   r=   r=   r>   r%    rY   r%  r   c                 C  s>   |  t |  t |  t |  t |  t ddddS )NbuiltinT)versionparallel_read_safeparallel_write_safe)add_transformrF   r   r  r  r%  )r#   r=   r=   r>   r2     s   




r2   )r#   r   r$   r%   r&   r%   r'   r(   r)   r   r*   r   r+   r,   )r$   r%   r+   r@   )r#   r   r+   r   )DrW   
__future__r   r7   osr   rer   r   textwrapr   typingr   r   r	   docutilsr
   docutils.ior   sphinxr   sphinx.domains.stdr   r   sphinx.errorsr   sphinx.localer   r   r   sphinx.transformsr   sphinx.utilr   r   sphinx.util.i18nr   sphinx.util.index_entriesr   sphinx.util.nodesr   r   r   r   r   collections.abcr   sphinx.applicationr   sphinx.configr   sphinx.util.typingr   	getLoggerrT   rr   r   Noder!   r?   rD   rF   rZ   r   r  r  r%  r2   r=   r=   r=   r>   <module>   sN    


,   h(