
    kfG              	          d Z dZ	 dZddlZd Z ej        ddddedd          Zdddi fdZn# e$ r dZY nw xY w G d d	          Z	 e	            Z	d
Z
dZdZdZ ee          ZdZg dZd ZddefdZereZd ZdZd ZddefdZd ZddZddZedk    r ed           ddlZddlZddlmZ ddlZ e            Z dZ!ej"        dd         D ]Z#ej$        %                    e#          s e&d           ( e'e#          5 Z(e()                                Z*ddd           n# 1 swxY w Y    e&de#d ee*                       ee*d           e!dz  Z!e!r e&d e            e z
  dd           dS dS dS ) 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                 $    t          |            d S )N)print)ss    W/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/reportlab/lib/rparsexml.pywarnCBr   >   s    a       zstring input)ErrorOnValidityErrorsNoNoDTDWarningExpandCharacterEntitiesExpandGeneralEntitiesr   srcName
ReturnUTF8c                 T    |t           _        t          j        | fi |}|r|pdd |gd fS )N )pyRXP_parsereoCBparse)xmlTextoneOutermostTagr   entityReplacer	parseOptsps         r   parsexmlr   I   s=     w3333$1:D!T(::r   c                   $    e Zd Zed             ZdS )smartDecodec                 h    dd l fd}t          |          t          j        _         ||           S )Nr   c                     t          | t                    r| S                     |           }|                     |d                   S )Nencoding)
isinstancestrdetectdecode)r   cddchardets     r   __call__z&smartDecode.__call__.<locals>.__call__U   s>    !C  *(..##C88C
O,,,r   )r%   staticmethodr   	__class__r&   )r   r&   r%   s     @r   r&   zsmartDecode.__call__Q   sJ     		- 	- 	- 	- 	-
 *6h)?)?&r   N)__name__
__module____qualname__r'   r&    r   r   r   r   P   s-        	 	 \	 	 	r   r   r   	<![CDATA[z]]>))z&lt;<)z&gt;>)z&amp;&c                     g }| D ]>}d|v r#t           D ]\  }}|                    ||          }|                    |           ?|S )Nr0   )replacelistreplaceappend)contentListresulteoldnews        r   unEscapeContentListr:   f   sa    F  !88) ( (
cIIc3''aMr   c                 z    t           rt          d          t          | |          \  }}|r|d         d         S |S )z.official interface: discard unused cursor infoz)pyRXP not found, fallback parser disabled)r      r   )RequirePyRXPImportError	parsexml0)xmltextr   r   r   r6   cursors         r   parsexmlSimplerB   o   sL     GEFFF GGGVV ay|r   c                 d    t          | d                                          }t          |          S )Nr)openreadr   )filenameraws     r   	parseFilerI   |   s)    
x


"
"
$
$CC==r   c                    d}d}||                      d|          }|dk     rng|dz   }d}|D ]W}t          |          }| |||z            |k    r5d}|                      d|          }|dk     rt          d|z            |dz   }X|d}||S )zBskip any prologue found after cursor, return index of rest of text)z!DOCTYPEz?xmlz!--Nr.   r   r	   r/   zcan't close prologue %r)findlen
ValueError)	textrA   prologue_elementsdoneopenbracketpastfoundr7   les	            r   skip_prologuerU      s     4D
,iiV,,q==%1}" 	" 	"AQBDbL!1$$3--!88$%>%BCCC=D ," Mr   c                 p   t          |           } t          }dx}x}}||                                 } |}|                     d|          }	| |	dz   |	dz            }
d}|	dk     rY|-| |d         g}|r ||          }||||ft	          |           fS t          dt          | ||dz                      z            g }|t          x}}t          | |          }n|	dk     r't          dt          | dd	                   z            |
d
k    r| |	|	dz            dk    r}|	dz   }|                     t          |          }|dk     r*t          dt          | ||dz                      z            t          }| ||         g}|t	          t                    z   }d}n|
dk    r| |	|	dz            dk    r|                     d|	dz             }||	k     r*t          dt          | ||dz                      z            |dz   }| |         dk    r*t          dt          | ||dz                      z            d|dz   fS |                     d|	          }|dk     }|dz   }|	dz   }| ||         }d|vr2|d         dk    r|dd         }d}|                                }|}|}nd|v rd}|s(t	          |dz   
                    d                    dz  rd}|Y|                     d|          }|dz   }|dk     }| ||         }|s(t	          |dz   
                    d                    dz  rd}|Y|r*t          dt          | |	|	dz                      z            |}| |dz
           dk    r|dz
  }|dd         }d}|                                }|
                    d          }|d         }|
                                }|d         }|}|d         }|d         dz   |d<   i x}}d}t	          |          }||k     ri||         }|dz   }|                                }|d         dk    rt          dt          |          z             d|dd         vrE||k    rt          dt          |          z             ||         } |dz   }|d| }d|dd         vE|                                }|
                                }!|!d         }"|dt	          |"                    }#|#                                }#	 |#d         }$|#d         }%n'#  t          dt          |#||!f          z             xY w|$|%cxk    rdk    sn |$|%cxk    rd k    rn n
