U
    \ShDd                     @  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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  ddl!m"Z" ddl#m$Z$m%Z%m&Z& ddl'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z. erddl/m0Z0 e%1e2Z3dZ4edej5dZ6dddddddddd Z7dd!d"d#d$Z8G d%d& d&e"Z9G d'd( d(Z:G d)d* d*e"Z;G d+d, d,e"Z<G d-d. d.e"Z=G d/d0 d0e"Z>dd1d2d3d4Z?dS )5z:Docutils transforms used by Sphinx when reading documents.    )annotationsN)path)DOTALLmatch)indent)TYPE_CHECKINGAnySequenceTypeVar)nodes)StringInput)addnodes)Config)make_glossary_termsplit_term_classifiers)ConfigError)__)init)SphinxTransform)get_filetypeloggingsplit_index_msg)docname_to_domain)IMAGE_TYPE_NODESLITERAL_TYPE_NODESNodeMatcherextract_messagestraverse_translatable_index)Sphinx)ZrefexplicitN)boundr   strintr   r   nodes.Element)appsourcesource_pathsource_lineconfigsettingsreturnc              
   C  s   z|j }d|_ ddlm} | }||  t|j|}	| j| |	}
|jt	|| d| dd|
|d}t
t |d W  5 Q R  W S Q R X |W S ||_ X dS )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_prologZ	sphinx.ior+   setupr   Zsource_suffixregistryZcreate_source_parserreadr   
contextlibsuppress
IndexError)r$   r%   r&   r'   r(   r)   r.   r+   readerfiletyper-   doc r8   I/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/transforms/i18n.pypublish_msgstr/   s&    
r:   ztuple[str, bool])r%   r*   c                 C  s*   t d| t}|r|ddfS | dfS d S )Nz(.*)(?<!\\)#\s*noqa\s*$   TF)r   r   group)r%   mr8   r8   r9   
parse_noqaS   s    r>   c                   @  s$   e Zd ZdZdZdddddZdS )	PreserveTranslatableMessageszD
    Preserve original translatable messages before translation
    
   r   Nonekwargsr*   c                 K  s    | j tjD ]}|  qd S N)documentfindallr   translatableZpreserve_original_messages)selfrC   noder8   r8   r9   applya   s    z"PreserveTranslatableMessages.applyN__name__
__module____qualname____doc__Zdefault_priorityrJ   r8   r8   r8   r9   r?   [   s   r?   c                   @  s   e Zd ZdZddddddddZd	d	d
ddddZddddZddddZddddZddddZ	ddddZ
ddddZddddZdS )_NodeUpdaterzAContains logic for updating one node with the translated content.r#   znodes.documentboolrA   )rI   patchrE   noqar*   c                 C  s   || _ || _|| _|| _d S rD   )rI   rR   rE   rS   )rH   rI   rR   rE   rS   r8   r8   r9   __init__i   s    z_NodeUpdater.__init__zSequence[nodes.Element]r!   )old_refsnew_refswarning_msgr*   c                 C  sR   | j sNt|t|krNdd |D }dd |D }tj|||| jddd dS )zLWarn about mismatches between references in original and translated content.c                 S  s   g | ]
}|j qS r8   	rawsource.0refr8   r8   r9   
<listcomp>w   s     z3_NodeUpdater.compare_references.<locals>.<listcomp>c                 S  s   g | ]
}|j qS r8   rX   rZ   r8   r8   r9   r]   x   s     Zi18nZinconsistent_references)locationtypesubtypeN)rS   lenloggerwarningformatrI   )rH   rU   rV   rW   Zold_ref_rawsourcesZnew_ref_rawsourcesr8   r8   r9   compare_referencesq   s      z_NodeUpdater.compare_references)r*   c           
      C  s   d}t | jtjrt | jjtjr| jj}t| j }t| j }||kr|	dg }|
| | jj|d }| jj|d }|r|s| jj|d  | jj|d  | jj|d  | j| ttj|d}| j|D ]}	||	d< qd}|S )NFnamesrefnamerh   T)
isinstancerI   r   titleparentsectionZfully_normalize_namerR   astext
setdefaultappendrE   ZnameidsgetZ	nametypespopidsZnote_implicit_targetr   targetrF   )
rH   	processedZsection_nodenew_nameZold_namerf   _idexplicitmatcherZ
old_targetr8   r8   r9   update_title_mapping|   s*    
	
