
    NgW$                         d Z ddlmZ ddlmZ ddlmZmZ ddlmZm	Z	  G d dej
                  Zd Z G d	 d
e          Z G d d          Zd ZdS )a?  
SAX-based adapter to copy trees from/to the Python standard library.

Use the `ElementTreeContentHandler` class to build an ElementTree from
SAX events.

Use the `ElementTreeProducer` class or the `saxify()` function to fire
the SAX events of an ElementTree against a SAX ContentHandler.

See https://lxml.de/sax.html
    )ContentHandler)etree)ElementTree
SubElement)CommentProcessingInstructionc                       e Zd ZdZdS )SaxErrorzGeneral SAX error.
    N)__name__
__module____qualname____doc__     D/var/www/html/ai-engine/env/lib/python3.11/site-packages/lxml/sax.pyr
   r
      s           r   r
   c                 x    | d         dk    r+t          | dd                              dd                    S d | fS )Nr   {   })tuplesplit)tags    r   	_getNsTagr      s=    
1v}}SW]]3**+++Syr   c                       e Zd ZdZddZd Z eeej                  Zd Zd Z	d Z
d	 Zd
 Zd ZddZd Zd ZddZd Zd ZeZdS )ElementTreeContentHandlerz/Build an lxml ElementTree from SAX events.
    Nc                     t          j        |            d | _        g | _        g | _        d | _        d d gi| _        i | _        |t          j	        }|| _
        d S N)r   __init___root_root_siblings_element_stack_default_ns_ns_mapping_new_mappingsr   Element_makeelement)selfmakeelements     r   r   z"ElementTreeContentHandler.__init__%   sd    %%%
  !TF,-K'r   c                 *    t          | j                  S )z=Contains the generated ElementTree after parsing is finished.)r   r   r'   s    r   
_get_etreez$ElementTreeContentHandler._get_etree1   s    4:&&&r   )docc                     d S r   r   )r'   locators     r   setDocumentLocatorz,ElementTreeContentHandler.setDocumentLocator7       r   c                     d S r   r   r*   s    r   startDocumentz'ElementTreeContentHandler.startDocument:   r0   r   c                     d S r   r   r*   s    r   endDocumentz%ElementTreeContentHandler.endDocument=   r0   r   c                     || j         |<   	 | j        |                             |           n# t          $ r |g| j        |<   Y nw xY w|	|| _        d S d S r   )r$   r#   appendKeyErrorr"   )r'   prefixuris      r   startPrefixMappingz,ElementTreeContentHandler.startPrefixMapping@   s}    %(6"	-V$++C0000 	- 	- 	-(+uDV$$$	->"D >s    - AAc                 j    | j         |         }|                                 ||d         | _        d S d S N)r#   popr"   )r'   r8   ns_uri_lists      r   endPrefixMappingz*ElementTreeContentHandler.endPrefixMappingI   s=    &v.>*2D >r   c                 N    |\  }}|rd|z  }n| j         rd| j         d|}n|}|S )N{%s}%sr   r   )r"   )r'   ns_name_tuplens_uri
local_nameel_tags        r   	_buildTagz#ElementTreeContentHandler._buildTagO   sQ    *
 	 -FF 	  	 !%!1!1!1::>FFFr   c                 r   |                      |          }|r`i }	 |                                }n$# t          $ r |                                }Y nw xY w|D ] \  }}|d         rd|z  }	n|d         }	|||	<   !nd }| j        }
| j        d|                     ||| j                  x}| _        | j        r/t          |d          r| j        D ]}|
                    |           | j        d d = nt          |
d         ||| j                  }|
                    |           | j                                         d S )Nr   rB   r   addpreviousr=   )rG   	iteritemsAttributeErroritemsr!   r   r&   r$   r    hasattrrI   r   r6   clear)r'   ns_nameqname
attributesel_nameattrsiter_attributes
name_tuplevalue	attr_nameelement_stackelementsiblings                r   startElementNSz(ElementTreeContentHandler.startElementNSY   s   ..)) 	E5","6"6"8"8! 5 5 5","2"2"4"45 &5 ) )!
Ea= . (: 5II *1I#(i  ) E+:''8JKKLGdj" 1ww'F'F 1#2 1 1G''0000#AAA&& r!2G!&(:< <GW%%%  """""s   0 AAc                     t          ||          }| j        | j                            |           d S | j        d                             |           d S r<   )r   r   r    r6   r!   )r'   targetdatapis       r   processingInstructionz/ElementTreeContentHandler.processingInstructionz   sX    "6400:&&r*****#**2.....r   c                     | j                                         }|                     |          }||j        k    rt	          d|z             d S )NzUnexpected element closed: )r!   r>   rG   r   r
   )r'   rO   rP   rY   rF   s        r   endElementNSz&ElementTreeContentHandler.endElementNS   sP    %))++((W[  86ABBB ! r   c                 x    |rd |                                 D             }|                     d |f||           d S )Nc                     i | ]
\  }}d |f|S r   r   ).0kvs      r   
<dictcomp>z:ElementTreeContentHandler.startElement.<locals>.<dictcomp>   s"    FFF41a4)QFFFr   )rL   r[   )r'   namerQ   s      r   startElementz&ElementTreeContentHandler.startElement   sL     	GFF:3C3C3E3EFFFJT4L$
;;;;;r   c                 6    |                      d |f|           d S r   )rb   )r'   ri   s     r   
endElementz$ElementTreeContentHandler.endElement   s"    4,-----r   c                     | j         d         }	 |d         }|j        pd|z   |_        d S # t          $ r |j        pd|z   |_        Y d S w xY w)Nr=    )r!   tail
IndexErrortext)r'   r^   last_elements      r   
charactersz$ElementTreeContentHandler.characters   sw    *2.	A'+L!-!2!8bD @L 	A 	A 	A!-!2!8bD @L	As   * A	A	r   )r   r   r   r   r   r+   propertyr   r/   r2   r4   r:   r@   rG   r[   r`   rb   rj   rl   rs   ignorableWhitespacer   r   r   r   r   "   s#        
( 
( 
( 
(' ' ' HZZ%7888E      # # #/ / /  # # # #B/ / /C C C< < < <
. . .A A A %r   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )ElementTreeProducerz5Produces SAX events for an element and children.
    c                     	 |                                 }n# t          $ r |}Y nw xY w|| _        || _        ddlm} || _         |i i           | _        d S )Nr   )AttributesNSImpl)getrootrK   _element_content_handlerxml.sax.xmlreaderry   _attr_class_empty_attributes)r'   element_or_treecontent_handlerrY   
attr_classs        r   r   zElementTreeProducer.__init__   s    	&%--//GG 	& 	& 	&%GGG	& /DDDDDD%!+B!3!3s    &&c                    | j                                          | j        }t          |d          rg }|                                }t          |dd           t          u rA|                    |           |                                }t          |dd           t          u A|d d d         D ]}|                     |i            |                     |i            t          |d          rn|	                                }t          |dd           t          u rB|                     |i            |	                                }t          |dd           t          u B| j         
                                 d S )Ngetpreviousr   r=   getnext)r|   r2   r{   rM   r   getattrr   r6   _recursive_saxifyr   r4   )r'   rY   siblingsrZ   s       r   saxifyzElementTreeProducer.saxify   sz   ++----7M** 	4H))++G'5$//3HHH(((!--// '5$//3HHH $DDbD> 4 4&&w3333w+++7I&& 	,oo''G'5$//3HHH&&w333!//++ '5$//3HHH 	))+++++r   c                 p   | j         }|j        }|t          u s	|t          u rI|t          u r |                    |j        |j                   |j        }|r|                    |           d S |j	        }g }||k    rJ|
                                D ]5\  }}	|                    |          |	k    r|                    ||	f           6|
                                }
