3
g7                 @   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W n ek
r   d	ZY nX d
Zdd Zdd Zd"ddZddddddZdd Zd#ddZerejjjjde xej D ]\ZZ eee  qW edZ!edZ"dd Z#d d! Z$dS )$zBMisc. utility functions/classes for admin documentation generator.    N)HeaderParseError)HeaderParser)cleandoc)reverse)_lazy_re_compile)	mark_safeFTc             C   s"   | j }t| d| jj}|d | S )N__qualname__.)
__module__getattr	__class____name__)Z	view_funcmod_nameZ	view_name r   \/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/contrib/admindocs/utils.pyget_view_name   s    r   c             C   s   | sddi fS t | } tjd| }|d }t|dkr@d}i }nzt }y|j|d }W n* tk
r   i }dj|dd }Y n8X t|j	 }|rd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      z

Nr   )
r   resplitlenr   parsestrr   joindictitems)Z	docstringpartstitlebodymetadataparserr   r   r   parse_docstring   s&    
r!   c             C   sR   dd|t djdddd}|o&d| }d}tjj||  |d	d
|d}t|d S )z<
    Convert the string from reST to an XHTML fragment.
    T   zdjango-admindocs-docroot/F)Zdoctitle_xformZinitial_header_leveldefault_reference_context	link_baseZraw_enabledZfile_insertion_enabledz<%s>z7
.. default-role:: cmsreference

%s

.. default-role::
Nhtml)source_pathZdestination_pathZwriter_nameZsettings_overridesfragment)r   rstripdocutilscoreZpublish_partsr   )textr$   Zthing_being_parsedZ	overridessourcer   r   r   r   	parse_rst8   s    	
r.   z%s/models/%s/z%s/views/%s/z%s/templates/%s/z%s/filters/#%sz%s/tags/#%s)modelviewtemplatefiltertagc                s$   d fdd	}t jjjj| | d S )Nc                sB   |d kri }t jj||fd |jjj|j f i|}|gg fS )Nrefuri)r*   nodes	referencedocumentsettingsr%   lower)namerawtextr,   linenoinlineroptionscontentnode)urlbaser   r   _rolec   s    z$create_reference_role.<locals>._role)NN)r*   parsersrstrolesregister_canonical_role)ZrolenamerA   rB   r   )rA   r   create_reference_roleb   s    rG   c       	      C   sP   |d kri }|j jj}tjj||fdt| |j jj|j f i|}|gg fS )Nr4   )	r7   r8   r$   r*   r5   r6   ROLESr%   r9   )	r:   r;   r,   r<   r=   r>   r?   contextr@   r   r   r   default_reference_roles   s    
rJ   Zcmsreferencez\(\?P(<\w+>)z\(c             C   s   dd t j| D }g }x|D ]\}}}d	\}}xzt| |d D ]f\}}	|	dkrd|dkrd|d7 }n|	dkr||dkr||d8 }|	}|dkrB|j| ||| d  |f P qBW qW x|D ]\}
}| j|
|} qW | 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 | ]}|j d |jd |d fqS )r   r   )startend).0mr   r   r   
<listcomp>   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_namerK   rL   Z
group_nameunmatched_open_brackets	prev_charidxvalZgroup_patternr   r   r   replace_named_groups   s"    	

r]   c             C   s^  dd t j| D }g }x|D ]}d\}}xvt| |d d D ]^\}}|dkrb|dkrb|d7 }n|dkrz|dkrz|d8 }|}|dkr@|j||d	 | f P q@W qW g }d}	x4|D ],\}}
|	r||	ks|	 r|j||
f |
}	qW |rVg d }}	xD|D ]<\}}
|	r|j| |	|  |j| d| d
  |
}	 qW |j| |	d  dj|S | S d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   )rK   )rM   rN   r   r   r   rO      s    z*replace_unnamed_groups.<locals>.<listcomp>r   NrP   rQ   rR   r      z<var>r   )r   N)unnamed_group_matcherrT   rU   rV   r   )rX   Zunnamed_group_indicesZgroup_indicesrK   rY   rZ   r[   r\   Zgroup_start_end_indicesZprev_endrL   Zfinal_patternr   r   r   replace_unnamed_groups   s:    





r`   )N)NN)%__doc__r   Zemail.errorsr   email.parserr   inspectr   Zdjango.urlsr   Zdjango.utils.regex_helperr   Zdjango.utils.safestringr   Zdocutils.corer*   Zdocutils.nodesZdocutils.parsers.rst.rolesImportErrorZdocutils_is_availabler   r!   r.   rH   rG   rJ   rC   rD   rE   rF   r   r:   rA   rS   r_   r]   r`   r   r   r   r   <module>   s@   

"
&