z!_NodeUpdater.update_title_mappingc                 C  sF  ddddddd}t tjtd}| j|}| j|}| ||td i }|D ]}|	|
d	g | qX|D ]}|
d	}|
|g }	|	s|j| qz|	d
}
|
d |d< |d D ]}|| jj|< q|d dkr|| jj|
| n|| jj|
| |rz| jj	|g }|||
| | jj	|g }|||
| qzd S )Nzlist[N]r   rA   )lstoldnewr*   c                 S  s&   || kr|| |  |< n
| | d S rD   )indexro   )rz   r{   r|   r8   r8   r9   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}rh   r   rr   r   r;   )r   r   footnote_referencer   rI   rF   rR   re   r   rn   rp   ro   rk   removerq   rE   rr   Zautofootnote_refsZsymbol_footnote_refsfootnote_refsrefnames)rH   r~   Zis_autofootnote_refold_foot_refsnew_foot_refsZold_foot_namerefsrnewfrh   refsoldfidr   r   r8   r8   r9   update_autofootnote_references   s<    



z+_NodeUpdater.update_autofootnote_referencesc                 C  s   t tjtd}| j|}| j|}| ||td dd |D }dd |D }|| }|D ]4}| j	
|d s|r|d|d< n | j	| qjd S )Nrg   zMinconsistent references in translated message. original: {0}, translated: {1}c                 S  s   g | ]}|d  qS rg   r8   r[   r   r8   r8   r9   r]      s     z;_NodeUpdater.update_refnamed_references.<locals>.<listcomp>c                 S  s   g | ]}|d  qS rg   r8   r   r8   r8   r9   r]      s     rh   r   )r   r   	referencer   rI   rF   rR   re   r   rE   Zhas_namerq   Znote_refname)rH   Zis_refnamed_refrU   rV   Zold_ref_namesZnew_ref_namesZorphansZnewrr8   r8   r9   update_refnamed_references   s    z'_NodeUpdater.update_refnamed_referencesc                 C  s   t tjtd}| j|}| j|}i }| ||td |D ]}|	|d g 
|d  qD|D ](}|d }||rh|| d|d< qhd S )Nrg   r   rh   rr   r   )r   r   r   r   rI   rF   rR   re   r   rn   ro   rp   rq   )rH   Zis_refnamed_footnote_refr   r   refname_ids_mapr   r   rh   r8   r8   r9   #update_refnamed_footnote_references  s"    
z0_NodeUpdater.update_refnamed_footnote_referencesc                 C  s   t tjtd}| j|}| j|}| ||td i }|D ]}|	|d g 
|d  qD|D ]&}|d }||rh||  |d< qhd S )Nrg   zVinconsistent citation references in translated message. original: {0}, translated: {1}rh   rr   )r   r   Zcitation_referencer   rI   rF   rR   re   r   rn   ro   rp   rq   )rH   Zis_citation_refZold_cite_refsZnew_cite_refsr   ZoldcZnewcrh   r8   r8   r9   update_citation_references  s    
z'_NodeUpdater.update_citation_referencesc           
      C  s   | j tj}| jtj}| ||td i }ddddd}|D ]}||}|rJ|j||< qJ|D ]6}||}||i 	 D ]\}}	|t
kr|	||< qqjd S )NzRinconsistent term references in translated message. original: {0}, translated: {1}zaddnodes.pending_xrefztuple[str, str, str] | None)rI   r*   c                 S  s6   | d | d f}|dkrd S | d | d | d fS d S )NZ	refdomainZreftype)ZstdtermZ	reftargetr8   )rI   caser8   r8   r9   get_ref_key2  s    z6_NodeUpdater.update_pending_xrefs.<locals>.get_ref_key)rI   rF   r   Zpending_xrefrR   re   r   
attributesrp   items EXCLUDED_PENDING_XREF_ATTRIBUTES)
rH   Z	old_xrefsZ	new_xrefsZxref_reftarget_mapr   r{   keyr|   kvr8   r8   r9   update_pending_xrefs&  s     
z!_NodeUpdater.update_pending_xrefsc                 C  s&   | j jD ]}| j|_q| j j| j_d S rD   )rR   childrenrI   rk   )rH   childr8   r8   r9   update_leavesH  s    
z_NodeUpdater.update_leavesN)rL   rM   rN   rO   rT   re   ry   r   r   r   r   r   r   r8   r8   r8   r9   rP   f   s   @-"rP   c                   @  s$   e Zd ZdZdZdddddZdS )	LocalezC
    Replace translatable nodes with their translated doctree.
       r   rA   rB   c              
     sv   j j j d  }}d}t jj jj} fdd jjD }t| jj	|\}}|s\d S t
 j D ]H\}	}
||
}t|	tst|\}}|r||
ks| sd|	d< qf| dr|d7 }t|	trd	t|d
 }t j|||	j j|}t|tjsqft|	| j dd}| }t|	tjr|	d D ]Z}t|}t j|d pRd||	j j|}t j||d pvd||	j| j |_d}q4|r|  d|	d< qfd|	d< qft
 j D ]\}	}
