
    gi%                         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	 	 ddl
mZ n# e$ r d ZY nw xY w 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ProcessingInstruction)GenericAliasc                 &    | j          d|j          dS )N[])__name__clsitems     `/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/lxml/sax.py_GenericAliasr      s    ,111111    c                       e Zd ZdZdS )SaxErrorzGeneral SAX error.
    N)r   
__module____qualname____doc__ r   r   r   r      s           r   r   c                     | d         dk    r/d| v r+t          | dd                              dd                    S d | fS )Nr   {}   )tuplesplit)tags    r   	_getNsTagr!       sE    
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 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_etree6   s    4:&&&r   )docc                     d S r%   r   )r/   locators     r   setDocumentLocatorz,ElementTreeContentHandler.setDocumentLocator<       r   c                     d S r%   r   r2   s    r   startDocumentz'ElementTreeContentHandler.startDocument?   r8   r   c                     d S r%   r   r2   s    r   endDocumentz%ElementTreeContentHandler.endDocumentB   r8   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.startPrefixMappingE   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/   r@   ns_uri_lists      r   endPrefixMappingz*ElementTreeContentHandler.endPrefixMappingN   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._buildTagT   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   rJ   r   addpreviousrE   )rO   	iteritemsAttributeErroritemsr)   r'   r.   r,   r(   hasattrrQ   r   r>   clear)r/   ns_nameqname
attributesel_nameattrsiter_attributes
name_tuplevalue	attr_nameelement_stackelementsiblings                r   startElementNSz(ElementTreeContentHandler.startElementNS^   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 rD   )r   r'   r(   r>   r)   )r/   targetdatapis       r   processingInstructionz/ElementTreeContentHandler.processingInstruction   sX    "6400:&&r*****#**2.....r   c                     | j                                         }|                     |          }||j        k    rt	          d|z             d S )NzUnexpected element closed: )r)   rF   rO   r    r   )r/   rW   rX   ra   rN   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   )rT   rc   )r/   namerY   s      r   startElementz&ElementTreeContentHandler.startElement   sL     	GFF:3C3C3E3EFFFJT4L$
;;;;;r   c                 6    |                      d |f|           d S r%   )rj   )r/   rq   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)NrE    )r)   tail
IndexErrortext)r/   rf   last_elements      r   
charactersz$ElementTreeContentHandler.characters   s{    *2.	A'+L
 ".!2!8bD @L	  	A 	A 	A!-!2!8bD @L	As   * A	A	c                 "    t          | |          S r%   )r   r   s     r   __class_getitem__z+ElementTreeContentHandler.__class_getitem__   s    S$'''r   r%   )r   r   r   r   r&   r3   propertyr   r7   r:   r<   rB   rH   rO   rc   rh   rj   rr   rt   r{   ignorableWhitespacer}   r   r   r   r#   r#   '   s6        
( 
( 
( 
(' ' ' 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)getrootrS   _element_content_handlerxml.sax.xmlreaderr   _attr_class_empty_attributes)r/   element_or_treecontent_handlerra   
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    rE   getnext)r   r:   r   rU   r   getattrr   r>   _recursive_saxifyr   r<   )r/   ra   siblingsrb   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   rh   re   ry   rw   r{   nsmaprT   getr>   r!   _build_qnamer   r   r@   rB   rc   r   rj   rH   )r/   ra   parent_nsmapr   r    rw   element_nsmapnew_prefixesr@   rL   attribsattr_valuesattr_qnamesattr_ns_namer^   attr_ns_tuplesax_attributesrM   rX   rA   ry   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   )rm   pfxrA   rL   s      r   
<listcomp>z4ElementTreeProducer._build_qname.<locals>.<listcomp>	  s2       "c?sf}} '4}}r   r   r   :)r   rT   lenmin)r/   rL   rM   r   r   r   r@   
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   r   r      s[         	4 	4 	4, , ,.4- 4- 4-l) ) ) ) )r   r   c                 F    t          | |                                          S )zlOne-shot helper to generate SAX events from an XML tree and fire
    them against a SAX ContentHandler.
    )r   r   )r   r   s     r   r   r     s      @@GGIIIr   N)r   xml.sax.handlerr   lxmlr   
lxml.etreer   r   r   r   typesr	   r   ImportError	LxmlErrorr   r!   r#   r   r   r   r   r   <module>r      sp  
 
 + * * * * *       . . . . . . . . 5 5 5 5 5 5 5 523333333 2 2 22 2 2 2 22    u   
  |( |( |( |( |( |( |( |(~p) p) p) p) p) p) p) p)fJ J J J Js   ' 22