U
    ¼Ê¦i¬‹  ã                   @   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   ú*/usr/lib/python3.8/xml/dom/expatbuilder.pyÚ__init__?   s    zElementInfo.__init__c                 C   s   | j | j| jfS r   r   ©r   r   r   r   Ú__getstate__D   s    zElementInfo.__getstate__c                 C   s   |\| _ | _| _d S r   r   )r   Ústater   r   r   Ú__setstate__G   s    zElementInfo.__setstate__c                 C   sN   | j D ]@}|d |kr|d }|d dkr6td   S t|d    S q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 r   )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 r-   )r   r   r   ZXML_CTYPE_EMPTYr   r   r   r   ÚisEmpty_   s    zElementInfo.isEmptyc                 C   s,   | j D ] }|d |kr|d dk  S qdS )Nr!   r"   r   F)r   )r   r&   r'   r   r   r   ÚisIde   s    
zElementInfo.isIdc                 C   s   |   ||f¡S r   )r1   )r   ZeuriZenameZaurir&   r   r   r   ÚisIdNSk   s    zElementInfo.isIdNS)N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   r    r)   r,   r/   r0   r1   r2   r   r   r   r   r   <   s   

r   c                 C   s   |   ||¡S r   )Ú_intern_setdefault)ÚbuilderÚsr   r   r   Ú_interno   s    r:   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Úsplitr7   Úlenr   Ú
ValueError)r8   ÚnameÚpartsÚinternÚuriÚ	localnameÚprefixÚqnamer   r   r   Ú_parse_ns_namer   s    



rI   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 r   )
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   ÚParserCreater   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)	rP   rT   rD   Ú
setdefaultr7   Zbuffer_textZordered_attributesZspecified_attributesÚinstallr   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Ú_cdatar   r   r   r   rQ   ¦   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ÚProcessingInstructionHandlerrK   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   rV   ®   s$    
zExpatBuilder.installc                 C   s‚   |   ¡ }d}zH| d¡}|sqF| |d¡ |r@| jjr@|  |¡ d}q| dd¡ W n tk
rh   Y nX | j}|  ¡  d| _|S )zIParse a document from a file object, returning the document
        node.Ti @  r   FÚ N)	rW   ÚreadÚParserY   ÚdocumentElementÚ_setup_subsetÚParseEscaperQ   rP   )r   Úfilery   Zfirst_bufferÚbufferÚdocr   r   r   Ú	parseFileÅ   s"    

zExpatBuilder.parseFilec                 C   sP   |   ¡ }z| |d¡ |  |¡ W n tk
r6   Y nX | j}|  ¡  d| _|S )z<Parse a document from a string, returning the document node.TN)rW   r|   r~   r   rY   rQ   rP   )r   Ústringry   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)rY   ÚdoctypeÚInternalSubsetExtractorr…   Ú	getSubsetÚinternalSubset)r   r�   Z	extractorÚsubsetr   r   r   r~   è   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éÿÿÿÿ)rY   ÚimplementationZcreateDocumentTypeÚownerDocumentr	   r†   rN   Ú
acceptNodeÚFILTER_REJECTÚ
childNodesrP   rf   rh   r   Ú_seqÚ	notationsrk   rd   Úend_doctype_decl_handlerÚEndDoctypeDeclHandler)r   ZdoctypeNameÚsystemIdÚpublicIdÚhas_internal_subsetr†   r   r   r   r]   ð   s*      ÿ
z'ExpatBuilder.start_doctype_decl_handlerc                 C   s2   | j jr| j| j_| j| j_| js.| js.t	| _
d S r   )rK   ri   rj   rP   rk   rc   rd   r[   rN   r   Ú_finish_end_elementr   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 r   )rY   ZcreateProcessingInstructionr	   rZ   rN   r�   r�   ÚremoveChild)r   ÚtargetÚdataÚnoder   r   r   rc     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)rZ   r‘   r\   Ú_cdata_continueÚnodeTypeÚCDATA_SECTION_NODEZ
appendDatarY   ZcreateCDATASectionÚ	TEXT_NODErœ   r   ÚTextrŽ   r	   )r   rœ   r‘   r�   Úvaluer   r   r   rp     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 r‹   )
rZ   r‘   rŸ   r¡   rœ   r   r¢   rY   rŽ   r	   )r   rœ   r‘   r�   r   r   r   rr   &  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 r‹   )rK   r   rY   Z_create_entityZcreateTextNoder‘   Úappendr†   r’   rN   r�   r�   )
r   Z
entityNameZis_parameter_entityr£   Úbaser–   r—   ÚnotationNamer�   Úchildr   r   r   re   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 r‹   )	rY   Z_create_notationr†   r“   r’   r¤   rN   r�   ÚFILTER_ACCEPT)r   r¦   r¥   r–   r—   r�   r   r   r   rg   C  s    z"ExpatBuilder.notation_decl_handlerc                 C   s>   | j  |¡}t| j|ƒ | jr:| j |¡tkr:| j |¡ d S r   )rY   ZcreateCommentr	   rZ   rN   r�   r�   rš   )r   rœ   r�   r   r   r   rj   I  s    zExpatBuilder.comment_handlerc                 C   s   d| _ d| _d S )NTF©r\   rž   r   r   r   r   rl   O  s    z(ExpatBuilder.start_cdata_section_handlerc                 C   s   d| _ d| _d S )NFr©   r   r   r   r   rn   S  s    z&ExpatBuilder.end_cdata_section_handlerc                 C   s   dS ©Nr!   r   )r   Úcontextr¥   r–   r—   r   r   r   rs   W  s    z(ExpatBuilder.external_entity_ref_handlerc                 C   s2   | j d kr| jst| _| j|  ¡ _|  ||¡ d S r   )rN   r[   r   r™   Ústart_element_handlerrW   r`   )r   rB   Ú
attributesr   r   r   r_   Z  s    z"ExpatBuilder.first_element_handlerc                 C   sŠ   | j  |¡}t| j|ƒ || _|rptdt|ƒdƒD ]<}t || td t	¡}||d  }||_
| j |_t||ƒ q2|| j jk	r†|  |¡ d S )Nr   r=   r!   )rY   ZcreateElementr	   rZ   Úranger@   r   ÚAttrr   r   r£   rŽ   r
   r}   rO   )r   rB   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 r   )rN   rY   r}   ÚstartContainerr�   ÚRejecterÚFILTER_SKIPÚSkipperÚ
