
][\                 @   s  d  Z  d d l m Z m Z m Z d d l m Z m Z m Z d d l m	 Z	 d d l
 m Z m Z d d l m Z e j Z e j Z e j Z e j j Z e j j Z e j j Z e j j Z e j   Z i	 e j d d  d	 6e j d d
  d 6e j d d  d 6e j d d  d 6e j d d  d 6e j d d  d 6e j d d  d 6e j d d  d 6e j d d  d 6Z Gd d   d e  Z d d   Z d d   Z Gd  d!   d!  Z e e e f Z  Gd" d#   d# e  Z! Gd$ d%   d% e  Z" Gd& d'   d' e"  Z# Gd( d)   d) e"  Z$ d* Z% d+ e% Z& Gd, d-   d- e  Z' Gd. d/   d/  Z( Gd0 d1   d1 e( e  Z) Gd2 d3   d3 e( e'  Z* Gd4 d5   d5 e+  Z, Gd6 d7   d7 e  Z- d8 d9 d:  Z. d8 d; d<  Z/ d8 d= d>  Z0 d8 d? d@  Z1 dA dB   Z2 d S)CzFacility 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)
NodeFilterNZcdataZCDATAZenumerationENUMentityZENTITYentitiesZENTITIESidIDZidrefZIDREFZidrefsZIDREFSZnmtokenZNMTOKENZnmtokensZNMTOKENSc               @   s   e  Z d  Z d Z d d d  Z d d   Z d	 d
   Z d d   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d S)ElementInfo
_attr_info_modeltagNameNc             C   s   | |  _  g  |  _ | |  _ d  S)N)r   r   r   )selfr   model r   */usr/lib/python3.4/xml/dom/expatbuilder.py__init__?   s    		zElementInfo.__init__c             C   s   |  j  |  j |  j f S)N)r   r   r   )r   r   r   r   __getstate__D   s    zElementInfo.__getstate__c             C   s   | \ |  _  |  _ |  _ d  S)N)r   r   r   )r   stater   r   r   __setstate__G   s    zElementInfo.__setstate__c             C   s\   xR |  j  D]G } | d | k r
 | d } | d d k rB t d St | d Sq
 q
 Wt j S)N      r   (r   r    )r   _typeinfo_mapr   _no_type)r   anameinfotr   r   r   getAttributeTypeJ   s    
zElementInfo.getAttributeTypec             C   s   t  j S)N)r   r"   )r   namespaceURI	localNamer   r   r   getAttributeTypeNST   s    zElementInfo.getAttributeTypeNSc             C   s:   |  j  r2 |  j  d } | t j j t j j f k Sd Sd  S)Nr   F)r   r   r   ZXML_CTYPE_ANYZXML_CTYPE_MIXED)r   typer   r   r   isElementContentW   s
    	zElementInfo.isElementContentc             C   s(   |  j  r  |  j  d t j j k Sd Sd  S)Nr   F)r   r   r   ZXML_CTYPE_EMPTY)r   r   r   r   isEmpty_   s    	zElementInfo.isEmptyc             C   s6   x/ |  j  D]$ } | d | k r
 | d d k Sq
 Wd S)Nr   r   r   Fr    )r   )r   r#   r$   r   r   r   isIde   s    zElementInfo.isIdc             C   s   |  j  | | f  S)N)r-   )r   ZeuriZenameZaurir#   r   r   r   isIdNSk   s    zElementInfo.isIdNS)z
_attr_infoz_modelztagName)__name__
__module____qualname__	__slots__r   r   r   r&   r)   r+   r,   r-   r.   r   r   r   r   r   <   s   
r   c             C   s   |  j  | |  S)N)_intern_setdefault)buildersr   r   r   _interno   s    r6   c             C   s   d | k s t   | j d  } |  j } t |  d k r | \ } } } | | |  } d | | f } | | |  } | | |  } nJ t |  d k r | \ } } t } | | |  } } n t d |   | | |  | | | f S)N    z%s:%sr   z4Unsupported syntax: spaces in URIs not supported: %r)AssertionErrorsplitr3   lenr   
ValueError)r4   namepartsinternuri	localnameprefixqnamer   r   r   _parse_ns_namer   s    	rD   c               @   si  e  Z d  Z d Z d d d  Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! d"   Z d# d$   Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z d3 d4   Z d5 d6   Z d7 d8   Z d9 d:   Z d S);ExpatBuilderzPDocument builder that uses Expat to build a ParsedXML.DOM document
    instance.Nc             C   sw   | d  k r t  j   } n  | |  _ |  j j d  k	 rN t |  j j  |  _ n d  |  _ t |  _ d  |  _ |  j	   d  S)N)
