B
    \i=                 @   st   d Z ddlmZ ddlmZ ddlmZ dd ZG dd deZ	G d	d
 d
e	Z
G dd de
ZG dd deZdS )a8  
    sphinx.util.docfields
    ~~~~~~~~~~~~~~~~~~~~~

    "Doc fields" are reST field lists in object descriptions that will
    be domain-specifically transformed to a more appealing presentation.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    )absolute_import)nodes)addnodesc             C   sZ   t | dkrdS t | dkrBx$| dd D ]}t|tjs*dS q*W t| d tjrVdS dS )zCTrue if the node only contains one paragraph (and system messages).r   F   NT)len
isinstancer   Zsystem_message	paragraph)nodeZsubnode r
   4lib/python3.7/site-packages/sphinx/util/docfields.py_is_single_paragraph   s    r   c               @   sX   e Zd ZdZdZdZdddZejddfdd	Z	ejddfd
dZ
dd ZdddZdS )Fielda  A doc field that is never grouped.  It can have an argument or not, the
    argument can be linked using a specified *rolename*.  Field should be used
    for doc fields that usually don't occur more than once.

    The body can be linked using a specified *bodyrolename* if the content is
    just a single inline or text node.

    Example::

       :returns: description of the return value
       :rtype: description of the return type
    Fr
   NTc             C   s(   || _ || _|| _|| _|| _|| _d S )N)namenameslabelhas_argrolenamebodyrolename)selfr   r   r   r   r   r   r
   r
   r   __init__7   s    zField.__init__c             C   sP   |s|p|||S t jd|d||d}||p4|||7 }|rL|j| | |S )N F)Z	refdomainZrefexplicitZreftypeZ	reftarget)r   Zpending_xrefZdomainsZprocess_field_xref)r   r   domaintarget	innernodecontnodeenvZrefnoder
   r
   r   	make_xrefA   s    	

zField.make_xrefc             C   s   |  ||||||gS )N)r   )r   r   r   r   r   r   r   r
   r
   r   
make_xrefsS   s    	zField.make_xrefsc             C   s   ||fS )Nr
   )r   fieldargcontentr
   r
   r   
make_entry^   s    zField.make_entryc       	   	   C   s   |\}}t d| j}|rF|t d7 }|| j| j||t j|d t|dkrt|d t jst|d t j	rt|d dkrt|d d t jr| j| j
||d  |d |d}t dt jd| }t d||S )Nr    )r   r   r   )r   r   )r   r   )r   
field_namer   Textextendr   r   r   r   inliner   astext
field_bodyr   field)	r   typesr   itemr   r   r   	fieldname	fieldbodyr
   r
   r   
make_fieldb   s     
zField.make_field)r
   NTNN)N)__name__
__module____qualname____doc__
is_groupedis_typedr   r   literal_emphasisr   r   r    r-   r
   r
   r
   r   r   '   s    
r   c               @   s.   e Zd ZdZdZejZd
ddZddd	Z	dS )GroupedFielda  
    A doc field that is grouped; i.e., all fields of that type will be
    transformed into one field with its body being a bulleted list.  It always
    has an argument.  The argument can be linked using the given *rolename*.
    GroupedField should be used for doc fields that can occur more than once.
    If *can_collapse* is true, this field will revert to a Field if only used
    once.

    Example::

       :raises ErrorClass: description when it is raised
    Tr
   NFc             C   s   t | |||d| || _d S )NT)r   r   can_collapse)r   r   r   r   r   r6   r
   r
   r   r      s    zGroupedField.__init__c          
   C   s   t d| j}|  }x\|D ]T\}}t  }	|	| j| j||tj	|d |	t 
d7 }	|	|7 }	|t d|	7 }qW t|dkr| jrt d|d d }
t d||
S t d|}
t d||
S )Nr   )r   z -- r   r   )r   r"   r   	list_typer   r$   r   r   r   literal_strongr#   	list_itemr   r6   r'   r(   )r   r)   r   itemsr   r+   Zlistnoder   r   parr,   r
   r
   r   r-      s    zGroupedField.make_field)r
   NNF)N)
r.   r/   r0   r1   r2   r   Zbullet_listr7   r   r-   r
   r
   r
   r   r5   z   s    
	r5   c               @   s(   e Zd ZdZdZd
ddZddd	ZdS )
TypedFieldaa  
    A doc field that is grouped and has type information for the arguments.  It
    always has an argument.  The argument can be linked using the given
    *rolename*, the type using the given *typerolename*.

    Two uses are possible: either parameter and type description are given
    separately, using a field from *names* and one from *typenames*,
    respectively, or both are given using a field from *names*, see the example.

    Example::

       :param foo: description of parameter foo
       :type foo:  SomeClass

       -- or --

       :param SomeClass foo: description of parameter foo
    Tr
   NFc             C   s$   t | ||||| || _|| _d S )N)r5   r   	typenamestyperolename)r   r   r   r=   r   r   r>   r6   r
   r
   r   r      s    zTypedField.__init__c                s    fdd}t dj}t|dkrJjrJ|d \}}|||}	n0 }	x&|D ]\}}|	t d|||7 }	qXW t d|	}
