
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \¬‹  ã               @   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ejddƒejdd	ƒejdd
ƒejddƒejddƒejddƒejddƒejddƒej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/lib64/python3.6/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!   )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   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)r   r   r   )N)Ú__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    r7   c             C   s¤   d|kst ‚|jdƒ}| j}t|ƒdkr^|\}}}|||ƒ}d||f }|||ƒ}|||ƒ}n4t|ƒdkr†|\}}t}|||ƒ }}ntd| ƒ‚|||ƒ|||fS )Nú é   z%s:%sr   z4Unsupported syntax: spaces in URIs not supported: %r)ÚAssertionErrorÚsplitr4   Úlenr   Ú
ValueError)r5   Ú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jd k	r2t| 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   sF   | j s@| jƒ | _ | j jj| _d| j _d| j _d| j _| j| j ƒ | j S )z7Return the parser object, creating a new one if needed.T)	rL   rP   r@   Ú
setdefaultr4   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   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†   | j ƒ }d}yLx:|jdƒ}|s P |j|dƒ |rB| jjrB| j|ƒ d}qW |jddƒ W n tk
rl   Y nX | j}| jƒ  d| _|S )	zIParse a document from a file object, returning the document
        node.Té   i   r   FÚ Ni @  )	rS   ÚreadÚParserU   ÚdocumentElementÚ_setup_subsetÚParseEscaperM   rL   )r   Úfilert   Zfirst_bufferÚbufferÚdocr   r   r   Ú	parseFileÅ   s$    

zExpatBuilder.parseFilec             C   sP   | j ƒ }y|j|dƒ | j|ƒ W n tk
r6   Y nX | j}| jƒ  d| _|S )z<Parse a document from a string, returning the document node.TN)rS   rx   rz   r{   rU   rM   rL   )r   Ústringrt   r~   r   r   r   ÚparseStringÛ   s    zExpatBuilder.parseStringc             C   s.   | j jr*tƒ }|j|ƒ |jƒ }|| 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   rz   è   s
    
zExpatBuilder._setup_subsetc             C   s¤   | j jj|||ƒ}| j |_t| j |ƒ || j _| jrj| j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 )Nr   éÿÿÿÿ)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p&| 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 j||ƒ}t| j|ƒ | jr<| jj|ƒtkr<| j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 j|ƒ d S | jj|ƒ}d| _nD|rv|d jt	krv|d }|j
| }||_
d S tjƒ }||_
| j|_t| j |ƒ d S )Nr   Tr‡   r‡   r‡   r‡   )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| |_| j|_t	| j |ƒ d S )Nr   r‡   r‡   )
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j||||ƒ}|d k	rF| jj|ƒ}	|jj|	ƒ | jjjjj|ƒ | j	r|| j	j
|ƒtkr|| jjjjd= d S )Nr   r‡   )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j|ƒ | jrF| jj|ƒtkrF| j jjjd= d S )Nr   r‡   )	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 j|ƒ}t| j|ƒ | jr:| jj|ƒtkr:| j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   s4   | j d kr| j rt| _| j| jƒ _| 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 j|ƒ}t| j|ƒ || _|rtxPtdt|ƒdƒD ]<}tj|| td t	ƒ}||d  }||_
| j |_t||ƒ q4W || j jk	rŠ| j|ƒ d S )Nr   r   r   )rU   ZcreateElementr	   rV   Úranger<   r   ÚAttrr   r   rž   r‰   r
   ry   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 j|ƒ}|tkr4t| ƒ n|tkrFt| ƒ nd S |j| _	|jj
|ƒ |jƒ  d S )N)rJ   rU   ry   Ú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| _ | j|ƒ d S )N)rV   r¯   r”   )r   r>   rV   r   r   r   r]   ˆ  s    z ExpatBuilder.end_element_handlerc             C   s\   | j j|jƒ}|r| j||ƒ | jrX|| jjkr4d S | jj|ƒtkrX| j	j
|ƒ |jƒ  d S )N)rW   Úgetr   Ú_handle_white_text_nodesrJ   rU   ry   rŠ   r‹   rV   r•   r°   )r   rV   r%   r   r   r   r”   �  s    z ExpatBuilder._finish_end_elementc             C   sf   | j js|jƒ  rd S g }x.|jD ]$}|jtkr"|jjƒ  r"|j|ƒ q"W x|D ]}|j	|ƒ qPW 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 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 j|ƒ}|d kr&t|ƒ}|| j |< |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) r0   r1   r2   Ú__doc__r   rP   rS   rM   rR   r   r�   rz   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j|ƒ}|tkr0t‚|tkrHtdt	|ƒ ƒ‚|S t
S d S )Nz)startContainer() returned illegal value: )Ú_nodetype_maskrš   rH   Ú
whatToShowr«   ÚFILTER_INTERRUPTr{   Ú_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r0t‚|tkrd|j}x |j	d d … D ]}|j
|ƒ 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½   r{   r­   r¯   rŒ   ZappendChildr‹   r¾   r=   r¿   r£   )r   r˜   rÀ   rÁ   Úparentr¢   r   r   r   rŠ   Þ  s    z%FilterVisibilityController.acceptNodeN)rH   )#r0   r1   r2   rº   r3   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   r5   rt   r   r   r   r     s    zFilterCrutch.__init__N)rÅ   rÆ   rÇ   rÈ   )r0   r1   r2   r3   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   s0   t j| |ƒ |j}xdD ]}t||d ƒ qW d S )Nr`   rg   rm   ri   rk   rp   )r`   rg   rm   ri   rk   rp   )rÄ   r   rL   Úsetattr)r   r5   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|_| 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)r0   r1   r2   r3   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   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)r0   r1   r2   r3   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j| |ƒ d S )N)rš   rÃ   ÚoriginalDocumentr¤   r‰   rF   r   )r   r¤   rN   r   r   r   r   [  s    
zFragmentBuilder.__init__c             C   s   t j| ƒ d | _d S )N)rF   rM   Úfragment)r   r   r   r   rM   d  s    
zFragmentBuilder.resetc             C   s   | j |jƒ ƒS )zRParse a document fragment from a file object, returning the
        fragment node.)r�   rw   )r   r|   r   r   r   r   h  s    zFragmentBuilder.parseFilec       	   	   C   sª   || _ | jƒ }| jj}d}|rV|jp*| jƒ }|jrDd|j|jf }qZ|jrZd|j }nd}| jƒ }t	|||f }y|j