parentNoderZ   rš   Úunlink)r   r�   Zfiltr   r   r   rO   q  s    

z"ExpatBuilder._finish_start_elementc                 C   s   | j }|j| _ |  |¡ d S r   )rZ   r¶   r™   )r   rB   rZ   r   r   r   ra   ˆ  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 r   )r[   Úgetr   Ú_handle_white_text_nodesrN   rY   r}   r�   r�   rZ   rš   r·   )r   rZ   r'   r   r   r   r™   �  s    z ExpatBuilder._finish_end_elementc                 C   sZ   | j js| ¡ sd S g }|jD ]"}|jtkr|j ¡ s| |¡ q|D ]}| 	|¡ qFd S r   )
rK   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 r   )r[   r¸   r   r   r>   )r   rB   r   r'   r   r   r   rv   ©  s
    z!ExpatBuilder.element_decl_handlerc              
   C   sF   | j  |¡}|d kr&t|ƒ}|| j |< |j d |d d |d||g¡ d S ©Nr   )r[   r¸   r   r   r¤   )r   ÚelemrB   r.   ÚdefaultZrequiredr'   r   r   r   rw   ±  s    
ÿz!ExpatBuilder.attlist_decl_handlerc                 C   s2   || j _|| j _|dkr.|r&d| j _nd| j _d S )Nr   TF)rY   ÚversionÚencodingÚ
standalone)r   r¿   rÀ   rÁ   r   r   r   ru   ¹  s    
zExpatBuilder.xml_decl_handler)N) r3   r4   r5   Ú__doc__r   rT   rW   rQ   rV   rƒ   r…   r~   r]   r”   rc   rp   rr   re   rg   rj   rl   rn   rs   r_   r¬   rO   ra   r™   r¹   rv   rw   ru   r   r   r   r   rJ   …   s:   
rJ   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 )
rM   zoWrapper around a DOMBuilderFilter which implements the checks
    to make the whatToShow filter attribute work.©rL   c                 C   s
   || _ d S r   rÃ   )r   rL   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Ÿ   rL   Ú