r   ZOptions_optionsfilterFilterVisibilityController_filterr   _finish_start_element_parserreset)r   optionsr   r   r   r      s    				zExpatBuilder.__init__c             C   s
   t  j   S)zCreate a new parser object.)r   ParserCreate)r   r   r   r   createParser   s    zExpatBuilder.createParserc             C   sh   |  j  sa |  j   |  _  |  j  j j |  _ d |  j  _ d |  j  _ d |  j  _ |  j |  j   n  |  j  S)z7Return the parser object, creating a new one if needed.T)	rK   rO   r?   
setdefaultr3   Zbuffer_textZordered_attributesZspecified_attributesinstall)r   r   r   r   	getParser   s    	zExpatBuilder.getParserc             C   s@   t  j t d d  |  _ |  j |  _ |  j j |  _ d |  _ d S)z6Free all data structures used during DOM construction.NF)theDOMImplementationZcreateDocumentr   documentcurNode
_elem_info_cdata)r   r   r   r   rL      s
    zExpatBuilder.resetc             C   s   |  j  | _ |  j | _ |  j | _ |  j | _ |  j j	 rK |  j
 | _ n  |  j | _ |  j j rr |  j | _ n  |  j j r |  j | _ |  j | _ |  j | _ n |  j | _ |  j | _ |  j | _ |  j | _ |  j | _  d S)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ProcessingInstructionHandlerrF   r   entity_decl_handlerEntityDeclHandlernotation_decl_handlerNotationDeclHandlercommentscomment_handlerCommentHandlerZcdata_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_handlerZXmlDeclHandlerelement_decl_handlerZElementDeclHandlerattlist_decl_handlerZAttlistDeclHandler)r   parserr   r   r   rQ      s$    zExpatBuilder.installc             C   s   |  j    } d } yk xT | j d  } | s1 Pn  | j | d  | rc |  j j rc |  j |  n  d } q | j d d  Wn t k
 r Yn X|  j } |  j   d |  _ | S)	zIParse a document from a file object, returning the document
        node.T   i   r   F Ni @  )	rR   readParserT   documentElement_setup_subsetParseEscaperL   rK   )r   filers   Zfirst_bufferbufferdocr   r   r   	parseFile   s$    		
	zExpatBuilder.parseFilec             C   sb   |  j    } y! | j | d  |  j |  Wn t k
 rA Yn X|  j } |  j   d |  _ | S)z<Parse a document from a string, returning the document node.TN)rR   rw   ry   rz   rT   rL   rK   )r   stringrs   r}   r   r   r   parseString   s    	
	zExpatBuilder.parseStringc             C   sD   |  j  j r@ t   } | j |  | j   } | |  j  j _ n  d S)z/Load the internal subset if there might be one.N)rT   doctypeInternalSubsetExtractorr   	getSubsetinternalSubset)r   r|   	extractorsubsetr   r   r   ry      s
    	zExpatBuilder._setup_subsetc             C   s   |  j  j j | | |  } |  j  | _ t |  j  |  | |  j  _ |  j r |  j j |  t k r d  |  j  _ |  j  j	 d =d  } d  |  j
 _ d  |  j
 _ n  | r | d  k	 r g  | j _ g  | j _ n  d  |  j
 _ d  |  j
 _ |  j |  j
 _ n  d  S)Nr   )rT   implementationZcreateDocumentTypeownerDocumentr	   r   rI   
