B
    \i^                 @   s  d Z ddlmZ ddlZddl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 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' e%(e)Z*ddiZ+G dd de,Z-dd Z.dd Z/dS )z
    sphinx.registry
    ~~~~~~~~~~~~~~~

    Sphinx component registry.

    :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    )print_functionN)isclass)
MethodType)	Directive)iter_entry_points)	iteritems
itervalues)RemovedInSphinx30Warning)ObjType)GenericObjectTarget)ExtensionErrorSphinxErrorVersionRequirementError)	Extension)__)Parser)XRefRole)logging)directive_helperzsphinxjp.themecorez1.2c               @   sV  e Zd Zdd ZdNddZdd Zdd	 ZdOd
dZdd Zdd Z	dd Z
dPddZdQddZdRddZddddg dfddZdSddZdTddZd d! Zd"d# Zd$d% Zd&d' ZdUd(d)Zd*d+ ZdVd,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z!dBdC Z"dDdE Z#dWdFdGZ$dHdI Z%dJdK Z&dLdM Z'dS )XSphinxComponentRegistryc             C   s   i | _ i | _i | _g | _i | _i | _i | _i | _i | _i | _	i | _
i | _g | _g | _g | _i | _i | _i | _i | _i | _g | _d S )N)autodoc_attrgettrsbuildersdocumenters	css_filesdomainsdomain_directivesdomain_indicesdomain_object_typesdomain_rolesenumerable_nodeshtml_inline_math_renderershtml_block_math_renderersjs_fileslatex_packagespost_transformssource_parserssource_inputssource_suffixtranslatorstranslation_handlers
transforms)self r-   .lib/python3.7/site-packages/sphinx/registry.py__init__:   s*    z SphinxComponentRegistry.__init__Fc             C   sf   t d| t|ds&ttd| |j| jkrV|sVttd|j| j|j jf || j|j< d S )Nz[app] adding builder: %rnamez(Builder class %s has no "name" attributez(Builder %r already exists (in module %s))loggerdebughasattrr   r   r0   r   
__module__)r,   builderoverrider-   r-   r.   add_builder   s    
z#SphinxComponentRegistry.add_builderc             C   sd   |d krd S || j kr`td|}yt|}W n$ tk
rP   ttd| Y nX | ||j d S )Nzsphinx.buildersz?Builder name %s not registered or available through entry point)r   r   nextStopIterationr   r   load_extensionZmodule_name)r,   appr0   Zentry_pointsZentry_pointr-   r-   r.   preload_builder   s    

z'SphinxComponentRegistry.preload_builderc             C   s(   || j krttd| | j | |S )NzBuilder name %s not registered)r   r   r   )r,   r;   r0   r-   r-   r.   create_builder   s    
z&SphinxComponentRegistry.create_builderc             C   s>   t d| |j| jkr.|s.ttd|j || j|j< d S )Nz[app] adding domain: %rzdomain %s already registered)r1   r2   r0   r   r   r   )r,   domainr6   r-   r-   r.   
add_domain   s    z"SphinxComponentRegistry.add_domainc             C   s
   || j kS )N)r   )r,   r>   r-   r-   r.   
