o
    —¨Êhë"  ã                   @   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rŽe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.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   úP/var/www/html/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   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    ÿ	
$û	
ÿ
ÿ	



