
v^                 @   s  d  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	 y( d d l
 Z d d l Z d d l Z Wn e k
 r d Z Yn Xd Z d	 d
   Z d d   Z d d   Z d d d  Z d d d d d d d d d d i Z d d   Z d d d d  Z e rYe j j j j d e  x' e j   D] \ Z Z e e e  q<We j d   Z e j d!  Z  d" d#   Z! d$ d%   Z" d S)&zBMisc. utility functions/classes for admin documentation generator.    N)HeaderParseError)HeaderParser)reverse)	mark_safeFTc             C   s-   |  j  } t |  d |  j j  } | d | S)N__qualname__.)
__module__getattr	__class____name__)Z	view_funcZmod_nameZ	view_name r   @/tmp/pip-build-8lau8j11/django/django/contrib/admindocs/utils.pyget_view_name   s    	r   c                s   |  s |  j    r d S|  j   j   } t d d   | D    | d j   g   f d d   | d d  D } d	 j |  j    S)
z
    Uniformly trim leading/trailing whitespace from docstrings.

    Based on https://www.python.org/dev/peps/pep-0257/#handling-docstring-indentation
     c             s   s7   |  ]- } | j    r t |  t | j     Vq d  S)N)lstriplen).0liner   r   r   	<genexpr>$   s    z!trim_docstring.<locals>.<genexpr>r   c                s&   g  |  ] } |   d   j     q S)N)rstrip)r   r   )indentr   r   
<listcomp>%   s   	 z"trim_docstring.<locals>.<listcomp>   N
)strip
expandtabs
splitlinesminr   join)	docstringlinesZtrimmedr   )r   r   trim_docstring   s    4r!   c             C   s   t  |   }  t j d |   } | d } t |  d k rI d } i  } n t   } y | j | d  } Wn1 t k
 r i  } d j | d d   } YnN Xt | j	    } | r d j | d d   } n d j | d d   } | | | f S)	zN
    Parse out the parts of a docstring.  Return (title, body, metadata).
    z\n{2,}r   r   r   z

Nr"   )
r!   resplitr   r   parsestrr   r   dictitems)r   partstitlebodymetadataparserr   r   r   parse_docstring)   s"    
		r-   c             C   s   d d d d d | d t  d  j d  d	 d
 d d
 i } | oF d | } d } t j j | |  d | d d d d d | } t | d  S)z<
    Convert the string from reST to an XHTML fragment.
    Zdoctitle_xformTZinitial_header_level   default_reference_context	link_basezdjango-admindocs-docroot/Zraw_enabledFZfile_insertion_enabledz<%s>z7
.. default-role:: cmsreference

%s

.. default-role::
source_pathZdestination_pathNZwriter_namehtmlZsettings_overridesfragment)r   r   docutilscoreZpublish_partsr   )textr/   Zthing_being_parsedZ	overridessourcer(   r   r   r   	parse_rstC   s    		
r9   modelz%s/models/%s/viewz%s/views/%s/templatez%s/templates/%s/filterz%s/filters/#%stagz%s/tags/#%sc                s5   d  d    f d d  } t  j j j j |  |  d  S)Nc                sV   | d  k r i  } t  j j | | d   | j j j | j   f | } | g g  f S)Nrefuri)r5   nodes	referencedocumentsettingsr0   lower)namerawtextr7   linenoinlineroptionscontentnode)urlbaser   r   _rolen   s    		z$create_reference_role.<locals>._role)r5   parsersrstrolesregister_canonical_role)ZrolenamerL   rM   r   )rL   r   create_reference_rolem   s    rR   c       	      C   si   | d  k r i  } | j  j j } t j j | | d t | | j  j j | j   f | } | g g  f S)Nr?   )	rB   rC   r/   r5   r@   rA   ROLESr0   rD   )	rE   rF   r7   rG   rH   rI   rJ   contextrK   r   r   r   default_reference_role~   s    		rU   Zcmsreferencez\(\?P(<\w+>)z\(c             C   s  d d   t  j |   D } g  } x | D] \ } } } d	 \ } } x t |  | d   D] \ } }	 |	 d k r | d k r | d 7} n" |	 d k r | d k r | d 8} |	 } | d k r[ | j |  | | | d  | f  Pq[ Wq) Wx& | D] \ }
 } |  j |
 |  }  q W|  S)
a  
    Find named groups in `pattern` and replace them with the group name. E.g.,
    1. ^(?P<a>\w+)/b/(\w+)$ ==> ^<a>/b/(\w+)$
    2. ^(?P<a>\w+)/b/(?P<c>\w+)/$ ==> ^<a>/b/<c>/$
    3. ^(?P<a>\w+)/b/(\w+) ==> ^<a>/b/(\w+)
    4. ^(?P<a>\w+)/b/(?P<c>\w+) ==> ^<a>/b/<c>
    c             S   s:   g  |  ]0 } | j  d   | j d   | j d  f  q S)r   r   )startendgroup)r   mr   r   r   r      s   	z(replace_named_groups.<locals>.<listcomp>r   N(\)r   )r   N)named_group_matcherfinditer	enumerateappendreplace)patternZnamed_group_indicesZgroup_pattern_and_namerV   rW   Z
group_nameunmatched_open_brackets	prev_charidxvalZgroup_patternr   r   r   replace_named_groups   s"    		#
%	rg   c             C   s  d d   t  j |   D } g  } x | D] } d \ } } x t |  | d d   D] \ } } | d k r | d k r | d 7} n" | d k r | d k r | d 8} | } | d k rV | j | | d	 | f  PqV Wq) Wg  } d }	 xF | D]> \ } }
 |	 r| |	 k s|	 r*| j | |
 f  |
 }	 q W| rg  d } }	 xR | D]J \ } }
 |	 rw| j |  |	 |   | j |  d |  d
  |
 }	 qNW| j |  |	 d   d j |  S|  Sd S)a)  
    Find unnamed groups in `pattern` and replace them with '<var>'. E.g.,
    1. ^(?P<a>\w+)/b/(\w+)$ ==> ^(?P<a>\w+)/b/<var>$
    2. ^(?P<a>\w+)/b/((x|y)\w+)$ ==> ^(?P<a>\w+)/b/<var>$
    3. ^(?P<a>\w+)/b/(\w+) ==> ^(?P<a>\w+)/b/<var>
    4. ^(?P<a>\w+)/b/((x|y)\w+) ==> ^(?P<a>\w+)/b/<var>
    c             S   s   g  |  ] } | j  d    q S)r   )rV   )r   rY   r   r   r   r      s   	 z*replace_unnamed_groups.<locals>.<listcomp>r   NrZ   r[   r\   r      z<var>r   )r   N)unnamed_group_matcherr^   r_   r`   r   )rb   Zunnamed_group_indicesZgroup_indicesrV   rc   rd   re   rf   Zgroup_start_end_indicesZprev_endrW   Zfinal_patternr   r   r   replace_unnamed_groups   s:    '
	

rj   )#__doc__r#   Zemail.errorsr   email.parserr   Zdjango.urlsr   Zdjango.utils.safestringr   Zdocutils.corer5   Zdocutils.nodesZdocutils.parsers.rst.rolesImportErrorZdocutils_is_availabler   r!   r-   r9   rS   rR   rU   rN   rO   rP   rQ   r'   rE   rL   compiler]   ri   rg   rj   r   r   r   r   <module>   s>   "&