a
    ¦¾deöG  ã                	   @   sê  d Z dZzBd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y`   dZY n0 G d
d„ dƒZ	e	ƒ Z	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rºeZdd„ ZdZdd„ Zddefdd„Zdd„ Zd)dd„Zd*dd„Zed k�ræed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#¡�sfe&d#ƒ n^e'e#ƒ�Z(e( )¡ Z*W d  ƒ n1 �sŽ0    Y  e&d$e#›d%ee*ƒ› �ƒ ee*dd!� e!d7 Z!�qJe!�ræe&d&eƒ e  d'›d(�ƒ 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   úP/var/www/sistema_ama/venv/lib/python3.9/site-packages/reportlab/lib/rparsexml.pyÚwarnCB>   s    r   é   zstring input)ZErrorOnValidityErrorsZNoNoDTDWarningZExpandCharacterEntitiesZExpandGeneralEntitiesr   ZsrcNameZ
ReturnUTF8c                 C   s.   |t _t j| fi |¤Ž}|r |p,dd |gd fS )NÚ )ÚpyRXP_parserÚeoCBÚparse)ZxmlTextÚoneOutermostTagr
   ÚentityReplacerZ	parseOptsÚpr   r   r   ÚparsexmlI   s    r   c                   @   s   e Zd Zedd„ ƒZdS )ÚsmartDecodec                    s0   t dƒ dd l‰ ‡ fdd„}t|ƒtj_|| ƒS )NÚinitialr   c                    s.   t | tƒr| S ˆ  | ¡}tdƒ |  |d ¡S )NÚfinalÚencoding)Ú
isinstanceÚstrÚdetectr   Údecode)r   Zcdd©Úchardetr   r   Ú__call__U   s    
z&smartDecode.__call__.<locals>.__call__)r   r   Ústaticmethodr   Ú	__class__r   )r   r   r   r   r   r   Q   s
    zsmartDecode.__call__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   P   s   r   r   ú	<![CDATA[z]]>))z&lt;ú<)z&gt;ú>)z&amp;ú&c                 C   s>   g }| D ]0}d|v r.t D ]\}}| ||¡}q| |¡ q|S )Nr#   )ÚreplacelistÚreplaceÚappend)ZcontentListÚresultÚeÚoldÚnewr   r   r   ÚunEscapeContentListf   s    r+   c                 C   s4   t rtdƒ‚t| |d�\}}|r,|d d S |S dS )z.official interface: discard unused cursor infoz)pyRXP not found, fallback parser disabled)r   é   r   N)ÚRequirePyRXPÚImportErrorÚ	parsexml0)Úxmltextr   r
   r   r'   Úcursorr   r   r   ÚparsexmlSimpleo   s    r2   c                 C   s   t | dƒ ¡ }t|ƒS )NÚr)ÚopenÚreadr   )ÚfilenameÚrawr   r   r   Ú	parseFile|   s    r8   c           	      C   s–   d}d}|du r’|   d|¡}|dk r&q’|d }d}|D ]L}t|ƒ}| ||| … |kr6d}|   d|¡}|dk rztd| ƒ‚|d }q6|du rd}q|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)	Útextr1   Zprologue_elementsÚdoneZopenbracketZpastÚfoundr(   Úler   r   r   Úskip_prologue‚   s$    

r@   c           1      C   sÖ  t | ƒ} t}d } }}|dur(|  ¡ } |}|  d|¡}	| |	d |	d … }
d}|	dk rª|durŽ| |d… g}|rz||ƒ}||||ft| ƒfS tdt| ||d … ƒ ƒ‚g }|durÌt }}t| |ƒ}�n|	dk rðtdt| dd	… ƒ ƒ‚�nú|
d
k�rp| |	|	d … dk�rp|	d }|  t|¡}|dk �rJtdt| ||d … ƒ ƒ‚t	}| ||… g}|ttƒ }d}�nz|
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�rp|d dk�r\|dd… }d}| ¡ }|}|}�nzd|v �rød}|�sœt|d  
d¡ƒd �r d}|du �rø|  d|¡}|d }|dk }| ||… }|�sðt|d  
d¡ƒd �r d}�q |�rtdt| |	|	d … ƒ ƒ‚|}| |d  dk�rH|d }|dd… }d}| ¡ }| 
d¡}|d }| 
¡ }|d }|}|d }|d d |d< i  }}d}t|ƒ}||k �rê|| }|d }| ¡ }|d dk�râtdt|ƒ ƒ‚d|dd… v�r.||k�rtdt|ƒ ƒ‚|| } |d }d|| f }�qâ| ¡ }| 
¡ }!|!d }"|dt|"ƒ … }#|# ¡ }#z|#d }$|#d }%W n"   td t|#||!fƒ ƒ‚Y n0 |$|%  k�r°dk�sÎn |$|%  k�rÊd!k�rÚn n|#dd… }#|#||< |"}�q¢|du�rø|}|du�r®|  d|¡}&|&|k �rp|tk�rLd}| |d… }'t| ƒ}|'�rl| |'¡ n td"|t| ||d … ƒf ƒ‚�qø| |&d  dk�rj|  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'�\}/}|/�rø| |/¡ �qø|�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   )r   ÚNONAMEÚstripr9   r:   r;   Úreprr@   ÚCDATAENDMARKERÚCDATAMARKERÚsplitr&   r/   )1r0   rO   rP   r   Z
NameStringZContentListZAttDictZ
ExtraStuffr1   ZfirstbracketZafterbracket2charZ
docontentsÚLÚnameZ
startcdataZendcdataZendcommentdashesZ
endcommentZclosebracketZnocloseZstartsearchZpastfirstbracketZ
tagcontentÚstopZtaglistZtaglist0Ztaglist0listÚattributenameÚDZtaglistindexZlasttaglistindexZattentryZnextattentryÚattlistZnextattnameZattvalueÚfirstÚlastZnextopenbracketÚ	remainderZnextclosebracketZclosetagcontentsZclosetaglistZ	closenameÚprefixZ
endlinenumÚlinenumZ	parsetreeÚtr   r   r   r/   š   s$   	 
 






6



$

"ÿ

r/   c                 C   sÌ   t | ttfƒr| S | \}}}}|s&i }g }| ¡ D ]"}|| }| d|t|ƒf ¡ q2d |¡}|sp|rptdƒ‚|durÀtt	t
|ƒƒ}	d |	¡}
|s˜|
S |
 d¡}dd |¡ }
d|||
|f S d	||f S )
z!pretty printer mainly for testingrK   ú zname missing with attributes???NrM   z   z
   z<%s %s>
%s
</%s>z<%s %s/>)r   r   ÚbytesÚkeysr&   rS   Újoinr;   ÚlistÚmapÚpprettyprintrV   )Z	parsedxmlrX   ZattdictZtextlistÚextrar\   ÚkÚvÚ
attributesZtextlistpprintZ
textpprintZnllistr   r   r   ri   ‚  s(    


ri   c                 C   st   ddl m } ddlm} |ƒ }tƒ  t| dd�}td|ƒ | ƒ |d@ rP||ƒ |d@ rptdƒ t|ƒ}t|ƒ d S )	Nr   ©Útime)Úpprintr   )r   ZDONErE   z============== reformatting)ro   rp   Ú
breakpointr2   r   ri   )r   Údumpro   rp   Únowr[   r   r   r   r   Ú	testparseœ  s    rt   c                 C   s   t d| 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>
                 ©rr   )rt   ru   r   r   r   Útest«  s    ûrv   Ú__main__ru   rn   z!!!!! no file at {f!r}zparsing z |t|=z	timed at z.2fz secs.)r   )r   )+Ú__doc__r-   ZsimpleparseZpyRXPUr   ÚParserr	   r   r.   r   rQ   ZNAMEKEYZCONTENTSKEYrU   r:   ZLENCDATAMARKERrT   r$   r+   r2   r8   Úverboser@   r/   ri   rt   rv   r   ÚsysÚosro   Z	reportlabrs   ÚseenÚargvÚfÚpathÚisfiler   r4   Ú_fr5   rb   r   r   r   r   Ú<module>   sr   7ù	
	
þ
 i





(