|	ddrؐq||
}d}t|	tst|\}}|r||
krd|	d< qt|	tj r8|	!|
| qt|	tj"rZ||	d< d|	d< qt|	tj#r|	$d|
kr||	d< q| dr|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||s6qt|	| j |}|)  |*  |+  |,  |-  |  t|	tr|	. |	_/t|	tj#r|	$d|
kr|d |	d< d|	d< qd|	d< qd jj0krrt1 j D ]\}	}g }|D ]f\}}}}}t2||}g }|D ]$}||}|s.|}|3| q|d4|||d f}|3| q||	d< ||	d< qd S )Nr%    c                   s   g | ]}t  jj|qS r8   )r   joinenvsrcdir)r[   	directoryrH   r8   r9   r]   [  s   z Locale.apply.<locals>.<listcomp>F
translatedz::z

   dummy literalz::

z   )rS   rr   r   r;   TcontentZalt
=   urir}   ;Zraw_entriesentries)5rE   r)   r   r   Zdocnamer(   Zgettext_compactZlocale_dirsinit_localelanguager   gettextri   r   r>   stripendswithr   r:   r$   liner   Z	paragraphrP   ry   r   r   r   rR   r   rn   r   rG   Zapply_translated_messagemetaimagerp   rj   ra   Z	next_noder   r   r   r   r   r   rm   rY   Zgettext_additional_targetsr   r   ro   r   )rH   rC   r)   r%   Zmsgstr
textdomaindirscatalogZhas_catalogrI   msg_rR   Zupdaterrt   rv   partsrS   Z
unexpectedr   Znew_entriesZ
entry_typevalueZ	target_idmainZ_category_keyZ	msg_partsZmsgstr_partspartZ	new_entryr8   r   r9   rJ   T  s    




             



  


zLocale.applyNrK   r8   r8   r8   r9   r   N  s   r   c                   @  s$   e Zd ZdZdZdddddZdS )	TranslationProgressTotaliserzD
    Calculate the number of translated and untranslated nodes.
       r   rA   rB   c                 K  sj   ddl m} t| jj|rd S d }}| jttdD ]}|d7 }|d r8|d7 }q8||d| jd< d S )Nr   MessageCatalogBuilderr   r;   r   )totalr   Ztranslation_progress)	sphinx.builders.gettextr   ri   r$   builderrE   rF   r   r   )rH   rC   r   r   r   rI   r8   r8   r9   rJ     s    
z"TranslationProgressTotaliser.applyNrK   r8   r8   r8   r9   r   
  s   r   c                   @  s$   e Zd ZdZdZdddddZdS )	AddTranslationClasseszX
    Add ``translated`` or ``untranslated`` classes to indicate translation status.
    i  r   rA   rB   c                 K  s   ddl m} t| jj|rd S | jjs*d S | jjdkr@d }}n4| jjdkrVd}d}n| jjdkrld}d}ntd| j	t
tdD ]:}|d r|r|d	g d q|r|d	g d qd S )
Nr   r   Tr   FZuntranslatedzPtranslation_progress_classes must be True, False, "translated" or "untranslated"r   classes)r   r   ri   r$   r   r(   Ztranslation_progress_classesr   rE   rF   r   r   rn   ro   )rH   rC   r   Zadd_translatedZadd_untranslatedrI   r8   r8   r9   rJ   '  s(    
zAddTranslationClasses.applyNrK   r8   r8   r8   r9   r   !  s   r   c                   @  s$   e Zd ZdZdZdddddZdS )	RemoveTranslatableInlinezC
    Remove inline nodes used for translation as placeholders.
    i  r   rA   rB   c                 K  sb   ddl m} t| jj|rd S ttjtd}t	| j
|D ] }|j| | j|j7  _q<d S )Nr   r   )rG   )r   r   ri   r$   r   r   r   inliner   listrE   rF   rk   r   r   )rH   rC   r   rx   r   r8   r8   r9   rJ   J  s    zRemoveTranslatableInline.applyNrK   r8   r8   r8   r9   r   D  s   r   zdict[str, Any])r$   r*   c                 C  s>   |  t |  t |  t |  t |  t ddddS )NbuiltinT)versionZparallel_read_safeZparallel_write_safe)Zadd_transformr?   r   r   r   r   )r$   r8   r8   r9   r/   U  s    




r/   )@rO   
__future__r   r2   osr   rer   r   textwrapr   typingr   r   r	   r
   Zdocutilsr   Zdocutils.ior   Zsphinxr   Zsphinx.configr   Zsphinx.domains.stdr   r   Zsphinx.errorsr   Zsphinx.localer   r   r   Zsphinx.transformsr   Zsphinx.utilr   r   r   Zsphinx.util.i18nr   Zsphinx.util.nodesr   r   r   r   r   Zsphinx.applicationr   	getLoggerrL   rb   r   Noder   r:   r>   r?   rP   r   r   r   r   r/   r8   r8   r8   r9   <module>   sD   
$ i =#