B
    £0H[Ô  ã               @   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 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„ 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)Úreverse)Úforce_bytes)Ú	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   úbC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\contrib\admindocs\utils.pyÚget_view_name   s    r   c                sd   | r|   ¡ sdS |  ¡  ¡ }tdd„ |D ƒƒ‰ |d  ¡ g‡ fdd„|dd… D ƒ }d	 |¡  ¡ S )
zœ
    Uniformly trim leading/trailing whitespace from docstrings.

    Based on https://www.python.org/dev/peps/pep-0257/#handling-docstring-indentation
    Ú c             s   s*   | ]"}|  ¡ rt|ƒt|  ¡ ƒ V  qd S )N)ÚlstripÚlen)Ú.0Úliner   r   r   ú	<genexpr>%   s    z!trim_docstring.<locals>.<genexpr>r   c                s   g | ]}|ˆ d …   ¡ ‘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    (r#   c             C   s¶   t | ƒ} t d| ¡}|d }t|ƒdkr2d}i }nztƒ }y| |d ¡}W n* tk
rt   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   r   r   éÿÿÿÿz

N)
r#   ÚreÚsplitr   r   Úparsestrr   r    ÚdictÚitems)r!   ÚpartsÚtitleÚbodyÚmetadataÚparserr   r   r   Úparse_docstring*   s"    r/   c             C   sV   dd|t dƒ d¡dddœ}|r,t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   r   r   ÚdocutilsÚcoreZpublish_partsr   )Útextr2   Zthing_being_parsedZ	overridesÚsourcer*   r   r   r   Ú	parse_rstD   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                sN   |d kri }|d krg }t jj||fdˆ |jjj| ¡ f i|—Ž}|gg fS )NÚrefuri)r7   ÚnodesÚ	referenceÚdocumentÚsettingsr3   Úlower)ÚnameÚrawtextr9   ÚlinenoÚinlinerÚoptionsÚcontentÚnode)Úurlbaser   r   Ú_rolep   s    z$create_reference_role.<locals>._role)NN)r7   ÚparsersÚrstÚrolesÚregister_canonical_role)ZrolenamerN   rO   r   )rN   r   Úcreate_reference_roleo   s    rT   c       	      C   s\   |d kri }|d krg }|j jj}tjj||fdt| |j jj| ¡ f i|—Ž}|gg fS )NrA   )	rD   rE   r2   r7   rB   rC   ÚROLESr3   rF   )	rG   rH   r9   rI   rJ   rK   rL   ÚcontextrM   r   r   r   Údefault_reference_role‚   s    
rW   Zcmsreferencez\(\?P(<\w+>)z\(c             C   sÒ   dd„ t  | ¡D ƒ}g }x–|D ]Ž\}}}d\}}xztt| |d… ƒƒD ]b\}}	|dkrr| | ||| … |f¡ P |	dkrŒ|dkrŒ|d7 }n|	d	kr¤|dkr¤|d8 }|	}qFW qW x|D ]\}
}|  |
|¡} q¶W | S )
zµ
    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>/$
    c             S   s(   g | ] }|  d ¡| d ¡| d¡f‘qS )r   r   )ÚstartÚendÚgroup)r   Úmr   r   r   r   ¦   s   z(replace_named_groups.<locals>.<listcomp>)r   NNr   ú(ú\r   ú))Únamed_group_matcherÚfinditerÚ	enumerateÚlistÚappendÚreplace)ÚpatternZnamed_group_indicesZgroup_pattern_and_namerX   rY   Z
group_nameÚunmatched_open_bracketsÚ	prev_charÚidxÚvalZgroup_patternr   r   r   Úreplace_named_groupsŸ   s"    
rj   c             C   s^  dd„ t  | ¡D ƒ}g }x�|D ]ˆ}d\}}xztt| |d d… ƒƒD ]^\}}|dkrl| ||d | f¡ P |dkr†|dkr†|d7 }n|d	krž|dkrž|d8 }|}qDW qW g }d}	x2|D ]*\}}
|	rÌ||	ksÐ|	sÞ| ||
f¡ |
}	q¸W |�rVg d }}	xB|D ]:\}}
|	�r| | |	|… ¡ | | d|… d
 ¡ |
}	qüW | | |	d… ¡ d |¡S | S dS )z¾
    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>$
    c             S   s   g | ]}|  d ¡‘qS )r   )rX   )r   r[   r   r   r   r   Ê   s    z*replace_unnamed_groups.<locals>.<listcomp>)r   Nr   Nr   r\   r]   r^   z<var>r   )Úunnamed_group_matcherr`   ra   rb   rc   r    )re   Zunnamed_group_indicesZgroup_indicesrX   rf   rg   rh   ri   Zgroup_start_end_indicesZprev_endrY   Zfinal_patternr   r   r   Úreplace_unnamed_groupsÄ   s:    
"


rl   )N)NN)%Ú__doc__r%   Zemail.errorsr   Úemail.parserr   Zdjango.urlsr   Zdjango.utils.encodingr   Zdjango.utils.safestringr   Zdocutils.corer7   Zdocutils.nodesZdocutils.parsers.rst.rolesÚImportErrorZdocutils_is_availabler   r#   r/   r;   rU   rT   rW   rP   rQ   rR   rS   r)   rG   rN   Úcompiler_   rk   rj   rl   r   r   r   r   Ú<module>   s@   

#


%