
    ,hW$                         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y)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y)SaxErrorzGeneral SAX error.
    N)__name__
__module____qualname____doc__     J/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/lxml/sax.pyr
   r
      s    r   r
   c                 V    | d   dk(  rt        | dd  j                  dd            S d | fS )Nr   {   })tuplesplit)tags    r   	_getNsTagr      s3    
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y)ElementTreeContentHandlerz/Build an lxml ElementTree from SAX events.
    Nc                     t        j                  |        d | _        g | _        g | _        d | _        d d gi| _        i | _        |t        j                  }|| _
        y N)r   __init___root_root_siblings_element_stack_default_ns_ns_mapping_new_mappingsr   Element_makeelement)selfmakeelements     r   r   z"ElementTreeContentHandler.__init__%   s]    %
  !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                      y r   r   )r'   locators     r   setDocumentLocatorz,ElementTreeContentHandler.setDocumentLocator7       r   c                      y r   r   r*   s    r   startDocumentz'ElementTreeContentHandler.startDocument:   r0   r   c                      y r   r   r*   s    r   endDocumentz%ElementTreeContentHandler.endDocument=   r0   r   c                     || j                   |<   	 | j                  |   j                  |       ||| _        y y # t        $ r |g| j                  |<   Y &w xY wr   )r$   r#   appendKeyErrorr"   )r'   prefixuris      r   startPrefixMappingz,ElementTreeContentHandler.startPrefixMapping@   sg    %(6"	-V$++C0 >"D   	-(+uDV$	-s   : AAc                 \    | j                   |   }|j                          ||d   | _        y y N)r#   popr"   )r'   r8   ns_uri_lists      r   endPrefixMappingz*ElementTreeContentHandler.endPrefixMappingI   s2    &&v.>*2D r   c                 f    |\  }}|rd|z  }|S | j                   rd| j                   d|}|S |}|S )N{%s}%sr   r   )r"   )r'   ns_name_tuplens_uri
local_nameel_tags        r   	_buildTagz#ElementTreeContentHandler._buildTagO   sN    *
-F
 	 !%!1!1:>F   Fr   c                 l   | j                  |      }|r3i }	 |j                         }|D ]  \  }}|d   rd|z  }	n|d   }	|||	<    nd }| j                  }
| j
                  n| j                  ||| j                        x}| _        | j                  r.t        |d      r"| j                  D ]  }|j                  |        | j                  d d = nt        |
d   ||| j                        }|
j                  |       | j                  j                          y # t        $ r |j                         }Y w xY w)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   sE   ..)E5","6"6"8 &5 )!
Ea= (: 5I *1I#(i ) E++::''8J8JKLGdj""ww'F#22 1G''01##A& r!2G!&(:(:<GW%  "3 " 5","2"2"45s   D D32D3c                     t        ||      }| j                  | j                  j                  |       y | j                  d   j                  |       y r<   )r   r   r    r6   r!   )r'   targetdatapis       r   processingInstructionz/ElementTreeContentHandler.processingInstructionz   sE    "640::&&r*#**2.r   c                     | j                   j                         }| j                  |      }||j                  k7  rt	        d|z         y )NzUnexpected element closed: )r!   r>   rG   r   r
   )r'   rO   rP   rY   rF   s        r   endElementNSz&ElementTreeContentHandler.endElementNS   sF    %%))+(W[[ 86ABB !r   c                     |r%|j                         D ci c]
  \  }}d |f| }}}| j                  d |f||       y c c}}w r   )rL   r[   )r'   namerQ   kvs        r   startElementz&ElementTreeContentHandler.startElement   sI    3=3C3C3EF41a4)Q,FJFT4L$
; Gs   >c                 ,    | j                  d |f|       y r   )rb   )r'   rd   s     r   
endElementz$ElementTreeContentHandler.endElement   s    4,-r   c                     | j                   d   }	 |d   }|j                  xs d|z   |_        y # t        $ r |j                  xs d|z   |_        Y y w xY w)Nr=    )r!   tail
IndexErrortext)r'   r^   last_elements      r   
charactersz$ElementTreeContentHandler.characters   sc    **2.	A'+L!-!2!2!8bD @L 	A!-!2!2!8bD @L	As   / !AAr   )r   r   r   r   r   r+   propertyr   r/   r2   r4   r:   r@   rG   r[   r`   rb   rg   ri   rp   ignorableWhitespacer   r   r   r   r   "   sl    
(' ZZ%7%78E#/#B/C<
.A %r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)ElementTreeProducerz5Produces SAX events for an element and children.
    c                     	 |j                         }|| _        || _        ddlm} || _         |i i       | _        y # t        $ r |}Y 7w xY w)Nr   )AttributesNSImpl)getrootrK   _element_content_handlerxml.sax.xmlreaderrv   _attr_class_empty_attributes)r'   element_or_treecontent_handlerrY   
