o
    Xi                      @   sn  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ddlZW n eyG   d	ZY nw d
Zdd Zdd Zd0ddZddddddZedejZdd Zdd Z	d1ddZerejj j!"de e# D ]	\Z$Z%ee$e% qedZ&ed Z'ed!Z(d"d# Z)d$d% Z*d&d' Z+d(d) Z,d*d+ Z-d,d- Z.d.d/ Z/dS )2zBMisc. utility functions/classes for admin documentation generator.    N)HeaderParseError)HeaderParser)cleandoc)reverse)_lazy_re_compile)	mark_safeFTc                 C   sD   t | dr| j}|j d|j S | j}t| d| jj}|d | S )N
view_class.__qualname__)hasattrr   
__module__r
   getattr	__class____name__)	view_funcklassmod_name	view_name r   ~/var/www/snowflake_co_dev_github/snow_flake_back_end_deploy/env/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   s`   dd|t ddddd}|od| }d}tjd	 }tjj||  |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::
htmlN)source_pathdestination_pathwritersettings_overridesfragment)r   rstripdocutilswritersget_writer_classcorepublish_partsr   )textr,   thing_being_parsed	overridessourcewriter_instancer"   r   r   r   	parse_rst<   s$   	rA   z%s/models/%s/z%s/views/%s/z%s/templates/%s/z%s/filters/#%sz%s/tags/#%s)modelviewtemplatefiltertagz^(.+?)\s*(?<!\x00)<([^<]*?)>$c                 C   s.   t | }|rd|d|dfS d| | fS )z
    Split role content into title and target, if given.

    From sphinx.util.nodes.split_explicit_title
    See https://github.com/sphinx-doc/sphinx/blob/230ccf2/sphinx/util/nodes.py#L389
    Tr      F)explicit_title_rematchgroup)r<   rI   r   r   r   split_explicit_titlem   s   

rK   c                    s.   | dv  d fdd	}t jjj| | d S )N)rD   rC   c                    sX   |d u ri }t |\}}}	tjj||fd|jjj r|	n|	 f i|}
|
gg fS Nrefuri)rK   r7   nodes	referencedocumentsettingsr-   lower)namerawtextr<   linenoinlineroptionscontent_r#   targetnodeis_case_sensitiveurlbaser   r   _role~   s    

z$create_reference_role.<locals>._roleNN)r7   parsersrstrolesregister_canonical_role)rolenamer^   r_   r   r\   r   create_reference_rolez   s   rf   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 rL   )	rP   rQ   r,   r7   rN   rO   ROLESr-   rR   )	rS   rT   r<   rU   rV   rW   rX   contextr[   r   r   r   default_reference_role   s    


ri   cmsreferencez\(\?P(<\w+>)z\(z\(\?\:c                 C   s   t ddd | S )z1Remove unescaped metacharacters from the pattern.z/((?:^|(?<!\\))(?:\\\\)*)(\\?)([?*+^$]|\\[bBAZ])c                 S   s    | d r| d | d  S | d S )NrG   r   r(   r   )mr   r   r   <lambda>   s     z(replace_metacharacters.<locals>.<lambda>)r   subpatternr   r   r   replace_metacharacters   s
   rp   c                 C   sx   d\}}t ||d  D ]-\}}|dkr|dkr|d7 }n|dkr)|dkr)|d8 }|}|dkr9| || d f  S qd S )N)r   N(\r   )r   )	enumerate)startendro   unmatched_open_brackets	prev_charidxvalr   r   r   _get_group_start_end   s   
r{   c                 c   s^    d }| | D ]$}t|d|d|  }r,|\}}|r"||ks$|s*|||fV  |}qd S )Nr   )finditerr{   ru   rv   )ro   group_matcherprev_endrI   indicesru   rv   r   r   r   _find_groups   s   r   c                    s6    fddt  tD }|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&   g | ]\}}} || |d  fqS )r   r   ).0ru   rv   rI   rn   r   r   
<listcomp>   s    z(replace_named_groups.<locals>.<listcomp>)r   named_group_matcherreplace)ro   group_pattern_and_namegroup_pattern
group_namer   rn   r   replace_named_groups   s   
r   c                 C   sZ   d\}}t | tD ]\}}}|r|| || 7 }|| d| d 7 }|}q	|| |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>
    r   NNz<var>)r   unnamed_group_matcher)ro   final_patternr~   ru   rv   rY   r   r   r   replace_unnamed_groups   s   r   c                 C   sF   t | t}d\}}|D ]\}}}|| || 7 }|}q|| |d  S )z
    Find non-capturing groups in the given `pattern` and remove them, e.g.
    1. (?P<a>\w+)/b/(?:\w+)c(?:\w+) => (?P<a>\\w+)/b/c
    2. ^(?:\w+(?:\w+))a => ^a
    3. ^a(?:\w+)/b(?:\w+) => ^a/b
    r   N)r   non_capturing_group_matcher)ro   group_start_end_indicesr   r~   ru   rv   rY   r   r   r   remove_non_capturing_groups   s   
r   c                 C   s   t | ddddS )Nz<p>r   z</p>)r   r   )valuer   r   r   strip_p_tags  s   r   )Nr`   )0__doc__r   email.errorsr   email.parserr   inspectr   django.urlsr   django.utils.regex_helperr   django.utils.safestringr   docutils.corer7   docutils.nodesdocutils.parsers.rst.rolesdocutils.writersImportErrordocutils_is_availabler   r'   rA   rg   compileDOTALLrH   rK   rf   ri   ra   rb   rc   rd   r    rS   r^   r   r   r   rp   r{   r   r   r   r   r   r   r   r   r   <module>   s^    	
'

	
