o
    ^"<f7                     @   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yC   d	ZY nw 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 e D ]	\ZZ eee  qse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__)	view_funcmod_name	view_name r   U/var/www/html/kck/venv/lib/python3.10/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 }n<t }z	||d }W n ty@   i }d|dd }Y nw t|	 }|rSd|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)doctitle_xforminitial_header_leveldefault_reference_context	link_baseraw_enabledfile_insertion_enabledz<%s>z7
.. default-role:: cmsreference

%s

.. default-role::
Nhtml)source_pathdestination_pathwriter_namesettings_overridesfragment)r   rstripdocutilscorepublish_partsr   )textr)   thing_being_parsed	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 Nrefuri)r4   nodes	referencedocumentsettingsr*   lower)namerawtextr7   linenoinlineroptionscontentnodeurlbaser   r   _rolec   s   
	z$create_reference_role.<locals>._roleNN)r4   parsersrstrolesregister_canonical_role)rolenamerP   rQ   r   rO   r   create_reference_roleb   s   rX   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 rA   )	rE   rF   r)   r4   rC   rD   ROLESr*   rG   )	rH   rI   r7   rJ   rK   rL   rM   contextrN   r   r   r   default_reference_roles   s   

	r[   cmsreferencez\(\?P(<\w+>)z\(c                 C   s   dd t | D }g }|D ]F\}}}d\}}t| |d D ]4\}}	|	dkr0|dkr0|d7 }n|	dkr<|dkr<|d8 }|	}|d	krS|| ||| d  |f  nqq|D ]
\}
}| |
|} 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 | ]}| 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)patternnamed_group_indicesgroup_pattern_and_namer]   r^   
group_nameunmatched_open_brackets	prev_charidxvalgroup_patternr   r   r   replace_named_groups   s(   
ru   c                 C   sD  dd t | D }g }|D ]A}d\}}t| |d d D ]0\}}|dkr/|dkr/|d7 }n|dkr;|dkr;|d8 }|}|d	krN|||d
 | f  nqqg }d}	|D ]\}}
|	r`||	ksb|	si|||
f |
}	qV|rg d}}	|D ]\}}
|	r|| |	|  || d| d  |
}	qu|| |	d  d|S | 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   )r]   r_   r   r   r   rb      s    z*replace_unnamed_groups.<locals>.<listcomp>rc   r   Nrd   re   rf   r      z<var>r   )unnamed_group_matcherrh   ri   rj   r   )rl   unnamed_group_indicesgroup_indicesr]   rp   rq   rr   rs   group_start_end_indicesprev_endr^   final_patternr   r   r   replace_unnamed_groups   s>   


r}   )NrR   )%__doc__r   email.errorsr   email.parserr   inspectr   django.urlsr   django.utils.regex_helperr   django.utils.safestringr   docutils.corer4   docutils.nodesdocutils.parsers.rst.rolesImportErrordocutils_is_availabler   r$   r;   rY   rX   r[   rS   rT   rU   rV   r   rH   rP   rg   rw   ru   r}   r   r   r   r   <module>   sF    
"	
&