acceptNodeFILTER_REJECT
childNodesrK   ra   rc   r   _seq	notationsrf   r_   end_doctype_decl_handlerEndDoctypeDeclHandler)r   ZdoctypeNamesystemIdpublicIdhas_internal_subsetr   r   r   r   rX      s$    !z'ExpatBuilder.start_doctype_decl_handlerc             C   sO   |  j  j r |  j |  j _ n  |  j |  j _ |  j p< |  j sK t	 |  _
 n  d  S)N)rF   rd   re   rK   rf   r^   r_   rV   rI   r   _finish_end_element)r   r   r   r   r     s
    z%ExpatBuilder.end_doctype_decl_handlerc             C   s]   |  j  j | |  } t |  j |  |  j rY |  j j |  t k rY |  j j |  n  d  S)N)rT   ZcreateProcessingInstructionr	   rU   rI   r   r   removeChild)r   targetdatanoder   r   r   r^     s    !zExpatBuilder.pi_handlerc             C   s   |  j  j } |  j rd |  j rF | d j t k rF | d j |  d  S|  j j |  } d |  _ n^ | r | d j t	 k r | d } | j
 | } | | _
 d  St j   } | | _
 |  j | _ t |  j  |  d  S)Nr   Tr   r   r   r   )rU   r   rW   _cdata_continuenodeTypeCDATA_SECTION_NODEZ
appendDatarT   ZcreateCDATASection	TEXT_NODEr   r   Textr   r	   )r   r   r   r   valuer   r   r   rk     s"    		
		z)ExpatBuilder.character_data_handler_cdatac             C   s   |  j  j } | rC | d j t k rC | d } | j | | _ d  St j   } | j | | _ |  j | _ t	 |  j  |  d  S)Nr   r   r   )
rU   r   r   r   r   r   r   rT   r   r	   )r   r   r   r   r   r   r   rm   &  s    
z#ExpatBuilder.character_data_handlerc       
      C   s   | r
 d  S|  j  j s d  S|  j j | | | |  } | d  k	 rf |  j j |  }	 | j j |	  n  |  j j j j j |  |  j	 r |  j	 j
 |  t k r |  j j j j d =n  d  S)Nr   r   )rF   r   rT   Z_create_entityZcreateTextNoder   appendr   r   rI   r   r   )
r   Z
entityNameZis_parameter_entityr   baser   r   notationNamer   childr   r   r   r`   1  s    !z ExpatBuilder.entity_decl_handlerc             C   sl   |  j  j | | |  } |  j  j j j j |  |  j rh |  j j |  t k rh |  j  j j j d =n  d  S)Nr   r   )	rT   Z_create_notationr   r   r   r   rI   r   FILTER_ACCEPT)r   r   r   r   r   r   r   r   r   rb   C  s    !z"ExpatBuilder.notation_decl_handlerc             C   sZ   |  j  j |  } t |  j |  |  j rV |  j j |  t k rV |  j j |  n  d  S)N)rT   ZcreateCommentr	   rU   rI   r   r   r   )r   r   r   r   r   r   re   I  s    !zExpatBuilder.comment_handlerc             C   s   d |  _  d |  _ d  S)NTF)rW   r   )r   r   r   r   rg   O  s    	z(ExpatBuilder.start_cdata_section_handlerc             C   s   d |  _  d |  _ d  S)NF)rW   r   )r   r   r   r   ri   S  s    	z&ExpatBuilder.end_cdata_section_handlerc             C   s   d S)Nr   r   )r   contextr   r   r   r   r   r   rn   W  s    z(ExpatBuilder.external_entity_ref_handlerc             C   sK   |  j  d  k r% |  j r% t |  _ n  |  j |  j   _ |  j | |  d  S)N)rI   rV   r   r   start_element_handlerrR   r[   )r   r=   
attributesr   r   r   rZ   Z  s    z"ExpatBuilder.first_element_handlerc             C   s   |  j  j |  } t |  j |  | |  _ | r xo t d t |  d  D]R } t j | | t d  t	  } | | d } | | _
 |  j  | _ t | |  qJ Wn  | |  j  j k	 r |  j |  n  d  S)Nr   r   r   )rT   ZcreateElementr	   rU   ranger;   r   Attrr   r   r   r   r
   rx   rJ   )r   r=   r   r   iar   r   r   r   r   `  s    		z"ExpatBuilder.start_element_handlerc             C   s   |  j  r | |  j j k r d  S|  j  j |  } | t k rJ t |   n | t k rc t |   n d  S| j |  _	 | j j
 |  | j   n  d  S)N)rI   rT   rx   startContainerr   RejecterFILTER_SKIPSkipper
