o
    Ë53S˜E  ã                	   @   sX  d Z dZz!dZddlZdd„ Zejddddeddd�Zdddi fdd	„ZW n ey0   dZY nw d
Z	dZ
dZdZeeƒZdZg d¢Zdd„ Zddefdd„ZerSeZdd„ ZdZdd„ Zddefdd„ZddlZdd„ ZdZdd„ Zdd„ ZdgZdZedkrªeƒ  dd lmZ eƒ ZeD ]Z e!e ƒ "¡ Z#e$d!e ƒ ee#ƒ qŽe$d"eƒ e ƒ 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                 C   s   t | ƒ d S )N)Úprint)Ús© r   úI/var/www/html/env/lib/python3.10/site-packages/reportlab/lib/rparsexml.pyÚwarnCB>   ó   r   é   zstring input)ÚErrorOnValidityErrorsÚNoNoDTDWarningÚExpandCharacterEntitiesÚExpandGeneralEntitiesr   ÚsrcNameÚ
ReturnUTF8c                 C   s.   |t _t j| fi |¤Ž}|r|pdd |gd fS )NÚ )ÚpyRXP_parserÚeoCBÚparse)ÚxmlTextÚoneOutermostTagr   ÚentityReplacerÚ	parseOptsÚpr   r   r   ÚparsexmlI   s   r   r   ú	<![CDATA[z]]>))z&lt;ú<)z&gt;ú>)z&amp;ú&c                 C   s>   g }| D ]}d|v rt D ]
\}}| ||¡}q| |¡ q|S )Nr   )ÚreplacelistÚreplaceÚappend)ÚcontentListÚresultÚeÚoldÚnewr   r   r   ÚunEscapeContentListX   s   r%   c                 C   s0   t rtdƒ‚t| |d�\}}|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   r!   Úcursorr   r   r   ÚparsexmlSimplea   s   r,   c                 C   s   t | dƒ ¡ }t|ƒS )NÚr)ÚopenÚreadr   )ÚfilenameÚrawr   r   r   Ú	parseFilen   s   r2   c           	      C   sž   d}d}|du rM|   d|¡}|dk r|S |d }d}|D ]&}t|ƒ}| ||| … |krBd}|   d|¡}|dk r>td| ƒ‚|d }q|du rId}|du s|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)	Útextr+   Úprologue_elementsÚdoneÚopenbracketÚpastÚfoundr"   Úler   r   r   Úskip_prologuet   s*   ó€ñr=   c           1      C   sÒ  t }d } }}|dur|  ¡ } |}|  d|¡}	| |	d |	d … }
d}|	dk rQ|durC| |d… g}|r9||ƒ}||||ft| ƒfS tdt| ||d … ƒ ƒ‚g }|durbt  }}t| |ƒ}�n|	dk rrtdt| dd	… ƒ ƒ‚|
d
kr¯| |	|	d … dkr¯|	d }|  t|¡}|dk rœtdt| ||d … ƒ ƒ‚t}| ||… g}|ttƒ }d}�nÃ|
dkrõ| |	|	d … dkrõ|  d|	d ¡}||	k r×tdt| ||d … ƒ ƒ‚|d }| | dkrïtdt| ||d … ƒ ƒ‚d|d fS |  d|	¡}|dk }|d }|	d }| ||… }d|v�r+|d dk�r!|dd… }d}| ¡ }|}|}�nGd|v �rrd}|�sAt|d  	d¡ƒd �rCd}|du �rr|  d|¡}|d }|dk }| ||… }|�skt|d  	d¡ƒd �rmd}|du �sH|�rƒtdt| |	|	d … ƒ ƒ‚|}| |d  dk�rš|d }|dd… }d}| ¡ }| 	d¡}|d }| 	¡ }|d }|}|d }|d d |d< i  }}d}t|ƒ}||k �rr|| }|d }| ¡ }|d dk�rçtdt|ƒ ƒ‚d|dd… v�r||k�rýtdt|ƒ ƒ‚|| } |d }d|| f }d|dd… v�sð| ¡ }| 	¡ }!|!d }"|dt|"ƒ … }#|# ¡ }#z
|#d }$|#d }%W n   td t|#||!fƒ ƒ‚|$|%  k�rRdk�san |$|%  k�r_d!k�rgn n|#dd… }#|#||< |"}||k �sÌ|du�ry|}|du�rU|  d|¡}&|&|k �r³|t k�r£d}| |d… }'t| ƒ}|'�r¢| 
|'¡ n­td"|t| ||d … ƒf ƒ‚| |&d  dk�r0|  d|&¡}(|(|&k �rÕtd#t| |&|&d … ƒ ƒ‚| |&d |(… })|) 	¡ }*|*d }+||+k�r| d|… },t|, 	d$¡ƒ}-| d|… },t|, 	d$¡ƒ}.td%|.|-t|ƒt|+ƒt| ||d& … ƒf ƒ‚| ||&… }'|'�r)| 
|'¡ |(d }d}n | ||&… }'|'�r>| 
|'¡ t| |&d|d'�\}/}|/�rP| 
|/¡ |du�s~|�r_|�r_||ƒ}||||f}0|0|fS )(z‰simple 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 ú%s=%szattvalue,attentry,attlist=ú'z&no close bracket for %s found after %szunclosed close tag %sÚ
z8at lines %s...%s close tag name doesn't match %s...%s %séd   )Ú
startingatÚtoplevelr   )ÚNONAMEÚstripr3   r4   r5   Úreprr=   ÚCDATAENDMARKERÚCDATAMARKERÚsplitr   r)   )1r*   rL   rM   r   Ú
NameStringÚContentListÚAttDictÚ
ExtraStuffr+   Ú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Útr   r   r   r)   Œ   s,  



