o
    ˷e"                     @   s  d Z ddl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 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yS   dZY nw dZdd Zdd Zd4ddZddddddZdd Z	d5d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.e/ Z0e
 Z1e0e1_2d4d-d.Z3ej4dd/d0d1 Z5d2d3 Z6dS )6zBMisc. utility functions/classes for admin documentation generator.    N)HeaderParseError)HeaderParser)cleandoc)Local)reverse)
URLPattern)_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   U/var/www/ideatree/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_rst?   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)r9   nodes	referencedocumentsettingsr/   lower)namerawtextr<   linenoinlineroptionscontentnodeurlbaser   r   _rolel   s   

z$create_reference_role.<locals>._roleNN)r9   parsersrstrolesregister_canonical_role)rolenamerU   rV   r   rT   r   create_reference_rolek   s   r]   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 rF   )	rJ   rK   r.   r9   rH   rI   ROLESr/   rL   )	rM   rN   r<   rO   rP   rQ   rR   contextrS   r   r   r   default_reference_role   s    


r`   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 )N   r   r*   r   )mr   r   r   <lambda>   s     z(replace_metacharacters.<locals>.<lambda>)r   subpatternr   r   r   replace_metacharacters   s
   rh   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endrg   unmatched_open_brackets	prev_charidxvalr   r   r   _get_group_start_end   s   
rs   c                 c   s^    d }| | D ]$}t|d|d|  }r,|\}}|r"||ks$|s*|||fV  |}qd S )Nr   )finditerrs   rm   rn   )rg   group_matcherprev_endmatchindicesrm   rn   r   r   r   _find_groups   s   ry   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   ).0rm   rn   rw   rf   r   r   
<listcomp>   s    z(replace_named_groups.<locals>.<listcomp>)ry   named_group_matcherreplace)rg   group_pattern_and_namegroup_pattern
group_namer   rf   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>)ry   unnamed_group_matcher)rg   final_patternrv   rm   rn   _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)ry   non_capturing_group_matcher)rg   group_start_end_indicesr   rv   rm   rn   r   r   r   r   remove_non_capturing_groups   s   
r   c                 C   s    |r|j st|tj | tjv S N)
_populatedregister_callback_activelocal_value)rM   urlresolverr   r   r   _is_callback   s   

r   )maxsizec                 C   sV   | j }t|tjr|j}t|dr|j}nt|ds#|jd |jj	 S |jd |j
 S )zk
    A string that identifies the view (e.g. 'path.to.view_function' or
    'path.to.ClassBasedView').
    r
   r   r   )callback
isinstance	functoolspartialfuncr   r
   r   r   r   r   )
urlpatternr   r   r   r   
lookup_str  s   

r   c                 C   sR   t | jD ]}t|tr|t| qtt_t	|tj |
tj qd| _d S )NT)reversedurl_patternsr   r   addr   _callback_strsr   url_pattern_valuer   updater   )r   threadurl_patternr   r   r   r     s   

r   r   rW   )7__doc__r   r   email.errorsr   email.parserr   inspectr   asgiref.localr   django.urlsr   django.urls.resolversr   django.utils.regex_helperr   django.utils.safestringr	   docutils.corer9   docutils.nodesdocutils.parsers.rst.rolesImportErrordocutils_is_availabler   r)   r@   r^   r]   r`   rX   rY   rZ   r[   r"   rM   rU   r|   r   r   rh   rs   ry   r   r   r   setr   r   r   r   	lru_cacher   r   r   r   r   r   <module>   sj    	
$	

	



