
    h                        S r SSKrSSKJr  SSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJr   SSKrSSKrSSKrS	rS rS rS S jrSSSSSS.rS r S!S jr\(       aS  \R4                  R6                  R8                  R;                  S\5        \R=                  5        H  u  rr \" \\ 5        M     \" S5      r!\" S5      r"\" S5      r#S r$S r%S r&S r'S r(S r)g! \ a    S
r Nf = f)"zBMisc. utility functions/classes for admin documentation generator.    N)HeaderParseError)HeaderParser)cleandoc)reverse)_lazy_re_compile)	mark_safeTFc                     [        U S5      (       a'  U R                  nUR                   SUR                   3$ U R                  n[	        U SU R
                  R                  5      nUS-   U-   $ )N
view_class.__qualname__)hasattrr
   
__module__r   getattr	__class____name__)	view_funcklassmod_name	view_names       P/var/www/html/env/lib/python3.13/site-packages/django/contrib/admindocs/utils.pyget_view_namer      sm    y,''$$""#1U%7%7$899##H	>93F3F3O3OPIc>I%%    c                    U (       d  SS0 4$ [        U 5      n [        R                  " SU 5      nUS   n[        U5      S:X  a  Sn0 nOi[	        5       n UR                  US   5      n[        UR                  5       5      nU(       a  SR                  USS 5      nOSR                  USS 5      n X#U4$ ! [         a    0 nSR                  USS 5      n N&f = f)zF
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HHY	*E!HE
5zQ
	.uRy1H
 HNN,-H{{52;/{{59-     	*H;;uQRy)D	*s   B5 5 CCc                     SSU[        S5      R                  S5      SSS.nU=(       a    SU-  nSn[        R                  R	                  X@-  US	S
US9n[        US   5      $ )z4
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   )textr0   thing_being_parsed	overridessourcer%   s         r   	parse_rstrB   ;   s    
  !%>78??D"'I ,K9K0KF MM''&$ ( 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tagc                    ^^ U S;   mSUU4S jjn[         R                  R                  R                  R	                  X5        g )N)rE   rD   c                    > Uc  0 n[         R                  R                  " UU4ST	UR                  R                  R
                  T(       a  UOUR                  5       4-  0UD6nU// 4$ Nrefuri)r;   nodes	referencedocumentsettingsr1   lower)
namerawtextr>   linenoinlineroptionscontentnodeis_case_sensitiveurlbases
           r   _role$create_reference_role.<locals>._rolek   su    ?G~~''
 $$--77-D4::<	
 
 vrzr   NN)r;   parsersrstrolesregister_canonical_role)rolenamerY   rZ   rX   s    ` @r   create_reference_rolerb   g   s;     $88 " 66xGr   c                    Uc  0 nUR                   R                  R                  n[        R                  R
                  " UU4S[        U   UR                   R                  R                  UR                  5       4-  0UD6nU// 4$ rJ   )	rN   rO   r0   r;   rL   rM   ROLESr1   rP   )	rQ   rR   r>   rS   rT   rU   rV   contextrW   s	            r   default_reference_rolerf      s     ''AAG>>## 'N  ))33

	 D 62:r   cmsreferencez\(\?P(<\w+>)z\(z\(\?\:c                 4    [         R                  " SS U 5      $ )z1Remove unescaped metacharacters from the pattern.z/((?:^|(?<!\\))(?:\\\\)*)(\\?)([?*+^$]|\\[bBAZ])c                 6    U S   (       a  U S   U S   -   $ U S   $ )N   r   r,    )ms    r   <lambda>(replace_metacharacters.<locals>.<lambda>   s"    1!A$1+/1Q4/r   )r   sub)patterns    r   replace_metacharactersrq      s    66:/ r   c                     Su  p4[        X!S  5       H;  u  pVUS:X  a  US:w  a  US-  nOUS:X  a  US:w  a  US-  nUnUS:X  d  M2  XU-   S-   4s  $    g )N)r   N(\r   )r   )	enumerate)startendrp   unmatched_open_brackets	prev_charidxvals          r   _get_group_start_endr}      st    )0&gdm, #:)t+#q(#CZI-#q(#	 #a')a-'' -r   c              #      #    S nUR                  U 5       HV  n[        UR                  S5      UR                  S5      U 5      =n(       d  M7  Uu  pVU(       a  XR:  d  U(       d  XVU4v   UnMX     g 7f)Nr   )finditerr}   rw   rx   )rp   group_matcherprev_endmatchindicesrw   rx   s          r   _find_groupsr      sd     H''0*5;;q>599Q<QQ7Q JEE,H%''H 1s   AA1$A1c                     [        U [        5       VVVs/ s H  u  pnXU US   4PM     nnnnU H  u  pVU R                  XV5      n M     U $ s  snnnf )z
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>
r   )r   named_group_matcherreplace)rp   rw   rx   r   group_pattern_and_namegroup_pattern
group_names          r   replace_named_groupsr      sf     ".g7J!K!KE 
s	U1X&!K   &<!//-< &<Ns   Ac                 ~    Su  p[        U [        5       H  u  p4nU(       a  XX# -  nXSU S-   -  nUnM!     XU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)rp   final_patternr   rw   rx   _s         r   replace_unnamed_groupsr      s]     'M%g/DEAX44M%722	 F
 89---r   c                 `    [        U [        5      nSu  p#U H  u  pEnX X4 -  nUnM     X U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)rp   group_start_end_indicesr   r   rw   rx   r   s          r   remove_non_capturing_groupsr      sL     +74OP&M0A00 1 89---r   )Nr\   )*__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_is_availableImportErrorr   r*   rB   rd   rb   rf   r]   r^   r_   r`   r"   rQ   rY   r   r   r   rq   r}   r   r   r   r   rk   r   r   <module>r      s   D 	 ) %   6 -!% !&!8(H "	H2 AE* 66. gdG, ' '7 (/ .y9 ("".".q  "!"s   C C&%C&