B
    CVvg7  ã               @   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 de¡ xe ¡ D ]\ZZ eee ƒ qìW 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   úB/tmp/pip-install-o3oxmrkh/Django/django/contrib/admindocs/utils.pyÚget_view_name   s    r   c             C   sÄ   | sddi fS t | ƒ} t d| ¡}|d }t|ƒdkr@d}i }nztƒ }y| |d ¡}W n* tk
r‚   i }d |dd… ¡}Y n8X t| 	¡ ƒ}|r¨d |dd… ¡}nd |dd… ¡}|||fS )zN
    Parse out the parts of a docstring.  Return (title, body, metadata).
    Ú z\n{2,}r   é   éÿÿÿÿz

N)
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ƒ 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 | |¡ d S )Nc                sB   |d kri }t jj||fdˆ |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| ¡ 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  | ¡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| | ||| d … |f¡ P qBW qW x|D ]\}
}|  |
|¡} 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 | ]}|  d ¡| d ¡|d f‘qS )r   r   )ÚstartÚend)Ú.0Úmr   r   r   ú
<listcomp>—   s   z(replace_named_groups.<locals>.<listcomp>)r   NNú(ú\r   ú)r   )Ú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   sZ  dd„ t  | ¡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@| ||d
 | f¡ P q@W qW g }d}	x2|D ]*\}}
|	rÈ||	ksÌ|	sÚ| ||
f¡ |
}	q´W |�rRg d }}	xB|D ]:\}}
|	�r| | |	|… ¡ | | d|… d ¡ |
}	qøW | | |	d… ¡ d |¡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 | ]}|  d ¡‘qS )r   )rK   )rM   rN   r   r   r   rO   ¼   s    z*replace_unnamed_groups.<locals>.<listcomp>)r   Nr   NrP   rQ   rR   r   é   z<var>r   )Ú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@   

"
&