t d||
S )Nc          	      s   t  }|jj | tjd | kr|t d7 }| }t	|dkrt
|d t jrddd |D }|jj |tjd n||7 }|t d7 }|t d	7 }||7 }|S )
N)r   z (r   r   r   c             s   s   | ]}|  V  qd S )N)r&   ).0nr
   r
   r   	<genexpr>   s    z=TypedField.make_field.<locals>.handle_item.<locals>.<genexpr>)z -- )r   r   r$   r   r   r   r8   r#   popr   r   joinr>   r4   )r   r   r;   	fieldtypetypename)r   r   r   r)   r
   r   handle_item   s    
z*TypedField.make_field.<locals>.handle_itemr   r   r   )	r   r"   r   r   r6   r7   r9   r'   r(   )r   r)   r   r:   r   rG   r+   r   r   Zbodynoder,   r
   )r   r   r   r)   r   r-      s    zTypedField.make_field)r
   r
   NNNF)N)r.   r/   r0   r1   r3   r   r-   r
   r
   r
   r   r<      s
    

r<   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )DocFieldTransformerz
    Transforms field lists in "doc field" syntax into better-looking
    equivalents, using the field type definitions given on a domain.
    c             C   s0   || _ d|jjkr$| |jj|j_|j| _d S )N_doc_field_type_map)	directive	__class____dict__preprocess_fieldtypesZdoc_field_typesrI   typemap)r   rJ   r
   r
   r   r      s    zDocFieldTransformer.__init__c             C   sT   i }xJ|D ]B}x|j D ]}|df||< qW |jr
x|jD ]}|df||< q8W q
W |S )NFT)r   r3   r=   )r   r)   rN   rE   r   r
   r
   r   rM      s    
z)DocFieldTransformer.preprocess_fieldtypesc             C   s(   x"|D ]}t |tjr| | qW dS )z,Transform all field list children of a node.N)r   r   
field_list	transform)r   r	   Zchildr
   r
   r   transform_all  s    
z!DocFieldTransformer.transform_allc          	   C   s8  | j }g }i }i }x|D ]}|\}}y| dd\}	}
W n" tk
rb   | d }	}
Y nX ||	d\}}t|r|jd j}n|j}|dks|jt|
kr|	dd 	 |	dd  }|
r|d|
 7 }t
||d< || |r|r|rt|dkrt|d t
jr|d  }|j|j| jj||d d}t|rf|jd   |jd | q|  |t
 7 }|d | q|j}|rdd	 |D }|r|||i |
< q|jr
y|
dd\}}W n tk
r   Y nX t
|g||i |< |}
t
j|jd
d}|jj|_|jj|_|jj|_||7 }|jr||kr`|||  }nt|||< |g g}|| | |
|g}|d | q| |
|g}|||g qW t
! }xd|D ]\}t|t
j"r||7 }n>|\}	}||	ji }| jj#jj$j%}||	j&|| jj||d7 }qW |'| dS )z%Transform a single field list *node*.Nr   r   )NNr   r!   )r   c             S   s(   g | ] }t |tjs t |tjr|qS r
   )r   r   ZInliner#   )r?   r@   r
   r
   r   
<listcomp>M  s    z1DocFieldTransformer.transform.<locals>.<listcomp>T)Ztranslatable)r   )(rN   r&   split
ValueErrorgetr   Zchildrenr   boolupperr   r#   appendr   r   r   r>   rJ   r   clearr$   r   r   
setdefaultr3   r%   Z	rawsourceparentZdocumentsourceliner2   r    rO   r(   stateZsettingsr   r-   Zreplace_self)r   r	   rN   entriesZgroupindicesr)   r(   r+   r,   rE   r   ZtypedescZis_typefieldr   Znew_fieldnamer   ZxrefsrF   ZargtypeargnameZtranslatable_contentgroupentryZnew_listZ
fieldtypesr   r
   r
   r   rP     s    








zDocFieldTransformer.transformN)r.   r/   r0   r1   r   rM   rQ   rP   r
   r
   r
   r   rH      s
   rH   N)r1   Z
__future__r   Zdocutilsr   Zsphinxr   r   objectr   r5   r<   rH   r
   r
   r
   r   <module>   s   	S/E