parentNoderU   r   unlink)r   r   Zfiltr   r   r   rJ   q  s    	z"ExpatBuilder._finish_start_elementc             C   s&   |  j  } | j |  _  |  j |  d  S)N)rU   r   r   )r   r=   rU   r   r   r   r\     s    	z ExpatBuilder.end_element_handlerc             C   s   |  j  j | j  } | r. |  j | |  n  |  j r | |  j j k rM d  S|  j j |  t k r |  j	 j
 |  | j   q n  d  S)N)rV   getr   _handle_white_text_nodesrI   rT   rx   r   r   rU   r   r   )r   rU   r$   r   r   r   r     s    	z ExpatBuilder._finish_end_elementc             C   s   |  j  j s | j   r d  Sg  } x@ | j D]5 } | j t k r- | j j   r- | j |  q- q- Wx | D] } | j	 |  qm Wd  S)N)
rF   Zwhitespace_in_element_contentr+   r   r   r   r   stripr   r   )r   r   r$   Lr   r   r   r   r     s    z%ExpatBuilder._handle_white_text_nodesc             C   sY   |  j  j |  } | d  k r7 t | |  |  j  | <n | j d  k sL t  | | _ d  S)N)rV   r   r   r   r9   )r   r=   r   r$   r   r   r   rq     s
    z!ExpatBuilder.element_decl_handlerc          	   C   sf   |  j  j |  } | d  k r: t |  } | |  j  | <n  | j j d  | d  d  | d | | g  d  S)Nr   )rV   r   r   r   r   )r   elemr=   r*   defaultZrequiredr$   r   r   r   rr     s    	z!ExpatBuilder.attlist_decl_handlerc             C   sL   | |  j  _ | |  j  _ | d k rH | r9 d |  j  _ qH d |  j  _ n  d  S)Nr   TF)rT   versionencoding
