ó
­â0_c           @   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	 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³ e Z n Xe Z d	 „  Z d
 „  Z d „  Z d d „ Z i d d 6d d 6d d 6d d 6d d 6Z d „  Z d d d „ Z e rne j j j  j! d e ƒ x* e j" ƒ  D] \ Z# Z$ e e# e$ ƒ qNWn  e j% d ƒ Z& e j% d ƒ Z' d „  Z( d „  Z) d S(   sB   Misc. utility functions/classes for admin documentation generator.iÿÿÿÿN(   t   HeaderParseError(   t   HeaderParser(   t   reverse(   t   six(   t   force_bytes(   t	   mark_safec         C   sQ   |  j  } t j r- t |  d |  j j ƒ } n t |  d |  j j ƒ } | d | S(   Nt   __qualname__t   __name__t   .(   t
   __module__R   t   PY3t   getattrt	   __class__R   (   t	   view_funct   mod_namet	   view_name(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pyt   get_view_name   s
    		c         C   s‹   |  s |  j  ƒ  r d S|  j ƒ  j ƒ  } t d „  | Dƒ ƒ } | d j ƒ  g g  | d D] } | | j ƒ  ^ q[ } d j | ƒ j  ƒ  S(   sœ   
    Uniformly trim leading/trailing whitespace from docstrings.

    Based on https://www.python.org/dev/peps/pep-0257/#handling-docstring-indentation
    t    c         s   s7   |  ]- } | j  ƒ  r t | ƒ t | j  ƒ  ƒ Vq d  S(   N(   t   lstript   len(   t   .0t   line(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pys	   <genexpr>*   s    i    i   s   
(   t   stript
   expandtabst
   splitlinest   minR   t   rstript   join(   t	   docstringt   linest   indentR   t   trimmed(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pyt   trim_docstring    s    8c         C   sç   t  |  ƒ }  t j d |  ƒ } | d } t | ƒ d k rI d } i  } n‘ t ƒ  } y | j | d ƒ } Wn* t k
 r• i  } d j | d ƒ } nE Xt | j	 ƒ  ƒ } | rÇ d j | d d !ƒ } n d j | d ƒ } | | | f S(   sN   
    Parse out the parts of a docstring.  Return (title, body, metadata).
    s   \n{2,}i    i   R   iÿÿÿÿs   

(
   R    t   ret   splitR   R   t   parsestrR    R   t   dictt   items(   R   t   partst   titlet   bodyt   metadatat   parser(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pyt   parse_docstring/   s"    
		c      
   C   sš   i t  d 6d d 6| d 6t d ƒ j d ƒ d 6t d 6t d	 6} | rX t d
 | ƒ } n  d } t j j | |  d | d d d d d | ƒ} t	 | d ƒ S(   s<   
    Convert the string from reST to an XHTML fragment.
    t   doctitle_xformi   t   initial_header_levelt   default_reference_contexts   django-admindocs-docroott   /t	   link_baset   raw_enabledt   file_insertion_enableds   <%s>s7   
.. default-role:: cmsreference

%s

.. default-role::
t   source_patht   destination_patht   writer_namet   htmlt   settings_overridest   fragmentN(
   t   TrueR   R   t   FalseR   t   docutilst   coret   publish_partst   NoneR   (   t   textR.   t   thing_being_parsedt	   overridest   sourceR&   (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pyt	   parse_rstI   s    
		
s   %s/models/%s/t   models   %s/views/%s/t   views   %s/templates/%s/t   templates   %s/filters/#%st   filters   %s/tags/#%st   tagc            s2   d  d  ‡  f d † } t j j j j |  | ƒ d  S(   Nc            sn   | d  k r i  } n  | d  k r* g  } n  t j j | | d ˆ  | j j j | j ƒ  f | } | g g  f S(   Nt   refuri(   R>   R;   t   nodest	   referencet   documentt   settingsR0   t   lower(   t   namet   rawtextR?   t   linenot   inlinert   optionst   contentt   node(   t   urlbase(    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pyt   _roleu   s    				(   R>   R;   t   parserst   rstt   rolest   register_canonical_role(   t   rolenameRV   RW   (    (   RV   s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pyt   create_reference_rolet   s    c   	      C   s   | d  k r i  } n  | d  k r* g  } n  | j j j } t j j | | d t | | j j j | j	 ƒ  f | } | g g  f S(   NRI   (
   R>   RL   RM   R.   R;   RJ   RK   t   ROLESR0   RN   (	   RO   RP   R?   RQ   RR   RS   RT   t   contextRU   (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pyt   default_reference_role‡   s    				t   cmsreferences   \(\?P(<\w+>)s   \(c         C   sD  g  t  j |  ƒ D]0 } | j d ƒ | j d ƒ | j d ƒ f ^ q } g  } xÈ | D]À \ } } } d \ } } x¢ t t |  | ƒ ƒ D]Š \ }	 }
 | d k r¿ | j |  | | |	 !| f ƒ Pn  |
 d k rä | d k rä | d 7} n% |
 d k r	| d k r	| d 8} n  |
 } q… WqS Wx& | D] \ } } |  j	 | | ƒ }  qW|  S(   sµ   
    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>/$
    i    i   t   (s   \t   )N(   i   N(
   t   named_group_matchert   finditert   startt   endt   groupR>   t	   enumeratet   listt   appendt   replace(   t   patternt   mt   named_group_indicest   group_pattern_and_nameRf   Rg   t
   group_namet   unmatched_open_bracketst	   prev_chart   idxt   valt   group_pattern(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pyt   replace_named_groups¤   s"    C#c         C   sÔ  g  t  j |  ƒ D] } | j d ƒ ^ q } g  } xÀ | D]¸ } d	 \ } } x£ t t |  | d ƒ ƒ D]‡ \ } } | d k rœ | j | | d | f ƒ Pn  | d k rÁ | d k rÁ | d 7} n% | d k ræ | d k ræ | d 8} n  | } qe Wq8 Wg  }	 d }
 xI | D]A \ } } |
 r%| |
 k s,|
 rB|	 j | | f ƒ n  | }
 qW|	 rÌg  d } }
 xL |	 D]D \ } } |
 r| j |  |
 | !ƒ n  | j |  |  d ƒ | }
 qfW| j |  |
 ƒ d j | ƒ S|  Sd S(
   s¾   
    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>$
    i    i   Rb   s   \Rc   s   <var>R   N(   i   N(   t   unnamed_group_matcherRe   Rf   R>   Ri   Rj   Rk   R   (   Rm   Rn   t   unnamed_group_indicest   group_indicesRf   Rr   Rs   Rt   Ru   t   group_start_end_indicest   prev_endRg   t   final_pattern(    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pyt   replace_unnamed_groupsÉ   s:    +'

(*   t   __doc__R!   t   email.errorsR    t   email.parserR   t   django.urlsR   t   django.utilsR   t   django.utils.encodingR   t   django.utils.safestringR   t   docutils.coreR;   t   docutils.nodest   docutils.parsers.rst.rolest   ImportErrorR:   t   docutils_is_availableR9   R   R    R+   R>   RC   R^   R]   R`   RX   RY   RZ   R[   R%   RO   RV   t   compileRd   Rx   Rw   R~   (    (    (    s@   /tmp/pip-unpacked-wheel-BAJOf3/django/contrib/admindocs/utils.pyt   <module>   sD   
	
		"
		%