
    k7iF5                       S r SSKJr  SrSSKrSSKrSSKJrJr  SSK	J
r
  SSKJr   " S S	\
5      r " S
 S\
5      r " S S\
5      r " S S\
5      r " S S\
5      r " S S\
5      r " S S\
5      r " S S\
5      r " S S\
5      rg)a  
Transforms needed by most or all documents:

- `Decorations`: Generate a document's header & footer.
- `ExposeInternals`: Expose internal attributes.
- `Messages`: Placement of system messages generated after parsing.
- `FilterMessages`: Remove system messages below verbosity threshold.
- `TestMessages`: Like `Messages`, used on test runs.
- `StripComments`: Remove comment elements from the document tree.
- `StripClassesAndElements`: Remove elements with classes
  in `self.document.settings.strip_elements_with_classes`
  and class values in `self.document.settings.strip_classes`.
- `SmartQuotes`: Replace ASCII quotation marks with typographic form.
- `Validate`: Validate the document tree, report violations as warning.
    )annotationsreStructuredTextN)nodesutils)	Transform)smartquotesc                  2    \ rS rSrSrSrS	S jrS rS rSr	g)
Decorations!   z<
Populate a document's decoration element (header, footer).
i4  c                N   U R                  5       nU(       a;  U R                  R                  5       nUR                  5       nUR	                  U5        U R                  5       nU(       a<  U R                  R                  5       nUR                  5       nUR	                  U5        g g N)generate_headerdocumentget_decoration
get_headerextendgenerate_footer
get_footer)selfheader_nodes
decorationheaderfooter_nodesfooters         W/home/james-whalen/.local/lib/python3.13/site-packages/docutils/transforms/universal.pyapplyDecorations.apply)   s    ++-557J**,FMM,'++-557J**,FMM,'     c                    g r    )r   s    r   r   Decorations.generate_header5   s    r   c                T   U R                   R                  nUR                  (       d4  UR                  (       d#  UR                  (       d  UR
                  (       Ga  / nUR                  (       a  UR                  (       d  UR
                  (       a  UR
                  (       a  UR
                  nO+[        R                  " UR                  UR                  5      nUR                  [        R                  " SSUS9[        R                  " S5      /5        UR                  (       a_  [        R                  " UR                  [        R                   " 5       5      nUR#                  [        R                  " SU-   S-   5      5        UR                  (       az  UR                  [        R                  " S5      [        R                  " SSSS9[        R                  " S	5      [        R                  " SS
SS9[        R                  " S5      /5        [        R$                  " SS/UQ76 /$ g )N zView document source)refuriz.
zGenerated on: zGenerated by Docutilsz https://docutils.sourceforge.io/z from r   z(https://docutils.sourceforge.io/rst.htmlz	 source.
)r   settings	generator	datestampsource_link
source_url_sourcer   relative_pathoutput_pathr   r   	referenceTexttimestrftimegmtimeappend	paragraph)r   r&   textsourcer(   s        r   r   Decorations.generate_footer8   s    ==))("4"4##x':':':D$$)9)9&&&&%00F"001E1E191A1ACFOOB(>+13JJu%' ( !! MM(*<*<dkkmL	EJJ'7)'Ce'KLM!!JJ/OOB
+MOJJx(OOB(:,/0 JJ|,. / OOB2T233r   r    NreturnNone)
__name__
__module____qualname____firstlineno____doc__default_priorityr   r   r   __static_attributes__r    r   r   r
   r
   !   s     
(%r   r
   c                  0    \ rS rSrSrSrSS jrS	S jrSrg)
ExposeInternals`   zD
Expose internal attributes if ``expose_internals`` setting is set.
iH  c                @    [        U[        R                  5      (       + $ r   )
isinstancer   r/   r   nodes     r   not_TextExposeInternals.not_Texth   s    dEJJ///r   c                &   U R                   R                  R                  (       al  U R                   R                  U R                  5       HB  nU R                   R                  R                   H  n[        XS 5      nUc  M  X1SU-   '   M     MD     g g )Nz	internal:)r   r&   expose_internalsfindallrI   getattr)r   rH   attvalues       r   r   ExposeInternals.applyk   sq    ==!!22--dmm<==11BBC#Dt4E(27[3./ C = 3r   r    Nr9   boolr8   )	r;   r<   r=   r>   r?   r@   rI   r   rA   r    r   r   rC   rC   `   s     08r   rC   c                  &    \ rS rSrSrSrSS jrSrg)Messagest   zHandle "loose" messages.

Place system messages generated by parsing or transforms that are not
attached to the document tree into a dedicated section of the document.
i\  c                   / U R                   R                  QU R                   R                  QnU Vs/ s H  o"R                  (       a  M  UPM     nnU(       ab  [        R
                  " S/S9nU[        R                  " SS5      -  nXC-  n/ U R                   R                  S S & U =R                   U-  sl         g g s  snf )Nsystem-messages)classesr#   zDocutils System Messages)r   parse_messagestransform_messagesparentr   sectiontitle)r   messagesmsgloose_messagesr]   s        r   r   Messages.apply~   s    7T]]11 7]]557)1D##Dmm->,?@Gu{{2'ABBG%G24DMM,,Q/MMW$M  Es   B=B=r    Nr8   r;   r<   r=   r>   r?   r@   r   rA   r    r   r   rU   rU   t   s     
%r   rU   c                  &    \ rS rSrSrSrSS jrSrg)FilterMessages   z
Remove system messages below verbosity threshold.

Also convert <problematic> nodes referencing removed messages
to <Text> nodes and remove "System Messages" section if empty.
if  c                j   / n[        U R                  R                  [        R                  5      5       H  nUS   U R                  R
                  R                  :  d  M,  UR                  R                  U5        US    H:  nU R                  R                  R                  US 5        UR                  U5        M<     M     [        U R                  R                  [        R                  5      5       HT  nSU;   d  M  US   U;   d  M  UR                  R                  U[        R                  " UR                  5       5      5        MV     U R                  R                  [        R                   5       H:  nSUS   ;   d  M  [#        U5      S:X  d  M  UR                  R                  U5        M<     g )NlevelidsrefidrX   rY      )tupler   rM   r   system_messagereporterreport_levelr\   removeri   popr3   problematicreplacer/   astextr]   len)r   removed_idsrH   _ids       r   r   FilterMessages.apply   s3   $--//0D0DEFDG}t}}55BBB""4(;CMM%%))#t4&&s+ ' G $--//0A0ABCD$4=K#?##D%**T[[]*CD D MM))%--8D DO3D	Q""4( 9r   r    Nr8   rc   r    r   r   re   re      s     )r   re   c                  *    \ rS rSrSrSrSrSS jrSrg)	TestMessages   z_
Append all post-parse system messages to the end of the document.

Used for testing purposes.
Fip  c                    U R                   R                   H+  nUR                  (       a  M  U =R                   U-  sl         M-     g r   )r   r[   r\   )r   r`   s     r   r   TestMessages.apply   s-    ==33C:::$ 4r   r    Nr8   )	r;   r<   r=   r>   r?   __test__r@   r   rA   r    r   r   rz   rz      s     H%r   rz   c                  &    \ rS rSrSrSrSS jrSrg)StripComments   ze
Remove comment elements from the document tree (only if the
``strip_comments`` setting is enabled).
i  c                    U R                   R                  R                  (       aU  [        U R                   R	                  [
        R                  5      5       H  nUR                  R                  U5        M      g g r   )	r   r&   strip_commentsrl   rM   r   commentr\   rp   rG   s     r   r   StripComments.apply   sO    ==!!00dmm33EMMBC""4( D 1r   r    Nr8   rc   r    r   r   r   r      s    
 )r   r   c                  0    \ rS rSrSrSrSS jrS	S jrSrg)
StripClassesAndElements   z
Remove from the document tree all elements with classes in
`self.document.settings.strip_elements_with_classes` and all "classes"
attribute values in `self.document.settings.strip_classes`.
i  c                   U R                   R                  R                  (       aw  1 U R                   R                  R                  kU l        [	        U R                   R                  U R                  5      5       H  nUR                  R                  U5        M      U R                   R                  R                  (       d  g U R                   R                  R                  nU R                   R                  [        R                  5       H!  nU H  n US   R                  U5        M     M#     g ! [         a     M.  f = f)NrY   )r   r&   strip_elements_with_classesstrip_elementsrl   rM   check_classesr\   rp   strip_classesr   Element
ValueError)r   rH   r   class_values       r   r   StripClassesAndElements.apply   s    ==!!==#ADMM$:$:$?$?#AD dmm33D4F4FGH""4( I }}%%33..<<MM))%--8D,O**;7  - 9 " s   D22
E ?E c                    [        U[        R                  5      (       d  gUS   S S   H  nX R                  ;   d  M    g   g)NFrY   T)rF   r   r   r   )r   rH   r   s      r   r   %StripClassesAndElements.check_classes   s=    $..	?1-K111 . r   )r   Nr8   rR   )	r;   r<   r=   r>   r?   r@   r   r   rA   r    r   r   r   r      s     &r   r   c                     \ rS rSrSrSr\R                  \R                  4r	 \R                  \R                  \R                  \R                  \R                  \R                  \R                  4r Sr S
S jrS rS
S jrSrg	)SmartQuotes   zu
Replace ASCII quotation marks with typographic form.

Also replace multiple dashes with em-dash/en-dash characters.
iW  qDec                L    [         R                  " XUS9  [        5       U l        g )N)	startnode)r   __init__setunsupported_languages)r   r   r   s      r   r   SmartQuotes.__init__  s    4Y?%(U"r   c              #  6  #    U H  n[        UR                  U R                  5      (       d/  [        UR                  R                  U R                  5      (       a  S[        U5      4v   Mh  [        R
                  " SS[        U5      5      nSU4v   M     g 7f)Nliteralz(?<= )([-\'".`])z\\\1plain)rF   r\   literal_nodesstrresub)r   txtnodesrH   txts       r   
get_tokensSmartQuotes.get_tokens  sw      D4;;(:(:;;dkk00$2D2DEET** ff4gs4yIsl" s   BBc                   U R                   R                  R                  SS5      nU(       d  g  UR                  S5      nU R                   R                  R
                  nU R                   R                  R                  nU(       a2  [        R                  R                  R                  [        U5      5        U R                   R                  [        R                  5       GH  n[        XPR                   5      (       a  M   [        UR"                  [        R                  5      (       a  MK  UR                  [        R$                  5       Vs/ s H0  n[        UR"                  [        R&                  5      (       a  M.  UPM2     nnUR)                  U5      nU(       a  SU;   a  UR+                  SS5      nOUS-  n[,        R.                  " U5       H%  n	U	[        R                  R                  ;   d  M#  U	n  OU   XR0                  ;  a'  U R                   R2                  R5                  SU-  US9  U R0                  R7                  U5        Sn[        R8                  " U R;                  U5      U R<                  US9n
[?        Xz5       H5  u  pkUR"                  R+                  U[        R$                  " U5      5        M7     GM     U R0                  RA                  5         g ! [         a    Sn GNf = fs  snf )	Nsmart_quotesFaltz
-x-altquotr#   z*No smart quotes defined for language "%s".	base_node)attrlanguage)!r   r&   
setdefault
startswithAttributeErrorlanguage_codesmartquotes_localesr   
smartcharsquotesupdatedictrM   r   TextElementrF   nodes_to_skipr\   r/   option_stringget_language_coders   r   normalize_language_tagr   rn   warningaddeducate_tokensr   smartquotes_actionzipclear)r   r   alternativedocument_languagelc_smartquotesrH   txtnoder   langtagteachernewtexts               r   r   SmartQuotes.apply  sf   }}--889>@	 &11%8K !MM22@@//CC""))00n1EF MM))%*;*;<D$ 2 233$++u'8'899 04||EJJ/G @/GG)'..*/*=*= ?  /GH @
 ))*;<D4'<<b9DL(D33D9+00777D :
 999MM**22DtK"& 3 ( **..t4 "00),,t=G %($: &&w

70CD %;Q =V 	""((*k  	 K	 &@s   K# -K6 K6#K32K3)r   Nr8   )r;   r<   r=   r>   r?   r@   r   FixedTextElementSpecialr   imager   mathrawrr   r   r   r   r   r   rA   r    r   r   r   r      s~     ++U]];MM++U]][[%--YY 1 13M G+#<+r   r   c                  &    \ rS rSrSrSrSS jrSrg)ValidateiW  z;
Validate the document tree, report violations as warning.
iC  c                x   [        U R                  R                  SS5      (       d  g U R                  R                  5        H  n UR	                  SS9  M     g ! [
        R                   aK  nU R                  R                  R                  [        U5      UR                  =(       d    US9   S nAMr  S nAff = f)NvalidateF)	recursiver   )rN   r   r&   rM   r   r   ValidationErrorrn   r   r   problematic_element)r   rH   es      r   r   Validate.apply_  s    t}}--z5AAMM))+DE. , (( E&&..Fa&;&;&Ct / EEs   AB9.A B44B9r    Nr8   rc   r    r   r   r   r   W  s     Er   r   )r?   
__future__r   __docformat__r   r0   docutilsr   r   docutils.transformsr   docutils.utilsr   r
   rC   rU   re   rz   r   r   r   r   r    r   r   <module>r      s     #" 	  ! ) &<) <~8i 8(%y %.)Y )6%9 %&)I )#i #Lf+) f+REy Er   