standalone)r   r   r   r   r   r   r   rp     s    zExpatBuilder.xml_decl_handler) r/   r0   r1   __doc__r   rO   rR   rL   rQ   r~   r   ry   rX   r   r^   rk   rm   r`   rb   re   rg   ri   rn   rZ   r   rJ   r\   r   r   rq   rr   rp   r   r   r   r   rE      s:   rE   c               @   s   e  Z d  Z d Z d
 Z d d   Z d d   Z d d   Z i e j	 e
 j 6e j e
 j 6e j e
 j 6e j e
 j 6e j e
 j 6e j e
 j 6e j e
 j 6e j e
 j 6e j e
 j 6e j e
 j 6e j e
 j 6e j  e
 j! 6Z" d	 S)rH   zoWrapper around a DOMBuilderFilter which implements the checks
    to make the whatToShow filter attribute work.rG   c             C   s   | |  _  d  S)N)rG   )r   rG   r   r   r   r     s    z#FilterVisibilityController.__init__c             C   sx   |  j  | j } |  j j | @rp |  j j |  } | t k rG t  n  | t k rl t d t	 |    n  | St
 Sd  S)Nz)startContainer() returned illegal value: )_nodetype_maskr   rG   
whatToShowr   FILTER_INTERRUPTrz   _ALLOWED_FILTER_RETURNSr<   reprr   )r   r   maskvalr   r   r   r     s    	z)FilterVisibilityController.startContainerc             C   s   |  j  | j } |  j j | @r |  j j |  } | t k rG t  n  | t k r | j } x( | j	 d  d   D] } | j
 |  qp Wt S| t k r t d t |    n  | St Sd  S)Nz%acceptNode() returned illegal value: )r   r   rG   r   r   r   rz   r   r   r   ZappendChildr   r   r<   r   r   )r   r   r   r   parentr   r   r   r   r     s    		z%FilterVisibilityController.acceptNodeN)zfilter)#r/   r0   r1   r   r2   r   r   r   r   ZSHOW_ELEMENTr   ZELEMENT_NODEZSHOW_ATTRIBUTEZATTRIBUTE_NODEZ	SHOW_TEXTr   ZSHOW_CDATA_SECTIONr   ZSHOW_ENTITY_REFERENCEZENTITY_REFERENCE_NODEZSHOW_ENTITYZENTITY_NODEZSHOW_PROCESSING_INSTRUCTIONZPROCESSING_INSTRUCTION_NODEZSHOW_COMMENTZCOMMENT_NODEZSHOW_DOCUMENTDOCUMENT_NODEZSHOW_DOCUMENT_TYPEZDOCUMENT_TYPE_NODEZSHOW_DOCUMENT_FRAGMENTZDOCUMENT_FRAGMENT_NODEZSHOW_NOTATIONZNOTATION_NODEr   r   r   r   r   rH     s$   rH   c               @   s"   e  Z d  Z d Z d d   Z d S)	FilterCrutch_builder_level
_old_start_old_endc             C   sO   d |  _  | |  _ | j } | j |  _ | j |  _ |  j | _ |  j | _ d  S)Nr   )	r   r   rK   r[   r   r]   r   r   r\   )r   r4   rs   r   r   r   r     s    			zFilterCrutch.__init__N)z_builderz_levelz
_old_startz_old_end)r/   r0   r1   r2   r   r   r   r   r   r     s   r   c               @   s:   e  Z d  Z f  Z d d   Z d d   Z d d   Z d S)r   c             C   s>   t  j |  |  | j } x d D] } t | | d   q  Wd  S)Nr_   rf   rl   rh   rj   ro   )zProcessingInstructionHandlerzCommentHandlerzCharacterDataHandlerzStartCdataSectionHandlerzEndCdataSectionHandlerzExternalEntityRefHandler)r   r   rK   setattr)r   r4   rs   r=   r   r   r   r     s    	    
zRejecter.__init__c             G   s   |  j  d |  _  d  S)Nr   )r   )r   argsr   r   r   r     s    zRejecter.start_element_handlerc             G   sZ   |  j  d k rF |  j j } |  j j |  |  j | _ |  j | _ n |  j  d |  _  d  S)Nr   r   )r   r   rK   rQ   r   r[   r   r]   )r   r   rs   r   r   r   r\      s    zRejecter.end_element_handlerN)r/   r0   r1   r2   r   r   r\   r   r   r   r   r     s   r   c               @   s.   e  Z d  Z f  Z d d   Z d d   Z d S)r   c             G   sB   |  j  j } |  j |   |  j  j | k	 r> |  j d |  _ n  d  S)Nr   )r   rU   r   r   )r   r   r   r   r   r   r   -  s    zSkipper.start_element_handlerc             G   s`   |  j  d k r? |  j |  j j _ |  j |  j j _ d  |  _ n |  j  d |  _  |  j |   d  S)Nr   r   )r   r   r   rK   r[   r   r]   )r   r   r   r   r   r\   3  s    zSkipper.end_element_handlerN)r/   r0   r1   r2   r   r\   r   r   r   r   r   *  s   r   z8http://xml.python.org/entities/fragment-builder/internalz<!DOCTYPE wrapper
  %%s [
  <!ENTITY fragment-builder-internal
    SYSTEM "%s">
%%s
]>
<wrapper %%s
>&fragment-builder-internal;</wrapper>c               @   sm   e  Z d  Z d Z d d d  Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d S)FragmentBuilderzBuilder 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.
    Nc             C   sM   | j  t k r$ | |  _ | |  _ n | j |  _ | |  _ t j |  |  d  S)N)r   r   originalDocumentr   r   rE   r   )r   r   rM   r   r   r   r   [  s    		zFragmentBuilder.__init__c             C   s   t  j |   d  |  _ d  S)N)rE   rL   fragment)r   r   r   r   rL   d  s    zFragmentBuilder.resetc             C   s   |  j  | j    S)zRParse a document fragment from a file object, returning the
        fragment node.)r   rv   )r   r{   r   r   r   r~   h  s    zFragmentBuilder.parseFilec       	   	   C   s   | |  _  |  j   } |  j j } d } | r | j p? |  j   } | j rd d | j | j f } q | j r d | j } q n d } |  j   } t	 | | | f } y | j
 | d  Wn |  j     Yn X|  j } |  j   | S)zMParse a document fragment from a string, returning the
        fragment node.ru   zPUBLIC "%s" "%s"zSYSTEM "%s"r   )_sourcerR   r   r   r   _getDeclarationsr   r   _getNSattrs_FRAGMENT_BUILDER_TEMPLATErw   rL   r   )	r   r   rs   r   Zidentr   ZnsattrsrT   r   r   r   r   r   m  s,    			
	
zFragmentBuilder.parseStringc             C   s  |  j  j j } d } | rx t | j j  D]v } | j j |  } | rY | d } n  d | | j f } | j r d | | j | j	 f } q. d | | j	 f } q. Wx t | j
 j  D] } | j
 j |  } | r | d } n  d | | j f } | j rd | | j | j	 f } n5 | j	 r=d | | j	 f } n d	 | | j j f } | j rrd
 | | j f } n  | d } q Wn  | S)zRe-create the internal subset from the DocumentType node.

        This is only needed if we don't already have the
        internalSubset as a string.
        ru   z
  z%s<!NOTATION %sz!%s PUBLIC "%s"
             "%s">z%s SYSTEM "%s">z%s<!ENTITY %sz %s PUBLIC "%s"
             "%s"z%s SYSTEM "%s"z%s "%s"z%s NOTATION %s>)r   r   r   r   r   ZlengthitemnodeNamer   r   r   Z
