U Dx`$@sdZddlmZddlmZddlmZddlmZm Z ddlm Z m Z Gdddej Z d d ZGd d d eZGd ddeZddZdS)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 )absolute_import)ContentHandler)etree) ElementTree SubElement)CommentProcessingInstructionc@seZdZdZdS)SaxErrorzGeneral SAX error. N)__name__ __module__ __qualname____doc__rr//tmp/pip-target-zr53vnty/lib/python/lxml/sax.pyr sr cCs0|ddkr$t|ddddSd|fSdS)Nr{})tuplesplit)tagrrr _getNsTags rc@seZdZdZd ddZddZeeejdZdd Zd d Z d d Z ddZ ddZ ddZ d!ddZddZddZd"ddZddZddZeZdS)#ElementTreeContentHandlerz/Build an lxml ElementTree from SAX events. NcCsLt|d|_g|_g|_d|_ddgi|_i|_|dkrBtj }||_ dSN) r__init___root_root_siblings_element_stack _default_ns _ns_mapping _new_mappingsrElement _makeelement)self makeelementrrrr&s  z"ElementTreeContentHandler.__init__cCs t|jS)z=Contains the generated ElementTree after parsing is finished.)rrr"rrr _get_etree2sz$ElementTreeContentHandler._get_etree)doccCsdSrr)r"locatorrrrsetDocumentLocator8sz,ElementTreeContentHandler.setDocumentLocatorcCsdSrrr$rrr startDocument;sz'ElementTreeContentHandler.startDocumentcCsdSrrr$rrr endDocument>sz%ElementTreeContentHandler.endDocumentcCsR||j|<z|j||Wn tk r>|g|j|<YnX|dkrN||_dSr)rrappendKeyErrorr)r"prefixurirrrstartPrefixMappingAs z,ElementTreeContentHandler.startPrefixMappingcCs(|j|}||dkr$|d|_dSN)rpopr)r"r-Z ns_uri_listrrrendPrefixMappingJs z*ElementTreeContentHandler.endPrefixMappingcCs4|\}}|rd|}n|jr,d|j|f}n|}|S)N{%s}%s)r)r"Z ns_name_tuplens_uri local_nameel_tagrrr _buildTagPs z#ElementTreeContentHandler._buildTagc Cs||}|rni}z |}Wntk r:|}YnX|D]*\}}|drZd|} n|d} ||| <q@nd}|j} |jdkr||||j} |_|jrt | dr|jD]} | | q|jdd=nt | d|||j} | | |j dS)Nrr4r addpreviousr1)r8 iteritemsAttributeErroritemsrrr!rrhasattrr9rr+clear) r"ns_nameqname attributesZel_nameattrsZiter_attributesZ name_tuplevalue attr_nameZ element_stackelementsiblingrrrstartElementNSZs6          z(ElementTreeContentHandler.startElementNScCs6t||}|jdkr"|j|n|jd|dSr0)rrrr+r)r"targetdatapirrrprocessingInstruction{s  z/ElementTreeContentHandler.processingInstructioncCs.|j}||}||jkr*td|dS)NzUnexpected element closed: )rr2r8rr )r"r?r@rEr7rrr endElementNSs   z&ElementTreeContentHandler.endElementNScCs0|rtdd|D}|d|f||dS)NcSsg|]\}}d|f|fqSrr).0kvrrr sz:ElementTreeContentHandler.startElement..)dictr<rG)r"namerArrr startElements z&ElementTreeContentHandler.startElementcCs|d|f|dSr)rL)r"rRrrr endElementsz$ElementTreeContentHandler.endElementcCsP|jd}z|d}|jpd||_Wn$tk rJ|jp>d||_YnXdS)Nr1)rtail IndexErrortext)r"rIZ last_elementrrr characterss  z$ElementTreeContentHandler.characters)N)N)N)r r r r rr%propertyrr(r)r*r/r3r8rGrKrLrSrTrYignorableWhitespacerrrrr#s"   !  rc@s0eZdZdZddZddZddZdd Zd S) ElementTreeProducerz5Produces SAX events for an element and children. cCsTz |}Wntk r$|}YnX||_||_ddlm}||_|ii|_dS)Nr)AttributesNSImpl)getrootr;_element_content_handlerZxml.sax.xmlreaderr] _attr_class_empty_attributes)r"element_or_treecontent_handlerrEZ attr_classrrrrs   zElementTreeProducer.__init__cCs|j|j}t|drjg}|}t|ddtkrJ|||}q&|dddD]}||iqX||it|dr| }t|ddtkr||i| }q|j dS)N getpreviousrr1getnext) r`r)r_r=regetattrrr+_recursive_saxifyrfr*)r"rEZsiblingsrFrrrsaxifys"        zElementTreeProducer.saxifycCs|j}|j}|tks|tkrL|tkr4||j|j|j}|rH||dS|j }g}||kr| D]$\}} | || krf| || fqf| } | ri} i} | D]8\} }t | }|| |<|j|d|d|ddd| |<q|| | }n|j}t |\} }|j| |||jdd}|D]\}}|||q|| |f|||j}|rX|||D]}|||q\|| |f||D]\}}||q|j}|r||dS)NrrT)preferred_prefix is_attributeF)rk)r`rrrrKrHrXrVrYnsmapr<getr+r _build_qnamerarbr-r/rGrhrLr3)r"rEZ parent_nsmaprdrrVZ element_nsmapZ new_prefixesr-r5ZattribsZ attr_valuesZ attr_qnamesZ attr_ns_namerCZ attr_ns_tupleZsax_attributesr6r@r.rXchildrrrrhsx       z%ElementTreeProducer._recursive_saxifycsvdkr |S|s$||kr$|}n:fdd|D}t|dkrN|dn|rZt|nd}|dkrj|S|d|S)Ncs$g|]\}}|dk r|kr|qSrr)rMpfxr.r5rrrPsz4ElementTreeProducer._build_qname..rr:)rmr<lenmin)r"r5r6rlrjrkr- candidatesrrqrrns  z ElementTreeProducer._build_qnameN)r r r r rrirhrnrrrrr\s  6r\cCst||S)zlOne-shot helper to generate SAX events from an XML tree and fire them against a SAX ContentHandler. )r\ri)rcrdrrrrisriN)r __future__rZxml.sax.handlerrlxmlrZ lxml.etreerrrrZ LxmlErrorr rrobjectr\rirrrrs   |s