whatToShowr²   ÚFILTER_INTERRUPTr   Ú_ALLOWED_FILTER_RETURNSrA   Ú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r`|j}|j	d d … D ]}| 
|¡ qLtS |tkrxtdt|ƒ ƒ‚|S tS d S )Nz%acceptNode() returned illegal value: )rÄ   rŸ   rL   rÅ   r�   rÆ   r   r´   r¶   r‘   ZappendChildr�   rÇ   rA   rÈ   r¨   )r   r�   rÉ   rÊ   Úparentr§   r   r   r   r�   Þ  s     
ÿz%FilterVisibilityController.acceptNodeN)#r3   r4   r5   rÂ   r6   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   rM   È  s<               ôrM   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 r¼   )	rÏ   rÎ   rP   r`   rÐ   rb   rÑ   r¬   ra   )r   r8   ry   r   r   r   r     s    zFilterCrutch.__init__N)r3   r4   r5   r6   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   s,   t  | |¡ |j}dD ]}t||d ƒ qd S )N)rd   rk   rq   rm   ro   rt   )rÍ   r   rP   Úsetattr)r   r8   ry   rB   r   r   r   r     s    zRejecter.__init__c                 G   s   | j d | _ d S rª   )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Î   rP   rV   rÐ   r`   rÑ   rb   )r   rÔ   ry   r   r   r   ra      s    

zRejecter.end_element_handlerN)r3   r4   r5   r6   r   r¬   ra   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 rª   )rÎ   rZ   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 rÕ   )rÏ   rÐ   rÎ   rP   r`   rÑ   rb   rÓ   r   r   r   ra   3  s    
zSkipper.end_element_handlerN)r3   r4   r5   r6   r¬   ra   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 r   )rŸ   rÌ   ÚoriginalDocumentr«   rŽ   rJ   r   )r   r«   rR   r   r   r   r   [  s    
zFragmentBuilder.__init__c                 C   s   t  | ¡ d | _d S r   )rJ   rQ   Úfragmentr   r   r   r   rQ   d  s    
zFragmentBuilder.resetc                 C   s   |   | ¡ ¡S )zRParse a document fragment from a file object, returning the
        fragment node.)r…   r{   ©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 }z| 
|d¡ W n   |  ¡  ‚ Y nX | j}|  ¡  |S )zMParse a document fragment from a string, returning the
        fragment node.rz   zPUBLIC "%s" "%s"zSYSTEM "%s"r!   )Ú_sourcerW   r×   r†   r‰   Ú_getDeclarationsr—   r–   Ú_getNSattrsÚ_FRAGMENT_BUILDER_TEMPLATEr|   rQ   rØ   )	r   r„   ry   r†   ZidentrŠ   ZnsattrsrY   rØ   r   r   r   r…   m  s.    
ÿzFragmentBuilder.parseStringc                 C   s  | j jj}d}|�rt|jjƒD ]R}|j |¡}|r<|d }d||jf }|jrdd||j|j	f }q d||j	f }q 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€|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.
        rz   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†   r9   r°   Znotationr   r   r   r   rÛ   ‰  s:    
ÿÿ
z FragmentBuilder._getDeclarationsc                 C   s   dS )Nrz   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 5 || _|| _d | _X dS t
 | ||||¡S d S )Nr!   rŒ   )Ú$_FRAGMENT_BUILDER_INTERNAL_SYSTEM_IDrY   rZ   rP   ZExternalEntityParserCreater×   ZcreateDocumentFragmentrØ   rÚ   r|   rJ   rs   )r   r«   r¥   r–   r—   Zold_documentZold_cur_nodery   r   r   r   rs   °  s(        ÿz+FragmentBuilder.external_entity_ref_handler)N)r3   r4   r5   rÂ   r   rQ   rƒ   r…   rÛ   rÜ   rs   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 r   )Ú_ns_ordered_prefixesr   r   r   r   Ú_initNamespacesÊ  s    zNamespaces._initNamespacesc                 C   s   t jdd�}d|_|S )z'Create a new namespace-handling parser.r;   )Znamespace_separatorT)r   rS   Znamespace_prefixesrx   r   r   r   rT   Ï  s    zNamespaces.createParserc                 C   s    t  | |¡ | jjr| j|_dS )z.Insert the namespace-handlers onto the parser.N)rJ   rV   rK   Znamespace_declarationsÚstart_namespace_decl_handlerZStartNamespaceDeclHandlerrx   r   r   r   rV   Õ  s    ÿzNamespaces.installc                 C   s   | j  ||f¡ dS )z/Push this namespace declaration on our storage.N)rã   r¤   )r   rG   rE   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À| j	D ]P\}}|rŠt 