|
r`i }i }|
D ]B\  }}t          |          }|||<   |                     |d         |d         |d d          ||<   C|                     ||          }n| j        }t          |          \  }	}|                     |	|||j        d          }|D ]\  }}|                    ||           |                    |	|f||           |j        }|r|                    |           |D ]}|                     ||           |                    |	|f|           |D ]\  }}|                    |           |j        }|r|                    |           d S d S )Nr   r   T)preferred_prefixis_attributeF)r   )r|   r   r   r   r`   r]   rq   ro   rs   nsmaprL   getr6   r   _build_qnamer~   r   r8   r:   r[   r   rb   r@   )r'   rY   parent_nsmapr   r   ro   element_nsmapnew_prefixesr8   rD   attribsattr_valuesattr_qnamesattr_ns_namerV   attr_ns_tuplesax_attributesrE   rP   r9   rq   childs                         r   r   z%ElementTreeProducer._recursive_saxify   s   /k'>>S$999+++55NGL2 2 2<D 1**4000FL(("/"5"5"7"7 < <##F++v55 ''&&)9;;;--// 	4KK'. > >#e ), 7 7-2M*-1->->!!$mA&6%) .? .> .>M** "--k;GGNN!3N&s^^
!!Jw~E " S S ( 	< 	<KFC..vs;;;;&&Z %	9 	9 	9| 	-&&t,,, 	9 	9E""5-8888$$fj%95AAA' 	5 	5KFC,,V4444| 	-&&t,,,,,	- 	-r   c                     |S |s|                     |          k    r|}nNfd|                                D             }t          |          dk    r|d         n|rt          |          nd }||S |dz   |z   S )Nc                 *    g | ]\  }}||k    |S r   r   )re   pfxr9   rD   s      r   
<listcomp>z4ElementTreeProducer._build_qname.<locals>.<listcomp>   s2       "c?sf}} '4}}r   r   r   :)r   rL   lenmin)r'   rD   rE   r   r   r   r8   
candidatess    `      r   r   z ElementTreeProducer._build_qname   s    > 			*: ; ;v E E%FF   &+kkmm  J
 "%ZA!5!5
1(2 S___  >|j((r   N)r   r   r   r   r   r   r   r   r   r   r   rw   rw      s[         	4 	4 	4, , ,.4- 4- 4-l) ) ) ) )r   rw   c                 F    t          | |                                          S )zlOne-shot helper to generate SAX events from an XML tree and fire
    them against a SAX ContentHandler.
    )rw   r   )r   r   s     r   r   r     s      @@GGIIIr   N)r   xml.sax.handlerr   lxmlr   
lxml.etreer   r   r   r   	LxmlErrorr
   r   r   rw   r   r   r   r   <module>r      s"  
 
 + * * * * *       . . . . . . . . 5 5 5 5 5 5 5 5    u   
  w% w% w% w% w% w% w% w%tp) p) p) p) p) p) p) p)fJ J J J Jr   