
    ih                         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 	 ddlZddlZddlZddlZd	Zn# e$ r d
ZY nw xY wd Zd Zd#dZddddddZ ej        dej                  Zd Zd Z	 d$dZerKej        j         j!        "                    de           e#                                D ]\  Z$Z% ee$e%            ed          Z& ed          Z' ed          Z(d Z)d Z*d Z+d Z,d  Z-d! Z.d" Z/dS )%zBMisc. utility functions/classes for admin documentation generator.    N)HeaderParseError)HeaderParser)cleandoc)reverse)_lazy_re_compile)	mark_safeTFc                     t          | d          r| j        }|j         d|j         S | j        }t	          | d| j        j                  }|dz   |z   S )N
view_class.__qualname__)hasattrr
   
__module__r   getattr	__class____name__)	view_funcklassmod_name	view_names       U/var/www/histauto/venv/lib/python3.11/site-packages/django/contrib/admindocs/utils.pyget_view_namer      sd    y,'' :$"99U%7999#H	>93F3OPPIc>I%%    c                    | sddi fS t          |           } t          j        d|           }|d         }t          |          dk    rd}i }nt	                      }	 |                    |d                   }t          |                                          }|rd                    |dd                   }nMd                    |dd                   }n/# t          $ r" i }d                    |dd                   }Y nw xY w|||fS )zN
    Parse out the parts of a docstring.  Return (title, body, metadata).
     z\n{2,}r      z

N)
r   resplitlenr   parsestrdictitemsjoinr   )	docstringpartstitlebodymetadataparsers         r   parse_docstringr*       s"     2rz##IHY	**E!HE
5zzQ
	.uRy11H
 HNN,,--H .{{52;//{{59--   	* 	* 	*H;;uQRRy))DDD	* $  s   C )D Dc                 *   dd|t          d                              d          ddd}|od|z  }d}t          j                            d	                      }t          j                            || z  |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::
htmlN)source_pathdestination_pathwritersettings_overridesfragment)r   rstripdocutilswritersget_writer_classcorepublish_partsr   )textr0   thing_being_parsed	overridessourcewriter_instancer%   s          r   	parse_rstrE   <   s    
  !%>788??DD"' I ,K9K0KF &77??AAOM''&$ (  E U:&'''r   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                     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)r@   rN   s     r   split_explicit_titlerP   m   sM     ##D))E 4U[[^^U[[^^33$r   c                 t    | dv dfd	}t           j        j        j                            | |           d S )N)rH   rG   c                     |i }t          |          \  }}}	t          j        j        ||fd|j        j        j        r|	n|	                                fz  i|}
|
gg fS Nrefuri)rP   r;   nodes	referencedocumentsettingsr1   lower)namerawtextr@   linenoinlineroptionscontent_r&   targetnodeis_case_sensitiveurlbases              r   _rolez$create_reference_role.<locals>._role~   s    ?G/555&~'
 
 $-7/CFFV\\^^	
 
 
 vrzr   NN)r;   parsersrstrolesregister_canonical_role)rolenamerd   re   rc   s    ` @r   create_reference_rolerl   z   sZ     $88      $ 66xGGGGGr   c                     |i }|j         j        j        }t          j        j        ||fdt          |         |j         j        j        |                                fz  i|}|gg fS rS   )	rW   rX   r0   r;   rU   rV   ROLESr1   rY   )	rZ   r[   r@   r\   r]   r^   r_   contextrb   s	            r   default_reference_rolerp      s     'AG>#  'N )3

	  D 62:r   cmsreferencez\(\?P(<\w+>)z\(z\(\?\:c                 0    t          j        dd |           S )z1Remove unescaped metacharacters from the pattern.z/((?:^|(?<!\\))(?:\\\\)*)(\\?)([?*+^$]|\\[bBAZ])c                 D    | d         r| d         | d         z   n| d         S )NrL   r   r,    )ms    r   <lambda>z(replace_metacharacters.<locals>.<lambda>   s#    1/!A$1++1Q4 r   )r   sub)patterns    r   replace_metacharactersry      s"    6://  r   c                     d\  }}t          ||d                    D ]<\  }}|dk    r|dk    r|dz  }n|dk    r|dk    r|dz  }|}|dk    r| ||z   dz   fc S =d S )N)r   N(\r   )r   )	enumerate)startendrx   unmatched_open_brackets	prev_charidxvals          r   _get_group_start_endr      s    )0&Ygcddm,, ( (S #::)t++#q(##CZZI--#q(#	 #a''#)a-'''' (( (r   c              #      K   d }|                     |           D ]S}t          |                    d          |                    d          |           x}r|\  }}|r||k    s|s|||fV  |}Td S )Nr   )finditerr   r   r   )rx   group_matcherprev_endrN   indicesr   r   s          r   _find_groupsr      s      H''00  *5;;q>>599Q<<QQQ7 	 JE3 (EH,,H,S%''''H r   c                       fdt           t                    D             }|D ]\  }}                     ||            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                 <    g | ]\  }}}||         |d          fS )r   rt   ).0r   r   rN   rx   s       r   
<listcomp>z(replace_named_groups.<locals>.<listcomp>   sA       E3 
s	U1X&  r   )r   named_group_matcherreplace)rx   group_pattern_and_namegroup_pattern
group_names   `   r   replace_named_groupsr      sg       !-g7J!K!K   &< = =!z//-<<Nr   c                     d\  }}t          | t                    D ]'\  }}}|r|| ||         z  }|| d|         dz   z  }|}(|| |d         z   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>)r   unnamed_group_matcher)rx   final_patternr   r   r   r`   s         r   replace_unnamed_groupsr      s{     'M8%g/DEE  sA 	5WXe^44M%7227899---r   c                     t          | t                    }d\  }}|D ]\  }}}|| ||         z  }|}|| |d         z   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)r   non_capturing_group_matcher)rx   group_start_end_indicesr   r   r   r   r`   s          r   remove_non_capturing_groupsr      sb     +74OPP&M80  sA%007899---r   c                 p    t          |                     dd                              dd                    S )Nz<p>r   z</p>)r   r   )values    r   strip_p_tagsr     s.    U]]5"--55fbAABBBr   )Nrf   )0__doc__r   email.errorsr   email.parserr   inspectr   django.urlsr   django.utils.regex_helperr   django.utils.safestringr   docutils.corer;   docutils.nodesdocutils.parsers.rst.rolesdocutils.writersdocutils_is_availableImportErrorr   r*   rE   rn   compileDOTALLrM   rP   rl   rp   rg   rh   ri   rj   r"   rZ   rd   r   r   r   ry   r   r   r   r   r   r   rt   r   r   <module>r      s   D D 				 ) ) ) ) ) ) % % % % % %             6 6 6 6 6 6 - - - - - -!%%%% !  " " "!"& & &! ! !8 (  (  (  (N "	 	 BJ?KK 
 
 
H H H4 AE   *  -66.    - -gdG,,,, '&77 ((// ..y99   ( ( ("    ". . .". . .C C C C Cs   ? A	A	