has_domain   s    z"SphinxComponentRegistry.has_domainc             c   s   xt | jD ]}||}|j| j|ji  |j| j|ji  |j	
| j|jg  x,t| j|ji D ]\}}||| qvW |V  qW d S )N)r   r   
directivesupdater   getr0   rolesr   indicesextendr   r   r   add_object_type)r,   envZDomainClassr>   r0   objtyper-   r-   r.   create_domains   s    z&SphinxComponentRegistry.create_domainsc             C   s"   t jdtdd | j|dd d S )Nz\registry.override_domain() is deprecated. Use app.add_domain(domain, override=True) instead.   )
stacklevelT)r6   )warningswarnr	   r?   )r,   r>   r-   r-   r.   override_domain   s    
z'SphinxComponentRegistry.override_domainNc       	   	   K   s   t d||||||f || jkr2ttd| | j|i }||kr`|s`ttd||f t|rrt|t	st
|||f|||< n|||< d S )Nz$[app] adding directive to domain: %rzdomain %s not yet registeredz3The %r directive is already registered to domain %s)r1   r2   r   r   r   r   
setdefaultr   
issubclassr   r   )	r,   r>   r0   objZhas_contentZargument_specr6   Zoption_specrA   r-   r-   r.   add_directive_to_domain   s    
z/SphinxComponentRegistry.add_directive_to_domainc             C   sf   t d|||f || jkr,ttd| | j|i }||krZ|sZttd||f |||< d S )Nz[app] adding role to domain: %rzdomain %s not yet registeredz.The %r role is already registered to domain %s)r1   r2   r   r   r   r   rP   )r,   r>   r0   Zroler6   rD   r-   r-   r.   add_role_to_domain   s    
z*SphinxComponentRegistry.add_role_to_domainc             C   sh   t d||f || jkr*ttd| | j|g }||krZ|sZttd|j|f || d S )Nz [app] adding index to domain: %rzdomain %s not yet registeredz/The %r index is already registered to domain %s)	r1   r2   r   r   r   r   rP   r0   append)r,   r>   indexr6   rE   r-   r-   r.   add_index_to_domain   s    
z+SphinxComponentRegistry.add_index_to_domain c	          
   C   s   t d|||||||f t|ttf|t||d}	| d||	 | d|t|d | j	
di }
||
kr|sttd| t|p|||
|< d S )Nz[app] adding object type: %r)indextemplate
parse_nodedoc_field_typesstd)innernodeclassz(The %r object_type is already registered)r1   r2   typer   objectstaticmethodrS   rT   r   r   rP   r   r   r
   )r,   directivenamerolenamerY   rZ   ref_nodeclassobjnamer[   r6   	directiveobject_typesr-   r-   r.   rG      s    
z'SphinxComponentRegistry.add_object_typec       	      C   s   t d|||||f t|ttfd|i}| d|| | d|t|d | j	di }||krv|svt
td| t|p~||||< d S )Nz[app] adding crossref type: %rrY   r\   )r]   z*The %r crossref_type is already registered)r1   r2   r^   r   r_   rS   rT   r   r   rP   r   r   r
   )	r,   ra   rb   rY   rc   rd   r6   re   rf   r-   r-   r.   add_crossref_type   s    
z)SphinxComponentRegistry.add_crossref_typec             C   s<   t d|| || jkr.|s.ttd| n
|| j|< d S )Nz"[app] adding source_suffix: %r, %rz&source_suffix %r is already registered)r1   r2   r(   r   r   )r,   suffixfiletyper6   r-   r-   r.   add_source_suffix  s    z)SphinxComponentRegistry.add_source_suffixc             O   s   t d| t|dkr&d }|d }n tjdtdd |d }|d }|rZ| j||dd t|jdkr~tjd	|j tdd x>|jD ]4}|| j	kr|
d
sttd| q|| j	|< qW |r|| j	|< d S )Nz%[app] adding search source_parser: %r   r   z^app.add_source_parser() does not support suffix argument. Use app.add_source_suffix() instead.   )rL   T)r6   zOOld source_parser has been detected. Please fill Parser.supported attribute: %sr6   z*source_parser for %r is already registered)r1   r2   lenrM   rN   r	   rj   	supported__name__r&   rC   r   r   )r,   argskwargsrh   parserri   r-   r-   r.   add_source_parser  s*    



z)SphinxComponentRegistry.add_source_parserc             C   s4   y
| j | S  tk
r.   ttd| Y nX d S )Nz#Source parser for %s not registered)r&   KeyErrorr   r   )r,   ri   r-   r-   r.   get_source_parser@  s    
z)SphinxComponentRegistry.get_source_parserc             C   s   | j S )N)r&   )r,   r-   r-   r.   get_source_parsersG  s    z*SphinxComponentRegistry.get_source_parsersc             C   s(   |  |}| }t|tr$|| |S )N)ru   
isinstanceSphinxParserZset_application)r,   r;   filenameZparser_classrr   r-   r-   r.   create_source_parserK  s
    


