3 \¬‹ã @sdZddlmZmZmZddlmZmZmZddlm Z ddl m Z m Z ddl mZejZejZejZejjZejjZejjZejjZejƒZejddƒejdd ƒejdd ƒejdd ƒejdd ƒejdd ƒejddƒejddƒejddƒdœ ZGdd„deƒZdd„Zdd„ZGdd„dƒZeeefZ Gdd„deƒZ!Gdd„deƒZ"Gdd„de"ƒZ#Gd d!„d!e"ƒZ$d"Z%d#e%Z&Gd$d%„d%eƒZ'Gd&d'„d'ƒZ(Gd(d)„d)e(eƒZ)Gd*d+„d+e(e'ƒZ*Gd,d-„d-e+ƒZ,Gd.d/„d/eƒZ-d;d1d2„Z.dd7d8„Z1d9d:„Z2dS)?z™Facility to use the Expat parser to load a minidom instance from a string or file. This avoids all the overhead of SAX and pulldom to gain performance. é)Ú xmlbuilderÚminidomÚNode)ÚEMPTY_NAMESPACEÚ EMPTY_PREFIXÚXMLNS_NAMESPACE)Úexpat)Ú _append_childÚ_set_attribute_node)Ú NodeFilterNZcdataÚ enumerationÚentityÚentitiesÚidZidrefZidrefsZnmtokenZnmtokens) ZCDATAÚENUMZENTITYZENTITIESÚIDZIDREFZIDREFSZNMTOKENZNMTOKENSc@sZeZdZdZddd„Zdd„Zd d „Zd d „Zd d„Zdd„Z dd„Z dd„Z dd„Z dS)Ú ElementInfoÚ _attr_infoÚ_modelÚtagNameNcCs||_g|_||_dS)N)rrr)ÚselfrÚmodel©rú,/usr/lib64/python3.6/xml/dom/expatbuilder.pyÚ__init__?szElementInfo.__init__cCs|j|j|jfS)N)rrr)rrrrÚ __getstate__DszElementInfo.__getstate__cCs|\|_|_|_dS)N)rrr)rÚstaterrrÚ __setstate__GszElementInfo.__setstate__cCsJxB|jD]8}|d|kr|d}|ddkr4tdSt|dSqWtjS)Néérú(réþÿÿÿr!)rÚ _typeinfo_maprÚ_no_type)rÚanameÚinfoÚtrrrÚgetAttributeTypeJs   zElementInfo.getAttributeTypecCstjS)N)rr#)rÚ namespaceURIÚ localNamerrrÚgetAttributeTypeNSTszElementInfo.getAttributeTypeNScCs,|jr$|jd}|tjjtjjfkSdSdS)NrF)rrrZ XML_CTYPE_ANYZXML_CTYPE_MIXED)rÚtyperrrÚisElementContentWs   zElementInfo.isElementContentcCs |jr|jdtjjkSdSdS)NrF)rrrZXML_CTYPE_EMPTY)rrrrÚisEmpty_szElementInfo.isEmptycCs,x&|jD]}|d|kr|ddkSqWdS)NrrrFr!)r)rr$r%rrrÚisIdes  zElementInfo.isIdcCs|j||fƒS)N)r.)rZeuriZenameZaurir$rrrÚisIdNSkszElementInfo.isIdNS)rrr)N) Ú__name__Ú __module__Ú __qualname__Ú __slots__rrrr'r*r,r-r.r/rrrrr<s  rcCs |j||ƒS)N)Ú_intern_setdefault)ÚbuilderÚsrrrÚ_internosr7cCs¤d|ks t‚|jdƒ}|j}t|ƒdkr^|\}}}|||ƒ}d||f}|||ƒ}|||ƒ}n4t|ƒdkr†|\}}t}|||ƒ}}n td|ƒ‚|||ƒ|||fS)Nú éz%s:%srz4Unsupported syntax: spaces in URIs not supported: %r)ÚAssertionErrorÚsplitr4ÚlenrÚ ValueError)r5ÚnameÚpartsÚinternÚuriÚ localnameÚprefixÚqnamerrrÚ_parse_ns_namers          rEc@sòeZdZdZd;dd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„ZdS)<Ú ExpatBuilderzPDocument builder that uses Expat to build a ParsedXML.DOM document instance.NcCsP|dkrtjƒ}||_|jjdk r2t|jjƒ|_n d|_t|_d|_|j ƒdS)N) rZOptionsÚ_optionsÚfilterÚFilterVisibilityControllerÚ_filterrÚ_finish_start_elementÚ_parserÚreset)rÚoptionsrrrr‰s zExpatBuilder.__init__cCstjƒS)zCreate a new parser object.)rÚ ParserCreate)rrrrÚ createParser—szExpatBuilder.createParsercCsF|js@|jƒ|_|jjj|_d|j_d|j_d|j_|j|jƒ|jS)z7Return the parser object, creating a new one if needed.T) rLrPr@Ú setdefaultr4Z buffer_textZordered_attributesZspecified_attributesÚinstall)rrrrÚ getParser›s   zExpatBuilder.getParsercCs,tjtddƒ|_|j|_|jj|_d|_dS)z6Free all data structures used during DOM construction.NF)ÚtheDOMImplementationZcreateDocumentrÚdocumentÚcurNodeÚ _elem_infoÚ_cdata)rrrrrM¦s   zExpatBuilder.resetcCs–|j|_|j|_|j|_|j|_|jj r0|j |_ |j |_ |jjrH|j|_|jjrj|j|_|j|_|j|_n|j|_|j|_|j|_|j|_|j|_ dS)z>Install the callbacks needed to build the DOM into the parser.N)!Ústart_doctype_decl_handlerÚStartDoctypeDeclHandlerÚfirst_element_handlerÚStartElementHandlerÚend_element_handlerÚEndElementHandlerÚ pi_handlerÚProcessingInstructionHandlerrGrÚentity_decl_handlerÚEntityDeclHandlerÚnotation_decl_handlerÚNotationDeclHandlerÚcommentsÚcomment_handlerÚCommentHandlerZcdata_sectionsÚstart_cdata_section_handlerÚStartCdataSectionHandlerÚend_cdata_section_handlerÚEndCdataSectionHandlerÚcharacter_data_handler_cdataÚCharacterDataHandlerÚcharacter_data_handlerÚexternal_entity_ref_handlerÚExternalEntityRefHandlerÚxml_decl_handlerZXmlDeclHandlerÚelement_decl_handlerZElementDeclHandlerÚattlist_decl_handlerZAttlistDeclHandler)rÚparserrrrrR®s$ zExpatBuilder.installc Cs†|jƒ}d}yLx:|jdƒ}|s P|j|dƒ|rB|jjrB|j|ƒd}qW|jddƒWntk rlYnX|j}|jƒd|_|S) zIParse a document from a file object, returning the document node.TéirFÚNi@) rSÚreadÚParserUÚdocumentElementÚ _setup_subsetÚ ParseEscaperMrL)rÚfilertZ first_bufferÚbufferÚdocrrrÚ parseFileÅs$    zExpatBuilder.parseFilec CsP|jƒ}y|j|dƒ|j|ƒWntk r6YnX|j}|jƒd|_|S)z|jj|ƒ}t|j|ƒ|jr:|jj|ƒtkr:|jj|ƒdS)N)rUZ createCommentr rVrJrŠr‹r•)rr—r˜rrrrfIs  zExpatBuilder.comment_handlercCsd|_d|_dS)NTF)rXr™)rrrrrhOsz(ExpatBuilder.start_cdata_section_handlercCsd|_d|_dS)NF)rXr™)rrrrrjSsz&ExpatBuilder.end_cdata_section_handlercCsdS)Nrr)rÚcontextr r‘r’rrrroWsz(ExpatBuilder.external_entity_ref_handlercCs4|jdkr|j rt|_|j|jƒ_|j||ƒdS)N)rJrWrr”Ústart_element_handlerrSr\)rr>Ú attributesrrrr[Zs z"ExpatBuilder.first_element_handlercCsŽ|jj|ƒ}t|j|ƒ||_|rtxPtdt|ƒdƒD]<}tj||tdt ƒ}||d}||_ |j|_ t ||ƒq4W||jj k rŠ|j|ƒdS)Nrrr)rUZ createElementr rVÚranger<rÚAttrrrržr‰r ryrK)rr>r¦r˜ÚiÚaržrrrr¥`s     z"ExpatBuilder.start_element_handlercCsj|jrf||jjkrdS|jj|ƒ}|tkr4t|ƒn|tkrFt|ƒndS|j|_ |jj |ƒ|j ƒdS)N) rJrUryÚstartContainerr‹ÚRejecterÚ FILTER_SKIPÚSkipperÚ parentNoderVr•Úunlink)rr˜ZfiltrrrrKqs     z"ExpatBuilder._finish_start_elementcCs|j}|j|_|j|ƒdS)N)rVr¯r”)rr>rVrrrr]ˆsz ExpatBuilder.end_element_handlercCs\|jj|jƒ}|r|j||ƒ|jrX||jjkr4dS|jj|ƒtkrX|j j |ƒ|j ƒdS)N) rWÚgetrÚ_handle_white_text_nodesrJrUryrŠr‹rVr•r°)rrVr%rrrr”�s   z ExpatBuilder._finish_end_elementcCsf|jjs|jƒ rdSg}x.|jD]$}|jtkr"|jjƒ r"|j|ƒq"Wx|D]}|j |ƒqPWdS)N) rGZwhitespace_in_element_contentr,rŒršrœr—ÚstriprŸr•)rr˜r%ÚLr¢rrrr²˜s   z%ExpatBuilder._handle_white_text_nodescCs>|jj|ƒ}|dkr&t||ƒ|j|<n|jdks4t‚||_dS)N)rWr±rrr:)rr>rr%rrrrr©s  z!ExpatBuilder.element_decl_handlerc CsF|jj|ƒ}|dkr&t|ƒ}||j|<|jjd|dd|d||gƒdS)Nr)rWr±rrrŸ)rÚelemr>r+ÚdefaultZrequiredr%rrrrs±s   z!ExpatBuilder.attlist_decl_handlercCs2||j_||j_|dkr.|r&d|j_nd|j_dS)NrTF)rUÚversionÚencodingÚ standalone)rr·r¸r¹rrrrq¹s  zExpatBuilder.xml_decl_handler)N) r0r1r2Ú__doc__rrPrSrMrRrr�rzrYr�r_rlrnrarcrfrhrjror[r¥rKr]r”r²rrrsrqrrrrrF…s:     rFc@s�eZdZdZd Zdd„Zdd„Zdd„Zej e j ej e j eje jeje jeje jeje jeje jeje jeje jeje jeje jej e j!i Z"d S) rIzoWrapper around a DOMBuilderFilter which implements the checks to make the whatToShow filter attribute work.rHcCs ||_dS)N)rH)rrHrrrrÎsz#FilterVisibilityController.__init__cCsT|j|j}|jj|@rL|jj|ƒ}|tkr0t‚|tkrHtdt |ƒƒ‚|St SdS)Nz)startContainer() returned illegal value: ) Ú_nodetype_maskršrHÚ whatToShowr«ÚFILTER_INTERRUPTr{Ú_ALLOWED_FILTER_RETURNSr=Úreprr£)rr˜ÚmaskÚvalrrrr«Ñs   z)FilterVisibilityController.startContainercCsˆ|j|j}|jj|@r€|jj|ƒ}|tkr0t‚|tkrd|j}x |j dd…D]}|j |ƒqNWt S|t kr|t dt|ƒƒ‚|StSdS)Nz%acceptNode() returned illegal value: )r»ršrHr¼rŠr½r{r­r¯rŒZ appendChildr‹r¾r=r¿r£)rr˜rÀrÁÚparentr¢rrrrŠÞs   z%FilterVisibilityController.acceptNodeN)rH)#r0r1r2rºr3rr«rŠrZ ELEMENT_NODEr Z SHOW_ELEMENTZATTRIBUTE_NODEZSHOW_ATTRIBUTErœZ SHOW_TEXTr›ZSHOW_CDATA_SECTIONZENTITY_REFERENCE_NODEZSHOW_ENTITY_REFERENCEZ ENTITY_NODEZ SHOW_ENTITYZPROCESSING_INSTRUCTION_NODEZSHOW_PROCESSING_INSTRUCTIONZ COMMENT_NODEZ SHOW_COMMENTÚ DOCUMENT_NODEZ SHOW_DOCUMENTZDOCUMENT_TYPE_NODEZSHOW_DOCUMENT_TYPEZDOCUMENT_FRAGMENT_NODEZSHOW_DOCUMENT_FRAGMENTZ NOTATION_NODEZ SHOW_NOTATIONr»rrrrrIÈs" rIc@seZdZdZdd„ZdS) Ú FilterCrutchÚ_builderÚ_levelÚ _old_startÚ_old_endcCs6d|_||_|j}|j|_|j|_|j|_|j|_dS)Nr) rÆrÅrLr\rÇr^rÈr¥r])rr5rtrrrrszFilterCrutch.__init__N)rÅrÆrÇrÈ)r0r1r2r3rrrrrrÄsrÄc@s(eZdZfZdd„Zdd„Zdd„ZdS)r¬cCs0tj||ƒ|j}xdD]}t||dƒqWdS)Nr`rgrmrirkrp)r`rgrmrirkrp)rÄrrLÚsetattr)rr5rtr>rrrrs zRejecter.__init__cGs|jd|_dS)Nr)rÆ)rÚargsrrrr¥szRejecter.start_element_handlercGs@|jdkr0|jj}|jj|ƒ|j|_|j|_n |jd|_dS)Nrr)rÆrÅrLrRrÇr\rÈr^)rrÊrtrrrr] s    zRejecter.end_element_handlerN)r0r1r2r3rr¥r]rrrrr¬s r¬c@s eZdZfZdd„Zdd„ZdS)r®cGs.|jj}|j|Ž|jj|k r*|jd|_dS)Nr)rÅrVrÇrÆ)rrÊr˜rrrr¥-s  zSkipper.start_element_handlercGsD|jdkr*|j|jj_|j|jj_d|_n|jd|_|j|ŽdS)Nrr)rÆrÇrÅrLr\rÈr^)rrÊrrrr]3s     zSkipper.end_element_handlerN)r0r1r2r3r¥r]rrrrr®*sr®z8http://xml.python.org/entities/fragment-builder/internalzŠ %%s ]> &fragment-builder-internal;c@sJeZdZdZddd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dS)ÚFragmentBuilderzñBuilder which constructs document fragments given XML source text and a context node. The context node is expected to provide information about the namespace declarations which are in scope at the start of the fragment. NcCs6|jtkr||_||_n|j|_||_tj||ƒdS)N)ršrÃÚoriginalDocumentr¤r‰rFr)rr¤rNrrrr[s  zFragmentBuilder.__init__cCstj|ƒd|_dS)N)rFrMÚfragment)rrrrrMds zFragmentBuilder.resetcCs|j|jƒƒS)zRParse a document fragment from a file object, returning the fragment node.)r�rw)rr|rrrrhszFragmentBuilder.parseFilec Csª||_|jƒ}|jj}d}|rV|jp*|jƒ}|jrDd|j|jf}qZ|jrZd|j}nd}|jƒ}t |||f}y|j |dƒWn|j ƒ‚YnX|j }|j ƒ|S)zMParse a document fragment from a string, returning the fragment node.rvzPUBLIC "%s" "%s"z SYSTEM "%s"r) Ú_sourcerSrÌr‚r…Ú_getDeclarationsr’r‘Ú _getNSattrsÚ_FRAGMENT_BUILDER_TEMPLATErxrMrÍ) rr€rtr‚Zidentr†ZnsattrsrUrÍrrrr�ms, zFragmentBuilder.parseStringcCs|jjj}d}|�rxbt|jjƒD]R}|jj|ƒ}|r>|d}d||jf}|jrfd||j|j f}q"d||j f}q"Wx˜t|j jƒD]ˆ}|j j|ƒ}|r¢|d}d||jf}|jrÊd||j|j f}n&|j ràd||j f}nd ||j j f}|j �rd ||j f}|d }q†W|S) z Re-create the internal subset from the DocumentType node. This is only needed if we don't already have the internalSubset as a string. rvz z%sz%s SYSTEM "%s">z %s)r¤r‰r‚r§rŽZlengthÚitemÚnodeNamer’r‘rZ firstChildr—r¡)rr‚r6r©Znotationr rrrrωs6    z FragmentBuilder._getDeclarationscCsdS)Nrvr)rrrrrЭszFragmentBuilder._getNSattrsc Cs~|tkrh|j}|j}|jj|ƒ}|j|_|jjƒ|_|j|_z|j|j dƒWd||_||_d|_ XdSt j |||||ƒSdS)Nrr‡) Ú$_FRAGMENT_BUILDER_INTERNAL_SYSTEM_IDrUrVrLZExternalEntityParserCreaterÌZcreateDocumentFragmentrÍrxrÎrFro)rr¤r r‘r’Z old_documentZ old_cur_nodertrrrro°s  z+FragmentBuilder.external_entity_ref_handler)N) r0r1r2rºrrMrr�rÏrÐrorrrrrËRs $rËc@s@eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dS)Ú Namespacesz7Mix-in class for builders; adds support for namespaces.cCs g|_dS)N)Ú_ns_ordered_prefixes)rrrrÚ_initNamespacesÊszNamespaces._initNamespacescCstjdd�}d|_|S)z'Create a new namespace-handling parser.r8)Znamespace_separatorT)rrOZnamespace_prefixes)rrtrrrrPÏs zNamespaces.createParsercCs tj||ƒ|jjr|j|_dS)z.Insert the namespace-handlers onto the parser.N)rFrRrGZnamespace_declarationsÚstart_namespace_decl_handlerZStartNamespaceDeclHandler)rrtrrrrRÕs zNamespaces.installcCs|jj||fƒdS)z/Push this namespace declaration on our storage.N)r×rŸ)rrCrArrrrÙÜsz'Namespaces.start_namespace_decl_handlercCsŠd|krt||ƒ\}}}}nt}|}d}t}tj||||ƒ}|j|_t|j|ƒ||_|j rÄxZ|j D]P\}}|rŒtj t |d|ƒt |dƒ}ntj dt dtƒ}||_ |j|_t||ƒqdW|j dd…=|�r†|jƒ|j} |j} x¦tdt|ƒdƒD]’} || } || d} d| k�rJt|| ƒ\}}}}tj ||||ƒ}|| |<|| ||f<n$tj | t| tƒ}|| | <|| t| f<|j|_| |_ ||_qðWdS)Nr8zxmlns:Úxmlnsrrr)rErrrZElementrUr‰r rVr×r¨r7rržr Z_ensure_attributesÚ_attrsÚ_attrsNSr§r<Z ownerElement)rr>r¦rArBrCrDr˜rªrÛrÜr©r$ržrrrr¥àsP      z Namespaces.start_element_handlercCs‚|j}d|krHt||ƒ\}}}}|j|kr>|j|kr>|j|ksltdƒ‚n$|j|ksZtdƒ‚|jtksltdƒ‚|j|_|j |ƒdS)Nr8z$element stack messed up! (namespace)z&element stack messed up - bad nodeNamez*element stack messed up - bad namespaceURI) rVrEr(r)rCr:rÔrr¯r”)rr>rVrArBrCrDrrrr]s     zNamespaces.end_element_handlerN) r0r1r2rºrØrPrRrÙr¥r]rrrrrÖÇs5rÖc@seZdZdZdd„ZdS)ÚExpatBuilderNSz*Document builder that supports namespaces.cCstj|ƒ|jƒdS)N)rFrMrØ)rrrrrM)s zExpatBuilderNS.resetN)r0r1r2rºrMrrrrrÝ&srÝc@s eZdZdZdd„Zdd„ZdS)ÚFragmentBuilderNSz*Fragment builder that supports namespaces.cCstj|ƒ|jƒdS)N)rËrMrØ)rrrrrM1s zFragmentBuilderNS.resetcCsŠd}|j}g}xv|r„t|dƒr|x\|jjƒD]N\}}||krr’r‘r“rtrrrrYps   z2InternalSubsetExtractor.start_doctype_decl_handlercCs,dj|jƒjddƒjddƒ}||_tƒ‚dS)Nrvz Ú ú )Újoinr†Úreplacer{)rr6rrrr�zsz0InternalSubsetExtractor.end_doctype_decl_handlercCs tƒ‚dS)N)r{)rr>rârrrr¥sz-InternalSubsetExtractor.start_element_handler) r0r1r2rºr†r„rr�rRrYr�r¥rrrrrƒWs rƒTc CsL|r tƒ}ntƒ}t|tƒr>t|dƒ�}|j|ƒ}WdQRXn |j|ƒ}|S)z{Parse a document, returning the resulting Document node. 'file' may be either a file name or an open file object. ÚrbN)rÝrFÚ isinstanceÚstrÚopenr)r|Ú namespacesr5ÚfpÚresultrrrÚparseƒs   rîcCs|r tƒ}ntƒ}|j|ƒS)zOParse a document from a string, returning the resulting Document node. )rÝrFr�)r€rër5rrrr�•sr�c CsP|rt|ƒ}nt|ƒ}t|tƒrBt|dƒ�}|j|ƒ}WdQRXn |j|ƒ}|S)zìParse a fragment of a document, given the context from which it was originally extracted. context should be the parent of the node(s) which are in the fragment. 'file' may be either a file name or an open file object. rçN)rÞrËrèrérêr)r|r¤rër5rìrírrrÚ parseFragment s    rïcCs |rt|ƒ}nt|ƒ}|j|ƒS)z¼Parse a fragment of a document from a string, given the context from which it was originally extracted. context should be the parent of the node(s) which are in the fragment. )rÞrËr�)r€r¤rër5rrrÚparseFragmentString´s rðcCs|jrt|ƒSt|ƒSdS)z,Create a builder based on an Options object.N)rërÝrF)rNrrrÚ makeBuilderÀsrñ)T)T)T)T)3rºZxml.domrrrrrrZ xml.parsersrZxml.dom.minidomr r Zxml.dom.NodeFilterr rœr›rÃZDOMBuilderFilterr£r‹r­r½ZgetDOMImplementationrTZTypeInfor"Úobjectrr7rErFr¾rIrÄr¬r®rÕrÑrËrÖrÝrÞÚ Exceptionr{rƒrîr�rïrðrñrrrrÚs^          3C :  u_%,