a
    5Xh                     @   sH  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y   d	ZY n0 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 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S )-zBMisc. 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   c/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/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 }nxt }z||d }W n( ty   i }d|dd }Y n80 t|	 }|rd|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tagc                    s.   | dv  d fdd	}t jjj| | d S )N)r5   r4   c                    sJ   |d u ri }t jj||fd|jjj r,|n| f i|}|gg fS NZrefuri)r.   nodes	referencedocumentsettingsr)   lower)namerawtextr0   linenoinlineroptionscontentnodeZis_case_sensitiveurlbaser   r   _rolek   s    
z$create_reference_role.<locals>._role)NN)r.   parsersrstrolesregister_canonical_role)ZrolenamerF   rG   r   rE   r   create_reference_roleg   s    rL   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 r8   )	r;   r<   r(   r.   r9   r:   ROLESr)   r=   )	r>   r?   r0   r@   rA   rB   rC   contextrD   r   r   r   default_reference_role   s     

rO   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 )N   r   r&   r   )mr   r   r   <lambda>       z(replace_metacharacters.<locals>.<lambda>)r   subpatternr   r   r   replace_metacharacters   s
    rW   c                 C   sx   d\}}t ||d  D ]Z\}}|dkr:|dkr:|d7 }n|dkrR|dkrR|d8 }|}|dkr| || d f  S qd S )N)r   N(\r   )r   )	enumerate)startendrV   Zunmatched_open_bracketsZ	prev_charidxvalr   r   r   _get_group_start_end   s    
r`   c                 c   s\   d }| | D ]H}t|d|d|  }r|\}}|rB||ksF|sR|||fV  |}qd S )Nr   )finditerr`   r\   r]   )rV   Zgroup_matcherprev_endmatchindicesr\   r]   r   r   r   _find_groups   s    re   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   ).0r\   r]   rc   rU   r   r   
<listcomp>   s   z(replace_named_groups.<locals>.<listcomp>)re   named_group_matcherreplace)rV   Zgroup_pattern_and_nameZgroup_patternZ
group_namer   rU   r   replace_named_groups   s    
rj   c                 C   sZ   d\}}t | tD ]6\}}}|r0|| || 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>)re   unnamed_group_matcher)rV   final_patternrb   r\   r]   _r   r   r   replace_unnamed_groups   s    ro   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
    rk   N)re   non_capturing_group_matcher)rV   Zgroup_start_end_indicesrm   rb   r\   r]   rn   r   r   r   remove_non_capturing_groups   s    
rq   )N)NN)*__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   rM   rL   rO   rH   rI   rJ   rK   r   r>   rF   rh   rl   rp   rW   r`   re   rj   ro   rq   r   r   r   r   <module>   sR   
	
$	 

	