|#dd         }#|#||<   |"}||k     i||}|/|                     d|          }&|&|k     rl|t          k    r4d}| |d         }'t	          |           }|'r|                    |'           nt          d!|d"t          | ||dz                                | |&dz            dk    rF|                     d|&          }(|(|&k     r*t          d#t          | |&|&dz                      z            | |&dz   |(         })|)
                                }*|*d         }+||+k    r| d|         },t	          |,
                    d$                    }-| d|         },t	          |,
                    d$                    }.t          d%|.d&|-d't          |          d&t          |+          d(t          | ||d)z                      
          | ||&         }'|'r|                    |'           |(dz   }d}nN| ||&         }'|'r|                    |'           t          | |&d|*          \  }/}|/r|                    |/           |/|r|r ||          }||||f}0|0|fS )+zsimple recursive descent xml parser...
       return (dictionary, endcharacter)
       special case: comment returns (None, endcharacter)Nr.   r	      r   zno tags at non-toplevel %s   z.non top level entry should be at start tag: %s
   z![	   r-   zunclosed CDATA %sz!-   z<!--z--zunterminated comment %sr<   r/   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striprK   rL   rM   reprrU   CDATAENDMARKERCDATAMARKERsplitr4   r?   )1r@   re   rf   r   
NameStringContentListAttDict
ExtraStuffrA   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   r?   r?      s	    '""G J)--K-'J --//F<<V,,LQ|A~ =>
 JA~~ #&vww/0!L1L1L;"G[*Es7||SS !=WVTZ[]T]M]E^@_@_!_```
A
  &&J"7F33FF	aMPTU\]`^`]`UaPbPbbccc	D	 	 W\,q.-H%I;%V%V &aJ||NJ??Hzz !4tGF6RT9DT<U7V7V!VWWW$J":x#789Kc.111FJJ	D	 	 W\,q.-H%I6%Q%Q&||D,q.AA,, !:T'&QWXZQZJZB[=\=\!\]]])!+Jz"C'' !MPTU\]cdjkmdm]mUnPoPo!oppp*Q,''
 #<<\::L"1nG&q.K+A~ !1,!>?J*$$b>3&& ",CRCJ!%J!''))!
$*$$D #z#~&<&<S&A&A"B"BA"E ,'.||C'E'E&21n".q.%,-=l-J%K
" #c:c>*@*@*E*E&F&F&I #!"D ,  l$%<tGLYefhYhLhDi?j?j%jkkk$ <>*C//#/>L!+CRCJ!%J'--//
$**3// #1:'~~// $A!
 ,R 0%bk$.  ! #&w<< "#333&|4H#/>L'~~//H{C''()X[_`h[i[i)ijjjXabb\11'(888",->h-O"P"PP'.|'<'3A~.6hh#E Xabb\11  (~~//H&nn..G")"+K'(:#k*:*:):(:;H'~~//Hj ((2,TTj()EdHV^_fKgFhFh)hiiid''''C''''5$+;+;+;+;+;+;+;+;+;#+AbD>'/Am$$/M7 ##333: 

 %ll377Ov%%<<#J ' 0I \\F  ,+++$*QUQUQUVZ[bcikqrtktct[uVvVvVv%wxxx*+S00#*<<_#E#E #O33$%<tGO]lmo]oLoDp?q?q%qrrr#*?1+<>N+N#O /5577
 )O	??$WfW-F!$V\\$%7%7!8!8J$[j[1F!&,,t"4"455G$*ww


DJJJJYgV\^deh^hVhNiIjIjIj&l m m m#F?$:;	 (HHY''')!+!

 $F?$:;	 (HHY''' '0O^b  tB  'C  'C  'C#F (HHY'''i 
 t  ED)D)D;	Wk:6Av;s   :T $T/c           	      8   t          | t          t          f          r| S | \  }}}}|si }g }|                                D ]1}||         }|                    |dt          |                     2d                    |          }|s|rt          d          |wt          t          t          |                    }	d                    |	          }
|s|
S |
                    d          }dd                    |          z   }
d|d|d	|
d
|d	S d|d|dS )z!pretty printer mainly for testingr\   rc   zname missing with attributes???Nrb   z   z
   r.   z>
z
</r/   z/>)r    r!   byteskeysr4   ri   joinrM   listmappprettyprintrl   )	parsedxmlru   attdicttextlistextrar   kv
attributestextlistpprint
textpprintnllists               r   r   r     sP   )SK(( '0$T7HeBGG\\^^ / /AJ!!!T!WWW-....'""J <J <:;;;c,99::YY~..
 	!!$''W\\&112

'+ttZZZTTTJJ  zzz**r   c                    ddl m } ddlm}  |            }t          | d          }t          d |            |z
             |dz  r ||           |dz  r/t          d           t	          |          }t          |           d S d S )	Nr   time)pprintr	   )r   DONEr[   z============== reformatting)r   r   rB   r   r   )r   dumpr   r   nowr   r   s          r   	testparser     s    
$&&Cq+++A	&$$&&*Av q			Av +,,,OOa r   c                 (    t          d|            d S )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__r=   simpleparsepyRXPUr   Parserr   r   r>   r   rg   NAMEKEYCONTENTSKEYrk   rL   LENCDATAMARKERrj   r2   r:   rB   rI   verboserU   r?   r   r   r   r)   sysosr   	reportlabr   seenargvfpathisfiler   rE   _frF   r   r,   r   r   <module>r      sq  5 5n KMMM   6=./'(01./!' .%&  L +,TTV ; ; ; ; ;    KKK        kmm	
[!!<<<   -.4GZ      H     0 #$a*f f f fP+ + +4           ZDaLLLLNNNNNNN
$&&CDXabb\  w~~a   	E*++++a BGGII              E/Q//ss1vv//000IaQAIDD 20$$&&*000011111#  2 2s   (/ 99D''D+	.D+	