z,SphinxComponentRegistry.create_source_parserc             C   s<   x6|j D ],}|| jkr*|s*ttd| || j|< qW d S )Nz)source_input for %r is already registered)rn   r'   r   r   )r,   Zinput_classr6   ri   r-   r-   r.   add_source_inputS  s
    z(SphinxComponentRegistry.add_source_inputc             C   sT   y
| j | S  tk
rN   y
| j d S  tk
rH   ttd| Y nX Y nX d S )N*z"source_input for %s not registered)r'   rt   r   r   )r,   ri   r-   r-   r.   get_source_input[  s    

z(SphinxComponentRegistry.get_source_inputc             C   s:   t d|  || jkr,|s,ttd| || j|< d S )Nz.[app] Change of translator for the %s builder.z Translator for %r already exists)r1   r2   r)   r   r   )r,   r0   
translatorr6   r-   r-   r.   add_translatorf  s    z&SphinxComponentRegistry.add_translatorc          	   K   sx   t d|| xdt|D ]X\}}| j|i }y|\}}||f||j< W q tk
rn   ttd| |Y qX qW d S )Nz)[app] adding translation_handlers: %r, %rzEkwargs for add_node() must be a (visit, depart) function tuple: %r=%r)	r1   r2   r   r*   rP   ro   
ValueErrorr   r   )r,   noderq   Zbuilder_namehandlersr*   visitdepartr-   r-   r.   add_translation_handlersm  s    z0SphinxComponentRegistry.add_translation_handlersc             C   s   | j |j|jS )N)r)   rC   r0   Zdefault_translator_class)r,   r5   r-   r-   r.   get_translator_classy  s    
z,SphinxComponentRegistry.get_translator_classc       	      G   s   |  |}|std|j || }| j|jd }|d krL| j|ji }xHt|D ]<\}\}}t|d| t|| |rVt|d| t|| qVW |S )Nztranslator not found for %sZvisit_Zdepart_)	r   AssertionErrorr0   r*   rC   formatr   setattrr   )	r,   r5   rp   Ztranslator_classr~   r   r0   r   r   r-   r-   r.   create_translator~  s    
z)SphinxComponentRegistry.create_translatorc             C   s   t d| | j| d S )Nz[app] adding transform: %r)r1   r2   r+   rU   )r,   	transformr-   r-   r.   add_transform  s    z%SphinxComponentRegistry.add_transformc             C   s   | j S )N)r+   )r,   r-   r-   r.   get_transforms  s    z&SphinxComponentRegistry.get_transformsc             C   s   t d| | j| d S )Nz[app] adding post transform: %r)r1   r2   r%   rU   )r,   r   r-   r-   r.   add_post_transform  s    z*SphinxComponentRegistry.add_post_transformc             C   s   | j S )N)r%   )r,   r-   r-   r.   get_post_transforms  s    z+SphinxComponentRegistry.get_post_transformsc             C   s   || j |< d S )N)r   )r,   rI   Z
documenterr-   r-   r.   add_documenter  s    z&SphinxComponentRegistry.add_documenterc             C   s   || j |< d S )N)r   )r,   typ
attrgetterr-   r-   r.   add_autodoc_attrgetter  s    z.SphinxComponentRegistry.add_autodoc_attrgetterc             K   s   | j ||f d S )N)r   rU   )r,   ry   
attributesr-   r-   r.   add_css_files  s    z%SphinxComponentRegistry.add_css_filesc             K   s"   t d|| | j||f d S )Nz[app] adding js_file: %r, %r)r1   r2   r#   rU   )r,   ry   r   r-   r-   r.   add_js_file  s    z#SphinxComponentRegistry.add_js_filec             C   s    t d| | j||f d S )Nz[app] adding latex package: %r)r1   r2   r$   rU   )r,   r0   Zoptionsr-   r-   r.   add_latex_package  s    z)SphinxComponentRegistry.add_latex_packagec             C   s@   t d||| || jkr.|s.ttd| ||f| j|< d S )Nz*[app] adding enumerable node: (%r, %r, %r)z%enumerable_node %r already registered)r1   r2   r    r   r   )r,   r   ZfigtypeZtitle_getterr6   r-   r-   r.   add_enumerable_node  s    z+SphinxComponentRegistry.add_enumerable_nodec             C   sB   t d||| || jkr*ttd| || j|< || j|< d S )Nz+[app] adding html_math_renderer: %s, %r, %rz%math renderer %s is already registred)r1   r2   r!   r   r   r"   )r,   r0   Zinline_renderersZblock_renderersr-   r-   r.   add_html_math_renderer  s    


