B
    È S]¬‹  ã               @   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 ¡ Ze dd¡e dd	¡e dd
¡e dd¡e dd¡e dd¡e dd¡e dd¡e dd¡dœ	ZG dd„ deƒZdd„ Zdd„ ZG dd„ dƒZeeefZ G dd„ deƒZ!G dd„ deƒZ"G dd„ de"ƒZ#G d d!„ d!e"ƒZ$d"Z%d#e% Z&G d$d%„ d%eƒZ'G d&d'„ d'ƒZ(G d(d)„ d)e(eƒZ)G d*d+„ d+e(e'ƒZ*G d,d-„ d-e+ƒZ,G d.d/„ d/eƒZ-d;d1d2„Z.d<d3d4„Z/d=d5d6„Z0d>d7d8„Z1d9d:„ Z2dS )?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)Ú
NodeFilterNZcdataÚenumerationÚentityÚentitiesÚidZidrefZidrefsZnmtokenZnmtokens)	ZCDATAÚENUMZENTITYZENTITIESÚIDZIDREFZIDREFSZNMTOKENZNMTOKENSc               @   sZ   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   ú%lib/python3.7/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   sJ   xB| j D ]8}|d |kr|d }|d dkr4td S t|d  S qW tjS )Né   éþÿÿÿ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 r$| j d }|tjjtjjfkS dS d 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S dS d S )Nr   F)r   r   r   ZXML_CTYPE_EMPTY)r   r   r   r   ÚisEmpty_   s    zElementInfo.isEmptyc             C   s,   x&| j D ]}|d |kr|d dkS qW dS )Nr   r   r   F)r   )r   r#   r$   r   r   r   ÚisIde   s    zElementInfo.isIdc             C   s   |   ||f¡S )N)r-   )r   ZeuriZenameZaurir#   r   r   r   ÚisIdNSk   s    zElementInfo.isIdNS)N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   r   r&   r)   r+   r,   r-   r.   r   r   r   r   r   <   s   

r   c             C   s   |   ||¡S )N)Ú_intern_setdefault)ÚbuilderÚsr   r   r   Ú_interno   s    r6   c             C   s¤   d|kst ‚| d¡}| j}t|ƒdkr^|\}}}|||ƒ}d||f }|||ƒ}|||ƒ}n4t|ƒdkr†|\}}t}|||ƒ }}ntd| ƒ‚|||ƒ|||fS )Nú é   z%s:%sé   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    



rE   c               @   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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d1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ ZdS )<ÚExpatBuilderzPDocument builder that uses Expat to build a ParsedXML.DOM document
    instance.Nc             C   sP   |d krt  ¡ }|| _| jjd k	r2t| jjƒ| _nd | _t| _d | _|  	¡  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  ¡ S )zCreate a new parser object.)r   ÚParserCreate)r   r   r   r   ÚcreateParser—   s    zExpatBuilder.createParserc             C   sF   | j s@|  ¡ | _ | j jj| _d| j _d| j _d| j _|  | j ¡ | j S )z7Return the parser object, creating a new one if needed.T)	rL   rP   r@   Ú
setdefaultr3   Zbuffer_textZordered_attributesZspecified_attributesÚinstall)r   r   r   r   Ú	getParser›   s    
zExpatBuilder.getParserc             C   s,   t  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   rM   ¦   s
    
zExpatBuilder.resetc             C   s–   | j |_| j|_| j|_| j|_| jj	r0| j
|_| j|_| jjrH| j|_| jjrj| 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ÚProcessingInstructionHandlerrG   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   rR   ®   s$    
zExpatBuilder.installc             C   s†   |   ¡ }d}yLx:| d¡}|s P | |d¡ |rB| jjrB|  |¡ d}qW | dd¡ W n tk
rl   Y nX | j}|  ¡  d| _|S )zIParse a document from a file object, returning the document
        node.Ti @  r   FÚ N)	rS   ÚreadÚParserU   ÚdocumentElementÚ_setup_subsetÚParseEscaperM   rL   )r   Úfilert   Zfirst_bufferÚbufferÚdocr   r   r   Ú	parseFileÅ   s$    