t| d| ƒt|d¡}nt 
dtdt¡}||_| j|_t||ƒ qb| j	d d …= |�r~| ¡  |j}	|j}
tdt|ƒdƒD ]’}|| }||d  }d|k�rDt | |ƒ\}}}}t 
||||¡}||	|< ||
||f< n$t 
|t|t¡}||	|< ||
t|f< | j|_||_||_qêd S )Nr;   úxmlns:Úxmlnsr   r=   r!   )rI   r   r   r   ZElementrY   rŽ   r	   rZ   rã   r¯   r:   r   r£   r
   Z_ensure_attributesÚ_attrsÚ_attrsNSr®   r@   ZownerElement)r   rB   r­   rE   rF   rG   rH   r�   r±   rè   ré   r°   r&   r£   r   r   r   r¬   à  s^      ÿ ÿ
 ÿ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 )Nr;   z$element stack messed up! (namespace)z&element stack messed up - bad nodeNamez*element stack messed up - bad namespaceURI)
rZ   rI   r*   r+   rG   r>   rà   r   r¶   r™   )r   rB   rZ   rE   rF   rG   rH   r   r   r   ra     s$    
ÿþýÿÿzNamespaces.end_element_handlerN)
r3   r4   r5   rÂ   rä   rT   rV   rå   r¬   ra   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 r   )rJ   rQ   rä   r   r   r   r   rQ   )  s    
zExpatBuilderNS.resetN)r3   r4   r5   rÂ   rQ   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 r   )rÖ   rQ   rä   r   r   r   r   rQ   1  s    
zFragmentBuilderNS.resetc                 C   s‚   d}| j }g }|r~t|dƒrv|j ¡ D ]N\}}||kr8q&| |¡ |rPd| }nd}|rhd|||f }q&d||f }q&|j}q|S )zNReturn string of namespace attributes from this element and
        ancestors.rz   Ú_ns_prefix_uriræ   rç   z%s
    %s='%s'z %s='%s')r«   Úhasattrrì   Úitemsr¤   r¶   )r   Úattrsr«   r»   rG   rE   Zdeclnamer   r   r   rÜ   5  s"    


zFragmentBuilderNS._getNSattrsN)r3   r4   r5   rÂ   rQ   rÜ   r   r   r   r   rë   .  s   rë   c                   @   s   e Zd ZdZdS )r   zEException raised to short-circuit parsing in InternalSubsetExtractor.N)r3   r4   r5   rÂ   r   r   r   r   r   S  s   r   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*   zt  | |¡ W n tk
r$   Y nX d S r   )rJ   rƒ   r   rÙ   r   r   r   rƒ   `  s    z!InternalSubsetExtractor.parseFilec                 C   s*   zt  | |¡ W n tk
r$   Y nX d S r   )rJ   r…   r   )r   r„   r   r   r   r…   f  s    z#InternalSubsetExtractor.parseStringc                 C   s   | j |_| j|_d S r   )r]   r^   r¬   r`   rx   r   r   r   rV   l  s    zInternalSubsetExtractor.installc                 C   s0   |r&|   ¡ }g | _| jj|_| j|_ntƒ ‚d S r   )rW   rŠ   r¤   ZDefaultHandlerr”   r•   r   )r   rB   r—   r–   r˜   ry   r   r   r   r]   p  s    

z2InternalSubsetExtractor.start_doctype_decl_handlerc                 C   s,   d  | j¡ dd¡ dd¡}|| _tƒ ‚d S )Nrz   z
Ú
ú)ÚjoinrŠ   Úreplacer   )r   r9   r   r   r   r”   z  s    z0InternalSubsetExtractor.end_doctype_decl_handlerc                 C   s
   t ƒ ‚d S r   )r   )r   rB   rï   r   r   r   r¬     s    z-InternalSubsetExtractor.start_element_handler)r3   r4   r5   rÂ   rŠ   rˆ   rƒ   r…   rV   r]   r”   r¬   r   r   r   r   r‡   W  s   
r‡   Tc              	   C   sL   |rt ƒ }ntƒ }t| tƒr>t| dƒ�}| |¡}W 5 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.
    Úrb)rê   rJ   Ú
isinstanceÚstrÚopenrƒ   )r€   Ú
namespacesr8   Ú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ê   rJ   r…   )r„   rø   r8   r   r   r   r…   •  s    r…   c              	   C   sP   |rt |ƒ}nt|ƒ}t| tƒrBt| dƒ�}| |¡}W 5 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ô   )rë   rÖ   rõ   rö   r÷   rƒ   )r€   r«   rø   r8   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ø   r8   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ê   rJ   )rR   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getDOMImplementationrX   ZTypeInfor$   Úobjectr   r:   rI   rJ   rÇ   rM   rÍ   r³   rµ   rá   rÝ   rÖ   râ   rê   rë   Ú	Exceptionr   r‡   rû   r…   rü   rý   rþ   r   r   r   r   Ú<module>   sf   








÷3  C
:ÿ	÷ÿu_%,



