a
    xd7                     @   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 zddlZddlZddlZW n ey   d	ZY n0 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 rejjjde e D ]\ZZ eee  qe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   V/var/www/html/Ranjet/env/lib/python3.9/site-packages/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 }nxt }z||d }W n( ty   i }d|dd }Y n80 t|	 }|rd|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)	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 u ri }t jj||fd |jjj| f i|}|gg fS NZ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rolenamerC   rD   r   rB   r   create_reference_roleb   s    rI   c           	      C   sP   |d u ri }|j jj}tjj||fdt| |j jj| f i|}|gg fS r5   )	r8   r9   r%   r+   r6   r7   ROLESr&   r:   )	r;   r<   r-   r=   r>   r?   r@   contextrA   r   r   r   default_reference_roles   s    
	rL   Zcmsreferencez\(\?P(<\w+>)z\(c                 C   s   dd t | D }g }|D ]\}}}d\}}t| |d D ]h\}}	|	dkr`|dkr`|d7 }n|	dkrx|dkrx|d8 }|	}|d	kr>|| ||| d  |f  qq>q|D ]\}
}| |
|} q| 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_namerM   rN   Z
group_nameunmatched_open_brackets	prev_charidxvalZgroup_patternr   r   r   replace_named_groups   s$    
ra   c                 C   sL  dd t | D }g }|D ]}d\}}t| |d d D ]`\}}|dkr^|dkr^|d7 }n|dkrv|dkrv|d8 }|}|d	kr<|||d
 | f  qq<qg }d}	|D ]*\}}
|	r||	ks|	s|||
f |
}	q|rDg d }}	|D ]:\}}
|	r|| |	|  || d| d  |
}	q|| |	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   )rM   rO   r   r   r   rR          z*replace_unnamed_groups.<locals>.<listcomp>rS   r   NrT   rU   rV   r      z<var>r   )unnamed_group_matcherrX   rY   rZ   r   )r\   Zunnamed_group_indicesZgroup_indicesrM   r]   r^   r_   r`   Zgroup_start_end_indicesZprev_endrN   Zfinal_patternr   r   r   replace_unnamed_groups   s:    


re   )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/   rJ   rI   rL   rE   rF   rG   rH   r   r;   rC   rW   rd   ra   re   r   r   r   r   <module>   sB   

"	
&