zExpatBuilder.parseFilec             C   sP   |   ¡ }y| |d¡ |  |¡ W n tk
r6   Y nX | j}|  ¡  d| _|S )z<Parse a document from a string, returning the document node.TN)rS   rw   ry   rz   rU   rM   rL   )r   Ústringrt   r}   r   r   r   ÚparseStringÛ   s    zExpatBuilder.parseStringc             C   s.   | j jr*tƒ }| |¡ | ¡ }|| j j_dS )z/Load the internal subset if there might be one.N)rU   ÚdoctypeÚInternalSubsetExtractorr€   Ú	getSubsetÚinternalSubset)r   r|   Z	extractorÚsubsetr   r   r   ry   è   s
    
zExpatBuilder._setup_subsetc             C   s¤   | j j |||¡}| j |_t| j |ƒ || j _| jrj| j |¡tkrjd | j _| j j	d= d }d | j
_d | j
_|r |d k	r†g |j_g |j_d | j
_d | j
_| j| j
_d S )Néÿÿÿÿ)rU   ÚimplementationZcreateDocumentTypeÚownerDocumentr	   r   rJ   Ú
acceptNodeÚFILTER_REJECTÚ
childNodesrL   rb   rd   r   Ú_seqÚ	notationsrg   r`   Úend_doctype_decl_handlerÚEndDoctypeDeclHandler)r   ZdoctypeNameÚsystemIdÚpublicIdÚhas_internal_subsetr   r   r   r   rY   ð   s$    

z'ExpatBuilder.start_doctype_decl_handlerc             C   s2   | j jr| j| j_| j| j_| js.| js.t	| _
d S )N)rG   re   rf   rL   rg   r_   r`   rW   rJ   r   Ú_finish_end_element)r   r   r   r   rŽ     s
    

z%ExpatBuilder.end_doctype_decl_handlerc             C   s@   | j  ||¡}t| j|ƒ | jr<| j |¡tkr<| j |¡ d S )N)rU   ZcreateProcessingInstructionr	   rV   rJ   r‰   rŠ   ÚremoveChild)r   ÚtargetÚdataÚnoder   r   r   r_     s    zExpatBuilder.pi_handlerc             C   sœ   | j j}| jrH| jr4|d jtkr4|d  |¡ d S | j |¡}d| _nD|rv|d jt	krv|d }|j
| }||_
d S t ¡ }||_
| j|_t| j |ƒ d S )Nr†   T)rV   r‹   rX   Ú_cdata_continueÚnodeTypeÚCDATA_SECTION_NODEZ
appendDatarU   ZcreateCDATASectionÚ	TEXT_NODEr–   r   ÚTextrˆ   r	   )r   r–   r‹   r—   Úvaluer   r   r   rl     s"    
z)ExpatBuilder.character_data_handler_cdatac             C   s^   | j j}|r2|d jtkr2|d }|j| |_d S t ¡ }|j| |_| j|_t	| j |ƒ d S )Nr†   )
rV   r‹   r™   r›   r–   r   rœ   rU   rˆ   r	   )r   r–   r‹   r—   r   r   r   rn   &  s    z#ExpatBuilder.character_data_handlerc       
      C   s€   |rd S | j jsd S | j ||||¡}|d k	rF| j |¡}	|j |	¡ | jjjj |¡ | j	r|| j	 
