o
    à’Oj‚C  ã                	   @   sŽ  d Z dZ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r0e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¡s„e dƒ qwe!eƒ�Z"e" #¡ Z$W d  ƒ n1 s—w   Y  e de›dee$ƒ› �ƒ ee$dd� ed7 ZqwerÅe d eƒ e d!›d"�ƒ dS dS dS )$aÛ  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.

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.
é   c                   @   s   e Zd Zedd„ ƒZdS )ÚsmartDecodec                    s,   ddl m‰  ‡ fdd„}t|ƒtj_|| ƒS )Né    ©Údetectc                    s$   t | tƒr| S ˆ | ƒ}|  |d ¡S )NÚencoding)Ú
isinstanceÚstrÚdecode)ÚsÚcddr   © ú]/var/www/html/pharmsmart-cdr-gen/venv/lib/python3.10/site-packages/reportlab/lib/rparsexml.pyÚ__call__:   s   z&smartDecode.__call__.<locals>.__call__)Úcharset_normalizerr   Ústaticmethodr   Ú	__class__r   )r
   r   r   r   r   r   7   s   zsmartDecode.__call__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   6   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   ÚunEscapeContentListJ   s   r"   Nc                 C   s$   t | |d�\}}|r|d d S |S )z.official interface: discard unused cursor info)ÚentityReplaceré   r   )Ú	parsexml0)ÚxmltextÚoneOutermostTagÚeoCBr#   r   Úcursorr   r   r   ÚparsexmlSimpleS   s   r*   c                 C   s   t | dƒ ¡ }t|ƒS )NÚr)ÚopenÚreadÚparsexml)ÚfilenameÚrawr   r   r   Ú	parseFile^   s   r1   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_prologued   s*   ó€ñr<   c           1      C   sÚ  t | ƒ} t}d } }}|dur|  ¡ } |}|  d|¡}	| |	d |	d … }
d}|	dk rU|durG| |d… g}|r=||ƒ}||||ft| ƒfS tdt| ||d … ƒ ƒ‚g }|durft }}t| |ƒ}�n|	dk rvt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 �rvd}|�sEt|d  
d¡ƒd �rGd}|du �rv|  d|¡}|d }|dk }| ||… }|�sot|d  
d¡ƒd �rqd}|du �sL|�r‡tdt| |	|	d … ƒ ƒ‚|}| |d  dk�rž|d }|dd… }d}| ¡ }| 
d¡}|d }| 
¡ }|d }|}|d }|d d |d< i  }}d}t|ƒ}||k �rv|| }|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�rVdk�sen |$|%  k�rcd!k�rkn n|#dd… }#|#||< |"}||k �sÐ|du�r}|}|du�rY|  d|¡}&|&|k �r·|tk�r§d}| |d… }'t| ƒ}|'�r¦| |'¡ n­td"|t| ||d … ƒf ƒ‚| |&d  dk�r4|  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 | ||&… }'|'�rB| |'¡ t| |&d|d'�\}/}|/�rT| |/¡ |du�s‚|�rc|�rc||ƒ}||||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Ústripr2   r3   r4   Úreprr<   ÚCDATAENDMARKERÚCDATAMARKERÚsplitr   r%   )1r&   rK   rL   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tfƒr	| S | \}}}}|si }g }| ¡ D ]}|| }| d|t|ƒf ¡ qd |¡}|s8|r8tdƒ‚|dur`tt	t
|ƒƒ}	d |	¡}
|sL|
S |
 d¡}dd |¡ }
d|||
|f S d	||f S )
z!pretty printer mainly for testingrG   ú zname missing with attributes???NrI   z   z
   z<%s %s>
%s
</%s>z<%s %s/>)r   r   ÚbytesÚkeysr   rO   Újoinr4   ÚlistÚmapÚpprettyprintrR   )Ú	parsedxmlr[   ÚattdictÚtextlistÚextraro   ÚkÚvÚ
attributesÚtextlistpprintÚ
textpprintÚnllistr   r   r   r…   d  s(   


r…   c                 C   sr   ddl m } ddlm} |ƒ }t| dd�}td|ƒ | ƒ |d@ r%||ƒ |d@ r7tdƒ t|ƒ}t|ƒ d S d S )	Nr   ©Útime)Úpprintr   )r'   ÚDONErA   z============== reformatting)r‘   r’   r*   Úprintr…   )r
   Údumpr‘   r’   Únowrj   Úpr   r   r   Ú	testparse~  s   ýr˜   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>
                 ©r•   )r˜   r™   r   r   r   ÚtestŒ  s   
ûrš   Ú__main__r™   r�   z!!!!! no file at {f!r}zparsing z |t|=z	timed at z.2fz secs.)r   )%Ú__doc__Úsimpleparser   rM   ÚNAMEKEYÚCONTENTSKEYrQ   r3   ÚLENCDATAMARKERrP   r   r"   r*   r.   r1   Úverboser<   r%   r…   r˜   rš   r   ÚsysÚosr‘   Ú	reportlabr–   ÚseenÚargvÚfÚpathÚisfiler”   r,   Ú_fr-   r~   r   r   r   r   Ú<module>   sZ    3
	
þ i





ÿ
ï