firstChildr   r   )r   r   r5   r   Znotationr   r   r   r   r     s6    				z FragmentBuilder._getDeclarationsc             C   s   d S)Nru   r   )r   r   r   r   r     s    zFragmentBuilder._getNSattrsc             C   s   | t  k r |  j } |  j } |  j j |  } |  j |  _ |  j j   |  _ |  j |  _ z | j |  j	 d  Wd  | |  _ | |  _ d  |  _	 Xd St
 j |  | | | |  Sd  S)Nr   r   )$_FRAGMENT_BUILDER_INTERNAL_SYSTEM_IDrT   rU   rK   ZExternalEntityParserCreater   ZcreateDocumentFragmentr   rw   r   rE   rn   )r   r   r   r   r   Zold_documentZold_cur_noders   r   r   r   rn     s    				
z+FragmentBuilder.external_entity_ref_handler)r/   r0   r1   r   r   rL   r~   r   r   r   rn   r   r   r   r   r   R  s   	$r   c               @   s^   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z	 d S)
Namespacesz7Mix-in class for builders; adds support for namespaces.c             C   s   g  |  _  d  S)N)_ns_ordered_prefixes)r   r   r   r   _initNamespaces  s    zNamespaces._initNamespacesc             C   s   t  j d d  } d | _ | S)z'Create a new namespace-handling parser.Znamespace_separatorr7   T)r   rN   Znamespace_prefixes)r   rs   r   r   r   rO     s    	zNamespaces.createParserc             C   s/   t  j |  |  |  j j r+ |  j | _ n  d S)z.Insert the namespace-handlers onto the parser.N)rE   rQ   rF   Znamespace_declarationsstart_namespace_decl_handlerZStartNamespaceDeclHandler)r   rs   r   r   r   rQ     s    zNamespaces.installc             C   s   |  j  j | | f  d S)z/Push this namespace declaration on our storage.N)r   r   )r   rB   r@   r   r   r   r     s    z'Namespaces.start_namespace_decl_handlerc             C   s-  d | k r* t  |  |  \ } } } } n t } | } d  } t } t j | | | |  } |  j | _ t |  j |  | |  _ |  j	 rx |  j	 D]t \ } } | r t j
 t |  d |  t | d  } n t j
 d t d t  } | | _ |  j | _ t | |  q W|  j	 d  d   =n  | r)| j   | j }	 | j }
 x t d t |  d  D] } | | } | | d } d | k rt  |  |  \ } } } } t j
 | | | |  } | |	 | <| |
 | | f <n2 t j
 | t | t  } | |	 | <| |
 t | f <|  j | _ | | _ | | _ qXWn  d  S)Nr7   zxmlns:xmlnsr   r   r   )rD   r   r   r   ZElementrT   r   r	   rU   r   r   r6   r   r   r
   Z_ensure_attributes_attrs_attrsNSr   r;   ZownerElement)r   r=   r   r@   rA   rB   rC   r   r   r   r   r   r#   r   r   r   r   r     sP    			
		


	z Namespaces.start_element_handlerc             C   s   |  j  } d | k rl t |  |  \ } } } } | j | k r] | j | k r] | j | k s t d   n6 | j | k s t d   | j t k s t d   | j |  _  |  j	 |  d  S)Nr7   z$element stack messed up! (namespace)z&element stack messed up - bad nodeNamez*element stack messed up - bad namespaceURI)