|¡tkr|| jjjjd= d S )Nr†   )rG   r   rU   Z_create_entityZcreateTextNoder‹   Úappendr   rŒ   rJ   r‰   rŠ   )
r   Z
entityNameZis_parameter_entityr   Úbaser   r‘   ÚnotationNamer—   Úchildr   r   r   ra   1  s    
z ExpatBuilder.entity_decl_handlerc             C   sJ   | j  |||¡}| j jjj |¡ | jrF| j |¡tkrF| j jjjd= d S )Nr†   )	rU   Z_create_notationr   r   rŒ   rž   rJ   r‰   ÚFILTER_ACCEPT)r   r    rŸ   r   r‘   r—   r   r   r   rc   C  s    z"ExpatBuilder.notation_decl_handlerc             C   s>   | j  |¡}t| j|ƒ | jr:| j |¡tkr:| j |¡ d S )N)rU   ZcreateCommentr	   rV   rJ   r‰   rŠ   r”   )r   r–   r—   r   r   r   rf   I  s    zExpatBuilder.comment_handlerc             C   s   d| _ d| _d S )NTF)rX   r˜   )r   r   r   r   rh   O  s    z(ExpatBuilder.start_cdata_section_handlerc             C   s   d| _ d| _d S )NF)rX   r˜   )r   r   r   r   rj   S  s    z&ExpatBuilder.end_cdata_section_handlerc             C   s   dS )Nr   r   )r   ÚcontextrŸ   r   r‘   r   r   r   ro   W  s    z(ExpatBuilder.external_entity_ref_handlerc             C   s2   | j d kr| jst| _| j|  ¡ _|  ||¡ d S )N)rJ   rW   r   r“   Ústart_element_handlerrS   r\   )r   r>   Ú
attributesr   r   r   r[   Z  s    z"ExpatBuilder.first_element_handlerc             C   sŽ   | j  |¡}t| j|ƒ || _|rtxPtdt|ƒdƒD ]<}t || td t	¡}||d  }||_
| j |_t||ƒ q4W || j jk	rŠ|  |¡ d S )Nr   r9   r   )rU   ZcreateElementr	   rV   Úranger<   r   ÚAttrr   r   r   rˆ   r
   rx   rK   )r   r>   r¥   r—   ÚiÚar   r   r   r   r¤   `  s    z"ExpatBuilder.start_element_handlerc             C   sj   | j rf|| jjkrd S | j  |¡}|tkr4t| ƒ n|tkrFt| ƒ nd S |j| _	|j 
|¡ | ¡  d S )N)rJ   rU   rx   ÚstartContainerrŠ   ÚRejecterÚFILTER_SKIPÚSkipperÚ
parentNoderV   r”   Úunlink)r   r—   Zfiltr   r   r   rK   q  s    

z"ExpatBuilder._finish_start_elementc             C   s   | j }|j| _ |  |¡ d S )N)rV   r®   r“   )r   r>   rV   r   r   r   r]   ˆ  s    z ExpatBuilder.end_element_handlerc             C   s\   | j  |j¡}|r|  ||¡ | jrX|| jjkr4d S | j |¡tkrX| j	 
|¡ | ¡  d S )N)rW   Úgetr   Ú_handle_white_text_nodesrJ   rU   rx   r‰   rŠ   rV   r”   r¯   )r   rV   r$   r   r   r   r“     s    z ExpatBuilder._finish_end_elementc             C   sb   | j js| ¡ sd S g }x,|jD ]"}|jtkr |j ¡ s | |¡ q W x|D ]}| 	|¡ qLW d S )N)
rG   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   s>   | j  |¡}|d kr&t||ƒ| j |< n|jd ks4t‚||_d S )N)rW   r°   r   r   r:   )r   r>   r   r$   r   r   r   rr   ©  s
    z!ExpatBuilder.element_decl_handlerc          
   C   sF   | j  |¡}|d kr&t|ƒ}|| j |< |j d |d d |d||g¡ d S )Nr   )rW   r°   r   r   rž   )r   Úelemr>   r*   ÚdefaultZrequiredr$   r   r   r   rs   ±  s    
z!ExpatBuilder.attlist_decl_handlerc             C   s2   || j _|| j _|dkr.|r&d| j _nd| j _d S )Nr   TF)rU   ÚversionÚencodingÚ
standalone)r   r¶   r·   r¸   r   r   r   rq   ¹  s    
zExpatBuilder.xml_decl_handler)N) r/   r0   r1   Ú__doc__r   rP   rS   rM   rR   r~   r€   ry   rY   rŽ   r_   rl   rn   ra   rc   rf   rh   rj   ro   r[   r¤   rK   r]   r“   r±   rr   rs   rq   r   r   r   r   rF   …   s:   
rF   c               @   s   e Zd ZdZdZdd„ Zdd„ Zdd„ Zej	e
jeje
jeje
jeje
jeje
jeje
jeje
jeje
jeje
jeje
jeje
jej e
j!iZ"d	S )
rI   zoWrapper around a DOMBuilderFilter which implements the checks
    to make the whatToShow filter attribute work.)rH   c             C   s
   || _ d S )N)rH   )r   rH   r   r   r   r   Î  s    z#FilterVisibilityController.__init__c             C   sT   | j |j }| jj|@ rL| j |¡}|tkr0t‚|tkrHtdt	|ƒ ƒ‚|S t
S d S )Nz)startContainer() returned illegal value: )Ú_nodetype_maskr™   rH   Ú
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 |¡}|tkr0t‚|tkrd|j}x |j	d d … D ]}| 
|¡ qNW tS |tkr|tdt|ƒ ƒ‚|S tS d S )Nz%acceptNode() returned illegal value: )rº   r™   rH   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)#r/   r0   r1   r¹   r2   r   rª   r‰   r   ZELEMENT_NODEr   ZSHOW_ELEMENTZATTRIBUTE_NODEZSHOW_ATTRIBUTEr›   Z	SHOW_TEXTrš   ZSHOW_CDATA_SECTIONZENTITY_REFERENCE_NODEZSHOW_ENTITY_REFERENCEZENTITY_NODEZSHOW_ENTITYZPROCESSING_INSTRUCTION_NODEZSHOW_PROCESSING_INSTRUCTIONZCOMMENT_NODEZSHOW_COMMENTÚDOCUMENT_NODEZSHOW_DOCUMENTZDOCUMENT_TYPE_NODEZSHOW_DOCUMENT_TYPEZDOCUMENT_FRAGMENT_NODEZSHOW_DOCUMENT_FRAGMENTZNOTATION_NODEZSHOW_NOTATIONrº   r   r   r   r   rI   È  s"   rI   c               @   s   e Zd ZdZdd„ ZdS )ÚFilterCrutch)Ú_builderÚ_levelÚ
_old_startÚ_old_endc             C   s6   d| _ || _|j}|j| _|j| _| j|_| j|_d S )Nr   )	rÅ   rÄ   rL   r\   rÆ   r^   rÇ   r¤   r]   )r   r4   rt   r   r   r   r     s    zFilterCrutch.__init__N)r/   r0   r1   r2   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S )	r«   r   c             C   s0   t  | |¡ |j}xdD ]}t||d ƒ qW d S )N)r`   rg   rm   ri   rk   rp   )rÃ   r   rL   Úsetattr)r   r4   rt   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   s@   | j dkr0| jj}| j |¡ | j|_| j|_n| j d | _ d S )Nr   r   )rÅ   rÄ   rL   rR   rÆ   r\   rÇ   r^   )r   rÉ   rt   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dZdd„ Zdd„ ZdS )r­   r   c             G   s.   | j j}| j|Ž  | j j|k	r*| jd | _d S )Nr   )rÄ   rV   rÆ   rÅ   )r   rÉ   r—   r   r   r   r¤   -  s    
zSkipper.start_element_handlerc             G   sD   | j dkr*| j| jj_| j| jj_d | _n| j d | _ | j|Ž  d S )Nr   r   )rÅ   rÆ   rÄ   rL   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               @   sJ   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 )Ú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.
    Nc             C   s6   |j tkr|| _|| _n|j| _|| _t | |¡ d S )N)r™   rÂ   ÚoriginalDocumentr£   rˆ   rF   r   )r   r£   rN   r   r   r   r   [  s    
zFragmentBuilder.__init__c             C   s   t  | ¡ d | _d S )N)rF   rM   Úfragment)r   r   r   r   rM   d  s    
zFragmentBuilder.resetc             C   s   |   | ¡ ¡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}d}|rV|jp*|  ¡ }|jrDd|j|jf }qZ|jrZd|j }nd}|  ¡ }t	|||f }y| 
|d¡ W n   |  ¡  ‚ Y nX | j}|  ¡  |S )zMParse a document fragment from a string, returning the
        fragment node.ru   zPUBLIC "%s" "%s"zSYSTEM "%s"r   )Ú_sourcerS   rË   r   r„   Ú_getDeclarationsr‘   r   Ú_getNSattrsÚ_FRAGMENT_BUILDER_TEMPLATErw   rM   rÌ   )	r   r   rt   r   Zidentr…   ZnsattrsrU   rÌ   r   r   r   r€   m  s,    zFragmentBuilder.parseStringc             C   s  | j jj}d}|rxbt|jjƒD ]R}|j |¡}|r>|d }d||jf }|jrfd||j|j	f }q"d||j	f }q"W x˜t|j
