
    Q?hG              
          S r Sr SrSSKrS r\R
                  " SSSS\SSS9rSSS0 4S jr " S S	5      r	\	" 5       r	S
r
SrSrSr\" \5      rSr/ SQrS rSS\4S jr\(       a  \rS rSrS rSS\4S jrS rSS jrSS jr\S:X  a  \" SS9  SSKrSSKrSSKJr  SSKr\" 5       r Sr!\RD                  SS  Ho  r#\RH                  RK                  \#5      (       d
  \&" S5        M-  \'" \#5       r(\(RS                  5       r*SSS5        \&" S\#< S\" \*5       35        \" \*SS9  \!S-  r!Mq     \!(       a  \&" S\" 5       \ -
  S S35        ggg! \ a    Sr GN+f = f! , (       d  f       Na= f) at  Very simple and fast XML parser, used for intra-paragraph text.

Devised by Aaron Watters in the bad old days before Python had fast
parsers available.  Constructs the lightest possible in-memory
representation; parses most files we have seen in pure python very
quickly.

The output structure is the same as the one produced by pyRXP,
our validating C-based parser, which was written later.  It will
use pyRXP if available.

This is used to parse intra-paragraph markup.

Example parse::

    <this type="xml">text <b>in</b> xml</this>

    ( "this",
      {"type": "xml"},
      [ "text ",
        ("b", None, ["in"], None),
        " xml"
        ]
       None )

    { 0: "this"
      "type": "xml"
      1: ["text ",
          {0: "b", 1:["in"]},
          " xml"]
    }

Ie, xml tag translates to a tuple:
 (name, dictofattributes, contentlist, miscellaneousinfo)

where miscellaneousinfo can be anything, (but defaults to None)
(with the intention of adding, eg, line number information)

special cases: name of "" means "top level, no containing tag".
Top level parse always looks like this::

    ("", list, None, None)

 contained text of None means <simple_tag/>

In order to support stuff like::

    <this></this><one></one>

AT THE MOMENT &amp; ETCETERA ARE IGNORED. THEY MUST BE PROCESSED
IN A POST-PROCESSING STEP.

PROLOGUES ARE NOT UNDERSTOOD.  OTHER STUFF IS PROBABLY MISSING.
    Nc                     [        U 5        g )N)print)ss    I/var/www/html/env/lib/python3.13/site-packages/reportlab/lib/rparsexml.pywarnCBr   >   s	    a       zstring input)ErrorOnValidityErrorsNoNoDTDWarningExpandCharacterEntitiesExpandGeneralEntitiesr   srcName
ReturnUTF8c                 x    U[         l        [         R                  " U 40 UD6nU=(       a    U=(       d    SS U/S 4$ )N )pyRXP_parsereoCBparse)xmlTextoneOutermostTagr   entityReplacer	parseOptsps         r   parsexmlr   I   s:     w33$1:D!T(::r   c                   $    \ rS rSr\S 5       rSrg)smartDecodeP   c                 d   ^ SS K mU4S jn[        U5      [        R                  l        U" U 5      $ )Nr   c                 |   > [        U [        5      (       a  U $ TR                  U 5      nU R                  US   5      $ )Nencoding)
isinstancestrdetectdecode)r   cddchardets     r   __call__&smartDecode.__call__.<locals>.__call__U   s5    !C  (..#C88C
O,,r   )r&   staticmethodr   	__class__r'   )r   r'   r&   s     @r   r'   smartDecode.__call__Q   s,     		-
 *6h)?&r    N)__name__
__module____qualname____firstlineno__r)   r'   __static_attributes__r,   r   r   r   r   P   s    	 	r   r   r   	<![CDATA[z]]>))z&lt;<)z&gt;>)z&amp;&c                     / nU  H:  nSU;   a   [          H  u  p4UR                  X45      nM     UR                  U5        M<     U$ )Nr5   )replacelistreplaceappend)contentListresulteoldnews        r   unEscapeContentListr?   f   sE    F!8)
IIc' *a	 
 Mr   c                 f    [         (       a  [        S5      e[        XS9u  pEU(       a  US   S   $ U$ )z.official interface: discard unused cursor infoz)pyRXP not found, fallback parser disabled)r      r   )RequirePyRXPImportError	parsexml0)xmltextr   r   r   r;   cursors         r   parsexmlSimplerG   o   s6    |EFF GVay|r   c                 L    [        U S5      R                  5       n[        U5      $ )Nr)openreadr   )filenameraws     r   	parseFilerN   |   s!    
x

