B |/\$@sdZddlmZddlmZddlmZddlmZm Z ddlm Z m Z Gdddej Z d d ZGd d d eZGd ddeZddZdS)aI 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 http://codespeak.net/lxml/sax.html )absolute_import)ContentHandler)etree) ElementTree SubElement)CommentProcessingInstructionc@seZdZdZdS)SaxErrorzGeneral SAX error. N)__name__ __module__ __qualname____doc__rr;/opt/alt/python37/lib64/python3.7/site-packages/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 }||_ dS)N) r__init___root_root_siblings_element_stack _default_ns _ns_mapping _new_mappingsrZElement _makeelement)selfZ makeelementrrrr&s  z"ElementTreeContentHandler.__init__cCs t|jS)z=Contains the generated ElementTree after parsing is finished.)rr)r rrr _get_etree2sz$ElementTreeContentHandler._get_etree)doccCsdS)Nr)r ZlocatorrrrsetDocumentLocator8sz,ElementTreeContentHandler.setDocumentLocatorcCsdS)Nr)r rrr startDocument;sz'ElementTreeContentHandler.startDocumentcCsdS)Nr)r rrr endDocument>sz%ElementTreeContentHandler.endDocumentcCsR||j|<y|j||Wn tk r>|g|j|<YnX|dkrN||_dS)N)rrappendKeyErrorr)r prefixurirrrstartPrefixMappingAs z,ElementTreeContentHandler.startPrefixMappingcCs(|j|}||dkr$|d|_dS)N)rpopr)r r(Z ns_uri_listrrrendPrefixMappingJs z*ElementTreeContentHandler.endPrefixMappingcCs4|\}}|rd|}n|jr,d|j|f}n|}|S)Nz{%s}%s)r)r Z ns_name_tuplens_uri local_nameel_tagrrr _buildTagPs z#ElementTreeContentHandler._buildTagc Cs||}|rri}y |}Wntk r:|}YnXx8|D]*\}}|dr\d|} n|d} ||| <qBWnd}|j} |jdkr||||j} |_|jrt | drx|jD]} | | qW|jdd=nt | d|||j} | | |j dS)Nrz{%s}%sr addpreviousr+)r1Z iteritemsAttributeErroritemsrrrrrhasattrr2rr&clear) r ns_nameqname attributesZel_nameZattrsZiter_attributesZ name_tuplevalueZ attr_nameZ element_stackelementsiblingrrrstartElementNSZs0        z(ElementTreeContentHandler.startElementNScCs6t||}|jdkr"|j|n|jd|dS)Nr+)rrrr&r)r targetdataZpirrrprocessingInstruction{s  z/ElementTreeContentHandler.processingInstructioncCs.|j}||}||jkr*td|dS)NzUnexpected element closed: )rr,r1rr )r r7r8r;r0rrr endElementNSs   z&ElementTreeContentHandler.endElementNScCs0|rtdd|D}|d|f||dS)NcSsg|]\}}d|f|fqS)Nr).0kvrrr sz:ElementTreeContentHandler.startElement..)dictr4r=)r namer9rrr startElementsz&ElementTreeContentHandler.startElementcCs|d|f|dS)N)rA)r rGrrr endElementsz$ElementTreeContentHandler.endElementcCsP|jd}y|d}|jpd||_Wn$tk rJ|jp>d||_YnXdS)Nr+)rtail IndexErrortext)r r?Z last_elementrrr characterss  z$ElementTreeContentHandler.characters)N)N)N)r r r r rr!propertyrr#r$r%r*r-r1r=r@rArHrIrNZignorableWhitespacerrrrr#s"   !  rc@s0eZdZdZddZddZddZdd Zd S) ElementTreeProducerz5Produces SAX events for an element and children. cCsTy |}Wntk r$|}YnX||_||_ddlm}||_|ii|_dS)Nr)AttributesNSImpl)Zgetrootr3_element_content_handlerZxml.sax.xmlreaderrQ _attr_class_empty_attributes)r element_or_treecontent_handlerr;Z attr_classrrrrs   zElementTreeProducer.__init__cCs|j|j}t|drrg}|}x&t|ddtkrL|||}q(Wx"|dddD]}||iq^W||it|dr| }x(t|ddtkr||i| }qW|j dS)N getpreviousrr+getnext) rSr$rRr5rXgetattrrr&_recursive_saxifyrYr%)r r;Zsiblingsr<rrrsaxifys"        zElementTreeProducer.saxifycCs|j}|j}|tks|tkrL|tkr4||j|j|j}|rH||dS|j }g}||krx0| D]$\}} | || krh| || fqhW| } | ri} i} x@| D]8\} }t | }|| |<|j|d|d|ddd| |<qW|| | }n|j}t |\} }|j| |||jdd}x|D]\}}|||q"W|| |f|||j}|rd||x|D]}|||qjW|| |f|x|D]\}}||qW|j}|r||dS)NrrT)preferred_prefix is_attributeF)r^)rSrrrr@r>rMrKrNnsmapr4getr&r _build_qnamerTrUr(r*r=r[rAr-)r r;Z parent_nsmaprWrrKZ element_nsmapZ new_prefixesr(r.ZattribsZ attr_valuesZ attr_qnamesZ attr_ns_namer:Z attr_ns_tupleZsax_attributesr/r8r)rMZchildrrrr[s\     z%ElementTreeProducer._recursive_saxifycsvdkr |S|s$||kr$|}n:fdd|D}t|dkrN|dn|rZt|nd}|dkrj|S|d|S)Ncs$g|]\}}|dk r|kr|qS)Nr)rBZpfxr))r.rrrEsz4ElementTreeProducer._build_qname..rr:)r`r4lenmin)r r.r/r_r]r^r(Z candidatesr)r.rras z ElementTreeProducer._build_qnameN)r r r r rr\r[rarrrrrPs  6rPcCst||S)zlOne-shot helper to generate SAX events from an XML tree and fire them against a SAX ContentHandler. )rPr\)rVrWrrrr\sr\N)r Z __future__rZxml.sax.handlerrZlxmlrZ lxml.etreerrrrZ LxmlErrorr rrobjectrPr\rrrr s   |s