jƒD ]ˆ}|j
 |¡}|r¢|d }d||jf }|jrÊd||j|j	f }n&|j	ràd||j	f }nd	||jjf }|jrd
||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.
        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   Ú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rh| j}| j}| j |¡}| j| _| j ¡ | _| j| _z| | j	d¡ W d || _|| _d | _	X dS t
 | ||||¡S d S )Nr   r†   )Ú$_FRAGMENT_BUILDER_INTERNAL_SYSTEM_IDrU   rV   rL   ZExternalEntityParserCreaterË   ZcreateDocumentFragmentrÌ   rw   rÍ   rF   ro   )r   r£   rŸ   r   r‘   Zold_documentZold_cur_nodert   r   r   r   ro   °  s    z+FragmentBuilder.external_entity_ref_handler)N)r/   r0   r1   r¹   r   rM   r~   r€   rÎ   rÏ   ro   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.r7   )Znamespace_separatorT)r   rO   Znamespace_prefixes)r   rt   r   r   r   rP   Ï  s    zNamespaces.createParserc             C   s    t  | |¡ | jjr| j|_dS )z.Insert the namespace-handlers onto the parser.N)rF   rR   rG   Znamespace_declarationsÚstart_namespace_decl_handlerZStartNamespaceDeclHandler)r   rt   r   r   r   rR   Õ  s    zNamespaces.installc             C   s   | j  ||f¡ dS )z/Push this namespace declaration on our storage.N)r×   rž   )r   rC   rA   r   r   r   rÙ   Ü  s    z'Namespaces.start_namespace_decl_handlerc             C   sŠ  d|krt | |ƒ\}}}}nt}|}d }t}t ||||¡}| j|_t| j|ƒ || _| j	rÄxZ| j	D ]P\}}|rŒt 