attr_classs        r   r   zElementTreeProducer.__init__   sV    	&%--/G   /D%!+B!3  	&%G	&s   < A
	A
c                 |   | j                   j                          | j                  }t        |d      ryg }|j	                         }t        |dd       t        u r5|j                  |       |j	                         }t        |dd       t        u r5|d d d   D ]  }| j                  |i         | j                  |i        t        |d      rY|j                         }t        |dd       t        u r6| j                  |i        |j                         }t        |dd       t        u r6| j                   j                          y )Ngetpreviousr   r=   getnext)ry   r2   rx   rM   r   getattrr   r6   _recursive_saxifyr   r4   )r'   rY   siblingsrZ   s       r   saxifyzElementTreeProducer.saxify   s!   ++---7M*H))+G'5$/3HH(!--/ '5$/3HH $DbD> 4&&w34 	w+7I&oo'G'5$/3HH&&w3!//+ '5$/3HH 	))+r   c                 >   | j                   }|j                  }|t        u s|t        u rN|t        u r&|j	                  |j
                  |j                         |j                  }|r|j                  |       y |j                  }g }||k7  r@|j                         D ]-  \  }}	|j                  |      |	k7  s|j                  ||	f       / |j                         }
|
rPi }i }|
D ]4  \  }}t        |      }|||<   | j                  |d   |d   |d d      ||<   6 | j                  ||      }n| j                   }t        |      \  }	}| j                  |	|||j"                  d      }|D ]  \  }}|j%                  ||        |j'                  |	|f||       |j                  }|r|j                  |       |D ]  }| j)                  ||        |j+                  |	|f|       |D ]  \  }}|j-                  |        |j                  }|r|j                  |       y y )Nr   r   T)preferred_prefixis_attributeF)r   )ry   r   r   r   r`   r]   rn   rl   rp   nsmaprL   getr6   r   _build_qnamer{   r|   r8   r:   r[   r   rb   r@   )r'   rY   parent_nsmapr~   r   rl   element_nsmapnew_prefixesr8   rD   attribsattr_valuesattr_qnamesattr_ns_namerV   attr_ns_tuplesax_attributesrE   rP   r9   rn   childs                         r   r   z%ElementTreeProducer._recursive_saxify   sO   //kk'>S$99++55NNGLL2<<D**40L("/"5"5"7 <##F+v5 ''&&)9;< --/KK'. >#e ), 7-2M*-1->->!!$mA&6%) .? .>M*> "--k;GN!33N&s^
!!Jw~~E " S ( 	<KFC..vs;	<&&Z %	9||&&t, 	9E""5-8	9$$fj%95A' 	5KFC,,V4	5||&&t, r   c                     ||S |s|j                  |      |k(  r|}nK|j                         D cg c]  \  }}|||k(  r| }	}}t        |	      dk(  r|	d   n|	rt        |	      nd }||S |dz   |z   S c c}}w )Nr   r   :)r   rL   lenmin)
r'   rD   rE   r   r   r   r8   pfxr9   
candidatess
             r   r   z ElementTreeProducer._build_qname   s    >		*: ;v E%F ',kkm"c?sf} J 
 "%ZA!5
1(2S_  >|j((s   A5N)r   r   r   r   r   r   r   r   r   r   r   rt   rt      s    	4,.4-l)r   rt   c                 6    t        | |      j                         S )zlOne-shot helper to generate SAX events from an XML tree and fire
    them against a SAX ContentHandler.
    )rt   r   )r}   r~   s     r   r   r     s     @GGIIr   N)r   xml.sax.handlerr   lxmlr   
lxml.etreer   r   r   r   	LxmlErrorr
   r   r   rt   r   r   r   r   <module>r      sO   
 +  . 5u 
w% w%tp) p)fJr   