|dƒ W n   | jƒ  ‚ Y nX | j}| jƒ  |S )zMParse a document fragment from a string, returning the
        fragment node.rv   zPUBLIC "%s" "%s"zSYSTEM "%s"r   )Ú_sourcerS   rÌ   r‚   r…   Ú_getDeclarationsr’   r‘   Ú_getNSattrsÚ_FRAGMENT_BUILDER_TEMPLATErx   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j|ƒ}|r>|d }d||jf }|jrfd||j|j	f }q"d||j	f }q"W x˜t|j
jƒD ]ˆ}|j
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.
        rv   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‚   r6   r©   Znotationr   r   r   r   rÏ   ‰  s6    
z FragmentBuilder._getDeclarationsc             C   s   dS )Nrv   r   )r   r   r   r   rÐ   ­  s    zFragmentBuilder._getNSattrsc             C   s~   |t krh| j}| j}| jj|ƒ}| j| _| jjƒ | _| j| _z|j| j	dƒ W d || _|| _d | _	X dS t
j| ||||ƒS d S )Nr   r‡   )Ú$_FRAGMENT_BUILDER_INTERNAL_SYSTEM_IDrU   rV   rL   ZExternalEntityParserCreaterÌ   ZcreateDocumentFragmentrÍ   rx   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)r0   r1   r2   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.r8   )Znamespace_separatorT)r   rO   Znamespace_prefixes)r   rt   r   r   r   rP   Ï  s    zNamespaces.createParserc             C   s    t j| |ƒ | 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 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||||ƒ}| j|_t| j|ƒ || _| j	rÄxZ| j	D ]P\}}|rŒtj
t| d| ƒt|dƒ}ntj
dtdtƒ}||_| j|_t||ƒ qdW | j	d d …= |�r†|jƒ  |j}	|j}
x¦tdt|ƒdƒD ]’}|| }||d  }d|k�rJt | |ƒ\}}}}tj
||||ƒ}||	|< ||
||f< n$tj
|t|tƒ}||	|< ||
t|f< | j|_||_||_qðW d S )Nr8   zxmlns:Úxmlnsr   r   r   )rE   r   r   r   ZElementrU   r‰   r	   rV   r×   r¨   r7   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| _ | j	|ƒ d S )Nr8   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)
r0   r1   r2   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 j| ƒ | jƒ  d S )N)rF   rM   rØ   )r   r   r   r   rM   )  s    
zExpatBuilderNS.resetN)r0   r1   r2   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 j| ƒ | jƒ  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jƒ D ]N\}}||kr<q*|j|ƒ |rTd| }nd}|rld|||f }q*d||f }q*W |j}qW |S )zNReturn string of namespace attributes from this element and
        ancestors.rv   Ú_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)r0   r1   r2   rº   rM   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)r0   r1   r2   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*   yt j| |ƒ W n tk
r$   Y nX d S )N)rF   r   r{   )r   r|   r   r   r   r   `  s    z!InternalSubsetExtractor.parseFilec             C   s*   yt j| |ƒ W n tk
r$   Y nX d S )N)rF   r�   r{   )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&| j ƒ }g | _| jj|_| j|_ntƒ ‚d S )N)rS   r†   rŸ   ZDefaultHandlerr�   r�   r{   )r   r>   r’   r‘   r“   rt   r   r   r   rY   p  s    

z2InternalSubsetExtractor.start_doctype_decl_handlerc             C   s,   dj | jƒjddƒjddƒ}|| _tƒ ‚d S )Nrv   z
Ú
ú)Újoinr†   Úreplacer{   )r   r6   r   r   r   r�   z  s    z0InternalSubsetExtractor.end_doctype_decl_handlerc             C   s
   t ƒ ‚d S )N)r{   )r   r>   râ   r   r   r   r¥     s    z-InternalSubsetExtractor.start_element_handler)r0   r1   r2   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ƒ�}|j|ƒ}W dQ R X n
|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Ú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Ý   rF   r�   )r€   rë   r5   r   r   r   r�   •  s    r�   c          	   C   sP   |rt |ƒ}nt|ƒ}t| tƒrBt| dƒ�}|j|ƒ}W dQ R X n
|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ë   r5   rì   rí   r   r   r   ÚparseFragment   s    


rï   c             C   s    |rt |ƒ}nt|ƒ}|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ë   r5   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   r7   rE   rF   r¾   rI   rÄ   r¬   r®   rÕ   rÑ   rË   rÖ   rÝ   rÞ   Ú	Exceptionr{   rƒ   rî   r�   rï   rð   rñ   r   r   r   r   Ú<module>   s^   







3  C
:u_%,