z.SphinxComponentRegistry.add_html_math_rendererc          
   C   sV  ||j krdS |tkr0ttd|t|  dS |j| yt|dddg}W nJ tk
r } z,t	tdt
   ttd| |W dd}~X Y nX t|dsttd| i }nHy||}W n8 tk
r } zttd||f W dd}~X Y nX |dkri }n t|ts4ttd| i }t||f||j |< |j  dS )	zLoad a Sphinx extension.Nz\the extension %r was already merged with Sphinx since version %s; this extension is ignored.setupzOriginal exception:
zCould not import extension %szMextension %r has no setup() function; is it really a Sphinx extension module?zpThe %s extension used by this project needs at least Sphinx v%s; it therefore cannot be built with this version.zuextension %r returned an unsupported object from its setup() function; it should return None or a metadata dictionary)
extensionsEXTENSION_BLACKLISTr1   Zwarningr   Z_setting_up_extensionrU   
__import__ImportErrorverbose	traceback
format_excr   r3   r   r   rw   dictr   pop)r,   r;   Zextnamemoderrmetadatar-   r-   r.   r:     s<    

$



z&SphinxComponentRegistry.load_extensionc             C   s,   ddl m} dd |j D }||d< |S )Nr   )ENV_VERSIONc             S   s&   i | ]}|j d r|j d  |jqS )Zenv_version)r   rC   r0   ).0Zextr-   r-   r.   
<dictcomp>  s    z:SphinxComponentRegistry.get_envversion.<locals>.<dictcomp>Zsphinx)Zsphinx.environmentr   r   values)r,   r;   r   Z
envversionr-   r-   r.   get_envversion  s    z&SphinxComponentRegistry.get_envversion)F)F)NNF)F)F)rX   NrX   F)F)F)F)NF)(ro   r4   __qualname__r/   r7   r<   r=   r?   r@   rJ   rO   rS   rT   rW   rG   rg   rj   rs   ru   rv   rz   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r   r-   r-   r-   r.   r   9   sR   F


 


 

%



.r   c             C   s`   xNt | jjD ]>\}}|| jjkr0|| jj|< q| jj| dkr|| jj|< qW | jj| j_dS )zDMerge source_suffix which specified by user and added by extensions.N)r   registryr(   config)r;   r   rh   ri   r-   r-   r.   merge_source_suffix   s    r   c             C   s   |  dt ddddS )Nzconfig-initedZbuiltinT)versionZparallel_read_safeZparallel_write_safe)Zconnectr   )r;   r-   r-   r.   r     s    r   )0__doc__Z
__future__r   r   rM   inspectr   typesr   Zdocutils.parsers.rstr   Zpkg_resourcesr   Zsixr   r   Zsphinx.deprecationr	   Zsphinx.domainsr
   Zsphinx.domains.stdr   r   Zsphinx.errorsr   r   r   Zsphinx.extensionr   Zsphinx.localer   Zsphinx.parsersr   rx   Zsphinx.rolesr   Zsphinx.utilr   Zsphinx.util.docutilsr   Z	getLoggerro   r1   r   r_   r   r   r   r-   r-   r-   r.   <module>
   s4   
   J