t| d| ƒt|d¡}nt 
dtdt¡}||_| j|_t||ƒ qdW | j	d d …= |r†| ¡  |j}	|j}
x¦tdt|ƒdƒD ]’}|| }||d  }d|krJt | |ƒ\}}}}t 
||||¡}||	|< ||
||f< n$t 
|t|t¡}||	|< ||
t|f< | j|_||_||_qðW d S )Nr7   zxmlns:Úxmlnsr   r9   r   )rE   r   r   r   ZElementrU   rˆ   r	   rV   r×   r§   r6   r   r   r
   Z_ensure_attributesÚ_attrsÚ_attrsNSr¦   r<   ZownerElement)r   r>   r¥   rA   rB   rC   rD   r—   r©   rÛ   rÜ   r¨   r#   r   r   r   r   r¤   à  sP    
z Namespaces.start_element_handlerc             C   s‚   | j }d|krHt| |ƒ\}}}}|j|kr>|j|kr>|j|ksltdƒ‚n$|j|ksZtdƒ‚|jtksltdƒ‚|j| _ |  	|¡ d S )Nr7   z$element stack messed up! (namespace)z&element stack messed up - bad nodeNamez*element stack messed up - bad namespaceURI)
rV   rE   r'   r(   rC   r:   rÔ   r   r®   r“   )r   r>   rV   rA   rB   rC   rD   r   r   r   r]     s    

