o
    [h                     @   sf  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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$ qe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__)Z	view_funcklassmod_nameZ	view_name r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/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)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_rst;   s"   r2   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)r0   r:   r   r   r   split_explicit_titlei   s   

r<   c                    s.   | dv  d fdd	}t jjj| | d S )N)r5   r4   c                    sX   |d u ri }t |\}}}	tjj||fd|jjj r|	n|	 f i|}
|
gg fS NZrefuri)r<   r.   nodes	referencedocumentsettingsr)   lower)namerawtextr0   linenoinlineroptionscontent_r!   targetnodeZis_case_sensitiveurlbaser   r   _rolez   s    

z$create_reference_role.<locals>._roleNN)r.   parsersrstrolesregister_canonical_role)ZrolenamerM   rN   r   rL   r   create_reference_rolev   s   rT   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 r=   )	r@   rA   r(   r.   r>   r?   ROLESr)   rB   )	rC   rD   r0   rE   rF   rG   rH   contextrK   r   r   r   default_reference_role   s    


rW   Z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 )Nr8   r   r&   r   )mr   r   r   <lambda>   s     z(replace_metacharacters.<locals>.<lambda>)r   subpatternr   r   r   replace_metacharacters   s
   r]   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endr\   Zunmatched_open_bracketsZ	prev_charidxvalr   r   r   _get_group_start_end   s   
rf   c                 c   s^    d }| | D ]$}t|d|d|  }r,|\}}|r"||ks$|s*|||fV  |}qd S )Nr   )finditerrf   rb   rc   )r\   Zgroup_matcherprev_endr:   indicesrb   rc   r   r   r   _find_groups   s   rj   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   ).0rb   rc   r:   r[   r   r   
<listcomp>   s    z(replace_named_groups.<locals>.<listcomp>)rj   named_group_matcherreplace)r\   Zgroup_pattern_and_nameZgroup_pattern
group_namer   r[   r   replace_named_groups   s   
rp   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>)rj   unnamed_group_matcher)r\   final_patternrh   rb   rc   rI   r   r   r   replace_unnamed_groups   s   rt   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
    rq   N)rj   non_capturing_group_matcher)r\   Zgroup_start_end_indicesrs   rh   rb   rc   rI   r   r   r   remove_non_capturing_groups   s   
rv   c                 C   s   t | ddddS )Nz<p>r   z</p>)r   rn   )valuer   r   r   strip_p_tags  s   rx   )NrO   )/__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%   r2   rU   compileDOTALLr9   r<   rT   rW   rP   rQ   rR   rS   r   rC   rM   rm   rr   ru   r]   rf   rj   rp   rt   rv   rx   r   r   r   r   <module>   s\    	
$

	