ù


ú6
å




€ 

"ÿ



Ì:r)   c                 C   sÎ   t }t| ƒ|u r
| S | \}}}}|si }g }| ¡ D ]}|| }| d|t|ƒf ¡ qd |¡}	|s9|	r9tdƒ‚|durattt	|ƒƒ}
d |
¡}|sM|S | 
d¡}dd |¡ }d||	||f S d	||	f S )
z!pretty printer mainly for testingrH   ú zname missing with attributes???NrJ   z   z
   z<%s %s>
%s
</%s>z<%s %s/>)ÚbytesÚtypeÚkeysr   rP   Újoinr5   ÚlistÚmapÚpprettyprintrS   )Ú	parsedxmlÚstr\   ÚattdictÚtextlistÚextrarp   ÚkÚvÚ
attributesÚtextlistpprintÚ
textpprintÚnllistr   r   r   r‡   t  s*   


r‡   c                 C   sn   ddl m } ddlm} |ƒ }t| ƒ}td|ƒ | ƒ td@ r#||ƒ td@ r5tdƒ t|ƒ}t|ƒ d S d S )Nr   ©Útime)ÚpprintÚDONErB   r   z============== reformatting)r”   r•   r,   r   Údumpr‡   )r   r”   r•   Únowrk   r   r   r   r   Ú	testparse�  s   ýr™   c                   C   s   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   r   r   Útestž  r   rš   zsamples/hamlet.xmlÚ__main__r“   ÚparsingÚelapsed)%Ú__doc__r'   ÚsimpleparseÚpyRXPUr   ÚParserr   r   r(   rN   ÚNAMEKEYÚCONTENTSKEYrR   r4   ÚLENCDATAMARKERrQ   r   r%   r,   r2   Úverboser=   r)   Útypesr‡   r—   r™   rš   Ú	filenamesÚ__name__r”   r˜   Úfr.   r/   r   r   r   r   r   r   Ú<module>   sn    7ù	ÿ	

þ h	ÿ

ø