zNamespaces.end_element_handlerN)
r/   r0   r1   r¹   rØ   rP   rR   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  | ¡ |  ¡  d S )N)rF   rM   rØ   )r   r   r   r   rM   )  s    
zExpatBuilderNS.resetN)r/   r0   r1   r¹   rM   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  | ¡ |  ¡  d S )N)rÊ   rM   rØ   )r   r   r   r   rM   1  s    
zFragmentBuilderNS.resetc             C   sŠ   d}| j }g }xv|r„t|dƒr|x\|j ¡ D ]N\}}||kr<q*| |¡ |rTd| }nd}|rld|||f }q*d||f }q*W |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³   rC   rA   Zdeclnamer   r   r   rÏ   5  s"    



zFragmentBuilderNS._getNSattrsN)r/   r0   r1   r¹   rM   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               @   sL   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  | |¡ W n tk
r$   Y nX d S )N)rF   r~   rz   )r   r{   r   r   r   r~   `  s    z!InternalSubsetExtractor.parseFilec             C   s*   yt  | |¡ W n tk
r$   Y nX d S )N)rF   r€   rz   )r   r   r   r   r   r€   f  s    z#InternalSubsetExtractor.parseStringc             C   s   | j |_| j|_d S )N)rY   rZ   r¤   r\   )r   rt   r   r   r   rR   l  s    zInternalSubsetExtractor.installc             C   s0   |r&|   ¡ }g | _| jj|_| j|_ntƒ ‚d S )N)rS   r…   rž   ZDefaultHandlerrŽ   r   rz   )r   r>   r‘   r   r’   rt   r   r   r   rY   p  s    

z2InternalSubsetExtractor.start_doctype_decl_handlerc             C   s,   d  | j¡ dd¡ 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€   rR   rY   rŽ   r¤   r   r   r   r   r‚   W  s   
r‚   Tc          	   C   sL   |rt ƒ }ntƒ }t| tƒr>t| dƒ}| |¡}W dQ R X n
| | ¡}|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{   Ú
namespacesr4   ÚfpÚresultr   r   r   Úparseƒ  s    

rî   c             C   s   |rt ƒ }ntƒ }| | ¡S )zOParse a document from a string, returning the resulting
    Document node.
    )rÝ   rF   r€   )r   rë   r4   r   r   r   r€   •  s    r€   c          	   C   sP   |rt |ƒ}nt|ƒ}t| tƒrBt| dƒ}| |¡}W dQ R X n
| | ¡}|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ë   r4   rì   rí   r   r   r   ÚparseFragment   s    


rï   c             C   s    |rt |ƒ}nt|ƒ}| | ¡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ë   r4   r   r   r   ÚparseFragmentString´  s    
rð   c             C   s   | j rt| ƒS t| ƒS dS )z,Create a builder based on an Options object.N)rë   rÝ   rF   )rN   r   r   r   ÚmakeBuilderÀ  s    rñ   )T)T)T)T)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getDOMImplementationrT   ZTypeInfor!   Úobjectr   r6   rE   rF   r½   rI   rÃ   r«   r­   rÕ   rÐ   rÊ   rÖ   rÝ   rÞ   Ú	Exceptionrz   r‚   rî   r€   rï   rð   rñ   r   r   r   r   Ú<module>   s^   







3  C
:u_%,