rU   rD   r'   r(   rB   r9   r   r   r   r   )r   r=   rU   r@   rA   rB   rC   r   r   r   r\     s    			zNamespaces.end_element_handlerN)
r/   r0   r1   r   r   rO   rQ   r   r   r\   r   r   r   r   r     s   5r   c               @   s"   e  Z d  Z d Z d d   Z d S)ExpatBuilderNSz*Document builder that supports namespaces.c             C   s   t  j |   |  j   d  S)N)rE   rL   r   )r   r   r   r   rL   )  s    zExpatBuilderNS.resetN)r/   r0   r1   r   rL   r   r   r   r   r   &  s   r   c               @   s.   e  Z d  Z d Z d d   Z d d   Z d S)FragmentBuilderNSz*Fragment builder that supports namespaces.c             C   s   t  j |   |  j   d  S)N)r   rL   r   )r   r   r   r   rL   1  s    zFragmentBuilderNS.resetc             C   s   d } |  j  } g  } x | r t | d  r x | j j   D]p \ } } | | k r[ q= n  | j |  | r{ d | } n d } | r d | | | f } q= d | | f } q= Wn  | j } q W| S)zNReturn string of namespace attributes from this element and
        ancestors.ru   _ns_prefix_urizxmlns:r   z%s
    %s='%s'z %s='%s')r   hasattrr   itemsr   r   )r   attrsr   r   rB   r@   Zdeclnamer   r   r   r   5  s"    		zFragmentBuilderNS._getNSattrsN)r/   r0   r1   r   rL   r   r   r   r   r   r   .  s   r   c               @   s   e  Z d  Z d Z d S)rz   zEException raised to short-circuit parsing in InternalSubsetExtractor.N)r/   r0   r1   r   r   r   r   r   rz   S  s   rz   c               @   sp   e  Z d  Z d Z d Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z	 d d   Z
 d d   Z d S)r   zBXML processor which can rip out the internal document type subset.Nc             C   s   |  j  S)z'Return the internal subset as a string.)r   )r   r   r   r   r   \  s    z!InternalSubsetExtractor.getSubsetc             C   s-   y t  j |  |  Wn t k
 r( Yn Xd  S)N)rE   r~   rz   )r   r{   r   r   r   r~   `  s    z!InternalSubsetExtractor.parseFilec             C   s-   y t  j |  |  Wn t k
 r( Yn Xd  S)N)rE   r   rz   )r   r   r   r   r   r   f  s    z#InternalSubsetExtractor.parseStringc             C   s   |  j  | _ |  j | _ d  S)N)rX   rY   r   r[   )r   rs   r   r   r   rQ   l  s    zInternalSubsetExtractor.installc             C   sF   | r9 |  j    } g  |  _ |  j j | _ |  j | _ n	 t    d  S)N)rR   r   r   ZDefaultHandlerr   r   rz   )r   r=   r   r   r   rs   r   r   r   rX   p  s    	z2InternalSubsetExtractor.start_doctype_decl_handlerc             C   s@   d j  |  j  j d d  j d d  } | |  _ t    d  S)Nru   z

)joinr   replacerz   )r   r5   r   r   r   r   z  s    *	z0InternalSubsetExtractor.end_doctype_decl_handlerc             C   s   t     d  S)N)rz   )r   r=   r   r   r   r   r     s    z-InternalSubsetExtractor.start_element_handler)r/   r0   r1   r   r   r   r~   r   rQ   rX   r   r   r   r   r   r   r   W  s   
r   Tc          	   C   sg   | r t    } n	 t   } t |  t  rT t |  d   } | j |  } Wd QXn | 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   rE   
isinstancestropenr~   )r{   
namespacesr4   fpresultr   r   r   parse  s    	r   c             C   s(   | r t    } n	 t   } | j |   S)zOParse a document from a string, returning the resulting
    Document node.
    )r   rE   r   )r   r   r4   r   r   r   r     s    	r   c          	   C   sm   | r t  |  } n t |  } t |  t  rZ t |  d   } | j |  } Wd QXn | j |   } | S)zParse 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   r4   r   r   r   r   r   parseFragment  s    r   c             C   s.   | r t  |  } n t |  } | j |   S)zParse 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   r4   r   r   r   parseFragmentString  s    r   c             C   s!   |  j  r t |   St |   Sd S)z,Create a builder based on an Options object.N)r   r   rE   )rM   r   r   r   makeBuilder  s    	
r   )3r   Zxml.domr   r   r   r   r   r   Zxml.parsersr   Zxml.dom.minidomr	   r
   Zxml.dom.NodeFilterr   r   r   r   ZDOMBuilderFilterr   r   r   r   ZgetDOMImplementationrS   ZTypeInfor!   objectr   r6   rD   rE   r   rH   r   r   r   r   r   r   r   r   r   	Exceptionrz   r   r   r   r   r   r   r   r   r   r   <module>   s^   			3 B:u_%,