"
"
$CC=r   c                    SnSnUcy  U R                  SU5      nUS:  a   U$ US-   nSnU HG  n[        U5      nXXX-    U:X  d  M  SnU R                  SU5      nUS:  a  [        SU-  5      eUS-   nMI     Uc  SnUc  My  U$ )zBskip any prologue found after cursor, return index of rest of text)z!DOCTYPEz?xmlz!--Nr3   r   r	   r4   zcan't close prologue %r)findlen
ValueError)	textrF   prologue_elementsdoneopenbracketpastfoundr<   les	            r   skip_prologuerZ      s     4D
,iiV,q=% M 1}"AQB!1$3-!8$%>%BCC # =D ," Mr   c                 n   [        U 5      n [        nS=n=pgUb  U R                  5       n UnU R                  SU5      n	X	S-   U	S-    n
SnU	S:  aB  Ub#  XS /nU(       a  U" U5      nXFXW4[	        U 5      4$ [        S[        XUS-    5      -  5      e/ nUb  [        =pM[        X5      nGOU	S:  a  [        S[        U SS	 5      -  5      eU
S
:X  ai  X	U	S-    S:X  a^  U	S-   nU R                  [        U5      nUS:  a  [        S[        XUS-    5      -  5      e[        nXU /nU[	        [        5      -   nSnGOU
S:X  as  X	U	S-    S:X  ah  U R                  SU	S-   5      nUU	:  a  [        S[        XUS-    5      -  5      eUS-   nU U   S:w  a  [        S[        XUS-    5      -  5      eSUS-   4$ U R                  SU	5      nUS:  nUS-   nU	S-   nU UU nSU;  a&  US   S:X  a  USS nSnUR                  5       nUnUnGO0SU;   a  SnU(       d%  [	        US-   R                  S5      5      S-  (       a  SnUcT  U R                  SU5      nUS-   nUS:  nU UU nU(       d%  [	        US-   R                  S5      5      S-  (       a  SnUc  MT  U(       a  [        S[        X	U	S-    5      -  5      eUnU US-
     S:X  a  US-
  nUSS nSnUR                  5       nUR                  S5      nUS   nUR                  5       nUS   nUnUS   nUS   S-   US'   0 =nnSn[	        U5      nUU:  Ga  UU   nUS-   nUR                  5       nUS   S:w  a  [        S[        U5      -   5      eSUSS ;  a;  UU:  a  [        S[        U5      -   5      eUU   n US-   nU< SU < 3nSUSS ;  a  M;  UR                  5       nUR                  5       n!U!S   n"US[	        U"5      *  n#U#R                  5       n# U#S   n$U#S   n%U$U%s=:X  a  S:X  d  O  U$U%s=:X  a  S :X  a  O  OU#SS n#U#UU'   U"nUU:  a  GM  Ub  UnUGb  U R                  SU5      n&U&U:  aV  W[        :X  a+  SnXS n'[	        U 5      nU'(       a  UR                  U'5        GOi[        S!U< S"[        XUS-    5      < 35      eU U&S-      S:X  a  U R                  SU&5      n(U(U&:  a  [        S#[        U U&U&S-    5      -  5      eU U&S-   U( n)U)R                  5       n*U*S   n+WU+:w  a}  U SU n,[	        U,R                  S$5      5      n-U SU n,[	        U,R                  S$5      5      n.[        S%U.< S&U-< S'[        U5      < S&[        U+5      < S([        XUS)-    5      < 3
5      eXU& n'U'(       a  UR                  U'5        U(S-   nSnOCXU& n'U'(       a  UR                  U'5        [        U U&SUS*9u  n/nU/(       a  UR                  U/5        Ub  GM  U(       a  U(       a  U" U5      nXFXW4n0U0U4$ !   [        S[        U#UU!45      -   5      e= f)+z{simple recursive descent xml parser...
return (dictionary, endcharacter)
special case: comment returns (None, endcharacter)Nr3   r	      r   zno tags at non-toplevel %s   z.non top level entry should be at start tag: %s
   z![	   r2   zunclosed CDATA %sz!-   z<!--z--zunterminated comment %srA   r4   z*invalid comment: contains double dashes %s=/".zunclosed start tag %sz fz-attribute value must start with double quoteszunclosed value zattvalue,attentry,attlist='zno close bracket for z found after zunclosed close tag %s
z	at lines z...z close tag name doesn't match  d   )
startingattoplevelr   )r   NONAMEstriprP   rQ   rR   reprrZ   CDATAENDMARKERCDATAMARKERsplitr9   rD   )1rE   rj   rk   r   
NameStringContentListAttDict
ExtraStuffrF   firstbracketafterbracket2char
docontentsLname
startcdataendcdataendcommentdashes
endcommentclosebracketnoclosestartsearchpastfirstbracket
tagcontentstoptaglisttaglist0taglist0listattributenameDtaglistindexlasttaglistindexattentrynextattentryattlistnextattnameattvaluefirstlastnextopenbracket	remaindernextclosebracketclosetagcontentsclosetaglist	closenameprefix
endlinenumlinenum	parsetreets1                                                    r   rD   rD      s    '"G J)--K-' --/F<<V,LQ|A~>
 JA~ #&w/0!1L;"[Es7|SS !=WTZ[]T]E^@_!_``
A
  &&J"73F	aMPTU\]`^`UaPbbcc	D	 W,q.%I;%V &aJ||NJ?Hz !4tG6RT9<U7V!VWW$J"x89Kc.11FJ	D	 W,q.%I6%Q&||D,q.A, !:T'QWXZQZB[=\!\]])!+Jz"C' !MPTU\djkmdmUnPo!opp*Q,''
 #<<\:L"1nG&q.K+A~ !1,?J*$b>3& ",CRJ!%J!'')!
$*$D#z#~&<&<S&A"BA"E,'.||C'E&21n".q.%,-=l%K
"c:c>*@*@*E&F&I!"D , $%<tGYefhYhDi?j%jkk$ <>*C/#/>L!+CRJ!%J'--/
$**3/ #1:'~~/ $A!
 ,R 0%bk$.  ! #&w< "#33&|4H#/>L'~~/H{C'()X[_`h[i)ijjXab\1'(88",->h-O"PP'.|'<'3A~.6#E Xab\1  (~~/H&nn.G")"+K'(:#k*:):;H'~~/Hj ((2,T d'C'5$+;+;#+Ab>'/Am$$/M7 ##33: 

 %ll37Ov%<#J ' 0I \F +$QUVZ[bkqrtkt[uVv%wxx*+S0#*<<_#E #O3$%<tGO]lmo]oDp?q%qrr#*?1+<>N#O /557
 )O	?$Wf-F!$V\\$%7!8J$[j1F!&,,t"45G$
DJYg^deh^hNiIj&l m m#?;	HHY')!+!
 $?;	HHY' '0O^b  tB  'C#FHHY'i 
 t )D;	k6Av;Qj()EdHV^_fKgFh)hiis   7
X X4c           	         [        U [        [        45      (       a  U $ U u  pp4U(       d  0 n/ nUR                  5        H(  nX&   nUR	                  U< S[        U5      < 35        M*     SR                  U5      nU(       d  U(       a  [        S5      eUbk  [        [        [        U5      5      n	SR                  U	5      n
U(       d  U
$ U
R                  S5      nSSR                  U5      -   n
SU< SU< SU
< S	U< S
3	$ SU< SU< S3$ )z!pretty printer mainly for testingra   rh   zname missing with attributes???rg   z   z
   r3   z>
z
</r4   z/>)r!   r"   byteskeysr9   rn   joinrR   listmappprettyprintrq   )	parsedxmlrz   attdicttextlistextrar   kv
attributestextlistpprint
textpprintnllists               r   r   r     s    )SK(('0$THBGG\\^J!T!W-.  '"JJ:;;c,9:YY~.
!!$'W\\&12
'+ZTJJ  z**r   c                     SSK J n  SSKJn  U" 5       n[        U SS9n[        SU" 5       U-
  5        US-  (       a  U" U5        US-  (       a"  [        S5        [	        U5      n[        U5        g g )	Nr   time)pprintr	   )r   DONEr`   z============== reformatting)r   r   rG   r   r   )r   dumpr   r   nowr   r   s          r   	testparser     s^    
&Cq+A	&$&*Avq	Av+,Oa r   c                     [        SU S9  g )Na-  <this type="xml">text &lt;&gt;<b>in</b> <funnytag foo="bar"/> xml</this>
                 <!-- comment -->
                 <![CDATA[
                 <this type="xml">text <b>in</b> xml</this> ]]>
                 <tag with="<brackets in values>">just testing brackets feature</tag>
                 r   )r   r   s    r   testr     s     
  r   __main__r   r   z!!!!! no file at {f!r}zparsing z |t|=z	timed at z.2fz secs.)r   )+__doc__rB   simpleparsepyRXPUr   Parserr   r   rC   r   rl   NAMEKEYCONTENTSKEYrp   rQ   LENCDATAMARKERro   r7   r?   rG   rN   verboserZ   rD   r   r   r   r-   sysosr   	reportlabr   seenargvfpathisfiler   rJ   _frK   r   r,   r   r   <module>r      s  5n K==./'(01./!' .%&L +,TTV ;  m	
[!< -.4GZ  H 0 #$a*fP+4  ZaL
&CDXXab\ww~~a  *+aBGGI HQEs1vh/0aQAID  	$&*S)01 ! K  K` s   (E 1EEE
E+	