o
    uvXj/  ã                   @   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	 zddl
ZddlZddlZW n ey7   dZY nw 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ruejjj de¡ e ¡ D ]	\ZZeeeƒ qke 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)Ú	mark_safeFTc                 C   s"   | j }t| d| jjƒ}|d | S )NÚ__qualname__Ú.)Ú
__module__ÚgetattrÚ	__class__Ú__name__)Ú	view_funcÚmod_nameÚ	view_name© r   ú[/var/www/html/myproject/venv/lib/python3.10/site-packages/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 r   )Úrstripr   ©Úindentr   r   Ú
<listcomp>%   s    z"trim_docstring.<locals>.<listcomp>é   NÚ
)ÚstripÚ
expandtabsÚ
splitlinesÚminr   Újoin)Ú	docstringÚlinesÚtrimmedr   r   r   Útrim_docstring   s   (r(   c                 C   s´   t | ƒ} t d| ¡}|d }t|ƒdkrd}i }n<tƒ }z	| |d ¡}W n ty9   i }d |dd… ¡}Y nw t| 	¡ ƒ}|rLd |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$   þ
r4   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   r   ÚdocutilsÚcoreÚpublish_partsr   )Útextr9   Úthing_being_parsedÚ	overridesÚsourcer/   r   r   r   Ú	parse_rstC   s   úýrJ   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)rC   ÚnodesÚ	referenceÚdocumentÚsettingsr:   Úlower)ÚnameÚrawtextrF   ÚlinenoÚinlinerÚoptionsÚcontentÚnode©Úurlbaser   r   Ú_rolen   s   þþýù
	z$create_reference_role.<locals>._role©NN)rC   ÚparsersÚrstÚrolesÚregister_canonical_role)Úrolenamer_   r`   r   r^   r   Úcreate_reference_rolem   s   rg   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 rP   )	rT   rU   r9   rC   rR   rS   ÚROLESr:   rV   )	rW   rX   rF   rY   rZ   r[   r\   Úcontextr]   r   r   r   Údefault_reference_role~   s   
þþýù
	rj   Úcmsreferencez\(\?P(<\w+>)z\(c                 C   sÈ   dd„ t  | ¡D ƒ}g }|D ]F\}}}d\}}tt| |d… ƒƒD ]2\}}	|dkr8| | ||| … |f¡  n|	dkrE|dkrE|d7 }n|	d	krQ|dkrQ|d8 }|	}q!q|D ]
\}
}|  |
|¡} qW| 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)ÚpatternÚnamed_group_indicesÚgroup_pattern_and_namerl   rm   Ú
group_nameÚunmatched_open_bracketsÚ	prev_charÚidxÚvalÚgroup_patternr   r   r   Úreplace_named_groups™   s&   þ
€r„   c                 C   sH  dd„ t  | ¡D ƒ}g }|D ]C}d\}}tt| |d d… ƒƒD ]0\}}|dkr5| ||d | f¡  n|dkrB|dkrB|d7 }n|d	krN|dkrN|d8 }|}q qg }d}	|D ]\}}
|	rb||	ksd|	sk| ||
f¡ |
}	qX|r¢g d}}	|D ]\}}
|	r†| | |	|… ¡ | | d|… d
 ¡ |
}	qw| | |	d… ¡ d |¡S | 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   )rl   ro   r   r   r   r   Ä   s    z*replace_unnamed_groups.<locals>.<listcomp>rq   r   Nr   rr   rs   rt   z<var>r   )Úunnamed_group_matcherrv   rw   rx   ry   r$   )r{   Úunnamed_group_indicesÚgroup_indicesrl   r   r€   r�   r‚   Úgroup_start_end_indicesÚprev_endrm   Úfinal_patternr   r   r   Úreplace_unnamed_groups¾   s<    
€

r‹   r   ra   )#Ú__doc__r*   Úemail.errorsr   Úemail.parserr   Údjango.urlsr   Údjango.utils.safestringr   Údocutils.corerC   Údocutils.nodesÚdocutils.parsers.rst.rolesÚImportErrorÚdocutils_is_availabler   r(   r4   rJ   rh   rg   rj   rb   rc   rd   re   r.   rW   r_   Úcompileru   r…   r„   r‹   r   r   r   r   Ú<module>   sD    ÿ
"û	


%