o
    |ó·i‚  ã                   @   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yC   d	ZY nw 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r~ejjj de¡ e ¡ D ]	\ZZ eee ƒ qte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   údC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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Ú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   rM   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    
þþÿü
ö
rP   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>¦   s     z(replace_metacharacters.<locals>.<lambda>N)r   Úsub©Úpatternr   r   r   Úreplace_metacharacters¢   s
   ýrW   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ÚendrV   Zunmatched_open_bracketsZ	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`   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>N)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 ]\}}}|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>)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   )NrH   )*Ú__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   rN   rM   rP   rI   rJ   rK   rL   r   r>   rF   rh   rl   rp   rW   r`   re   rj   ro   rq   r   r   r   r   Ú<module>   sV    ÿ	
$û	
ÿ
ÿ	
