
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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   ZnamespaceURIZ	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    r5   c             C   s˜   |j dƒ}| j}t|ƒdkrR|\}}}|||ƒ}d||f }|||ƒ}|||ƒ}n4t|ƒdkrz|\}}t}|||ƒ }}ntd| ƒ‚|||ƒ|||fS )Nú é   z%s:%sr   z4Unsupported syntax: spaces in URIs not supported: %r)Úsplitr2   Úlenr   Ú
ValueError)r3   ÚnameÚpartsÚinternÚuriÚ	localnameÚprefixÚqnamer   r   r   Ú_parse_ns_namer   s    



rB   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)	rI   rM   r=   Ú
setdefaultr2   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   rJ   ¦   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ÚProcessingInstructionHandlerrD   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   rO   ®   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 @  )	rP   ÚreadÚParserR   ÚdocumentElementÚ_setup_subsetÚParseEscaperJ   rI   )r   Úfilerq   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)rP   ru   rw   rx   rR   rJ   rI   )r   Ústringrq   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)rR   ÚdoctypeÚInternalSubsetExtractorr~   Ú	getSubsetÚinternalSubset)r   rz   Z	extractorÚsubsetr   r   r   rw   è   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   éÿÿÿÿ)rR   ÚimplementationZcreateDocumentTypeÚownerDocumentr	   r   rG   Ú
acceptNodeÚFILTER_REJECTÚ
childNodesrI   r_   ra   r   Ú_seqÚ	notationsrd   r]   Úend_doctype_decl_handlerÚEndDoctypeDeclHandler)r   ZdoctypeNameÚsystemIdÚpublicIdÚhas_internal_subsetr   r   r   r   rV   ð   s$    

z'ExpatBuilder.start_doctype_decl_handlerc             C   s2   | j jr| j| j_| j| j_| jp&| js.t	| _
d S )N)rD   rb   rc   rI   rd   r\   r]   rT   rG   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)rR   ZcreateProcessingInstructionr	   rS   rG   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„   )rS   r‰   rU   Ú_cdata_continueÚnodeTypeÚCDATA_SECTION_NODEZ
appendDatarR   ZcreateCDATASectionÚ	TEXT_NODEr”   r   ÚTextr†   r	   )r   r”   r‰   r•   Úvaluer   r   r   ri     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„   )
rS   r‰   r—   r™   r”   r   rš   rR   r†   r	   )r   r”   r‰   r•   r   r   r   rk   &  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„   )rD   r   rR   Z_create_entityZcreateTextNoder‰   Úappendr   rŠ   rG   r‡   rˆ   )
r   Z
entityNameZis_parameter_entityr›   ÚbaserŽ   r�   ÚnotationNamer•   Úchildr   r   r   r^   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„   )	rR   Z_create_notationr   r‹   rŠ   rœ   rG   r‡   ÚFILTER_ACCEPT)r   rž   r�   rŽ   r�   r•   r   r   r   r`   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)rR   ZcreateCommentr	   rS   rG   r‡   rˆ   r’   )r   r”   r•   r   r   r   rc   I  s    zExpatBuilder.comment_handlerc             C   s   d| _ d| _d S )NTF)rU   r–   )r   r   r   r   re   O  s    z(ExpatBuilder.start_cdata_section_handlerc             C   s   d| _ d| _d S )NF)rU   r–   )r   r   r   r   rg   S  s    z&ExpatBuilder.end_cdata_section_handlerc             C   s   dS )Nr   r   )r   Úcontextr�   rŽ   r�   r   r   r   rl   W  s    z(ExpatBuilder.external_entity_ref_handlerc             C   s4   | j d kr| j rt| _| j| jƒ _| j||ƒ d S )N)rG   rT   r   r‘   Ústart_element_handlerrP   rY   )r   r;   Ú
attributesr   r   r   rX   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   )rR   ZcreateElementr	   rS   Úranger9   r   ÚAttrr   r   r›   r†   r
   rv   rH   )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)rG   rR   rv   ÚstartContainerrˆ   ÚRejecterÚFILTER_SKIPÚSkipperÚ
parentNoderS   r’   Úunlink)r   r•   Zfiltr   r   r   rH   q  s    

z"ExpatBuilder._finish_start_elementc             C   s   | j }|j| _ | j|ƒ d S )N)rS   r¬   r‘   )r   r;   rS   r   r   r   rZ   ˆ  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)rT   Úgetr   Ú_handle_white_text_nodesrG   rR   rv   r‡   rˆ   rS   r’   r­   )r   rS   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)
rD   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   s0   | j j|ƒ}|d kr&t||ƒ| j |< n||_d S )N)rT   r®   r   r   )r   r;   r   r%   r   r   r   ro   ©  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   )rT   r®   r   r   rœ   )r   Úelemr;   r)   ÚdefaultZrequiredr%   r   r   r   rp   ±  s    
z!ExpatBuilder.attlist_decl_handlerc             C   s2   || j _|| j _|dkr.|r&d| j _nd| j _d S )Nr   TF)rR   ÚversionÚencodingÚ
standalone)r   r´   rµ   r¶   r   r   r   rn   ¹  s    
zExpatBuilder.xml_decl_handler)N) r.   r/   r0   Ú__doc__r   rM   rP   rJ   rO   r|   r~   rw   rV   rŒ   r\   ri   rk   r^   r`   rc   re   rg   rl   rX   r¢   rH   rZ   r‘   r¯   ro   rp   rn   r   r   r   r   rC   …   s:   
rC   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 )rF   zoWrapper around a DOMBuilderFilter which implements the checks
    to make the whatToShow filter attribute work.rE   c             C   s
   || _ d S )N)rE   )r   rE   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—   rE   Ú
whatToShowr¨   ÚFILTER_INTERRUPTrx   Ú_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—   rE   r¹   r‡   rº   rx   rª   r¬   r‰   ZappendChildrˆ   r»   r:   r¼   r    )r   r•   r½   r¾   ÚparentrŸ   r   r   r   r‡   Þ  s    z%FilterVisibilityController.acceptNodeN)rE   )#r.   r/   r0   r·   r1   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   rF   È  s"   rF   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Â   rI   rY   rÄ   r[   rÅ   r¢   rZ   )r   r3   rq   r   r   r   r     s    zFilterCrutch.__init__N)rÂ   rÃ   rÄ   rÅ   )r.   r/   r0   r1   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]   rd   rj   rf   rh   rm   )r]   rd   rj   rf   rh   rm   )rÁ   r   rI   Úsetattr)r   r3   rq   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Â   rI   rO   rÄ   rY   rÅ   r[   )r   rÇ   rq   r   r   r   rZ      s    

zRejecter.end_element_handlerN)r.   r/   r0   r1   r   r¢   rZ   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Â   rS   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Â   rI   rY   rÅ   r[   )r   rÇ   r   r   r   rZ   3  s    
zSkipper.end_element_handlerN)r.   r/   r0   r1   r¢   rZ   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†   rC   r   )r   r¡   rK   r   r   r   r   [  s    
zFragmentBuilder.__init__c             C   s   t j| ƒ d | _d S )N)rC   rJ   Úfragment)r   r   r   r   rJ   d  s    
zFragmentBuilder.resetc             C   s   | j |jƒ ƒS )zRParse a document fragment from a file object, returning the
        fragment node.)r~   rt   )r   ry   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.rs   zPUBLIC "%s" "%s"zSYSTEM "%s"r   )Ú_sourcerP   rÉ   r   r‚   Ú_getDeclarationsr�   rŽ   Ú_getNSattrsÚ_FRAGMENT_BUILDER_TEMPLATEru   rJ   rÊ   )	r   r}   rq   r   Zidentrƒ   ZnsattrsrR   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.
        rs   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ÚitemZnodeNamer�   rŽ   r   Z
firstChildr”   rž   )r   r   r4   r¦   Znotationr   r   r   r   rÌ   ‰  s6    
z FragmentBuilder._getDeclarationsc             C   s   dS )Nrs   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_IDrR   rS   rI   ZExternalEntityParserCreaterÉ   ZcreateDocumentFragmentrÊ   ru   rË   rC   rl   )r   r¡   r�   rŽ   r�   Zold_documentZold_cur_noderq   r   r   r   rl   °  s    z+FragmentBuilder.external_entity_ref_handler)N)r.   r/   r0   r·   r   rJ   r|   r~   rÌ   rÍ   rl   r   r   r   r   rÈ   R  s   
	$rÈ   c               @   s8   e Zd Z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.r6   )Znamespace_separatorT)r   rL   Znamespace_prefixes)r   rq   r   r   r   rM   Ï  s    zNamespaces.createParserc             C   s    t j| |ƒ | jjr| j|_dS )z.Insert the namespace-handlers onto the parser.N)rC   rO   rD   Znamespace_declarationsÚstart_namespace_decl_handlerZStartNamespaceDeclHandler)r   rq   r   r   r   rO   Õ  s    zNamespaces.installc             C   s   | j j||fƒ dS )z/Push this namespace declaration on our storage.N)rÓ   rœ   )r   r@   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Ä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 )Nr6   zxmlns:Úxmlnsr   r   r   )rB   r   r   r   ZElementrR   r†   r	   rS   rÓ   r¥   r5   r   r›   r
   Z_ensure_attributesÚ_attrsÚ_attrsNSr¤   r9   ZownerElement)r   r;   r£   r>   r?   r@   rA   r•   r§   r×   rØ   r¦   r$   r›   r   r   r   r¢   à  sP    
z Namespaces.start_element_handlerN)	r.   r/   r0   r·   rÔ   rM   rO   rÕ   r¢   r   r   r   r   rÒ   Ç  s   /rÒ   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)rC   rJ   rÔ   )r   r   r   r   rJ   )  s    
zExpatBuilderNS.resetN)r.   r/   r0   r·   rJ   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È   rJ   rÔ   )r   r   r   r   rJ   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.rs   Ú_ns_prefix_urizxmlns:rÖ   z%s
    %s='%s'z %s='%s')r¡   ÚhasattrrÛ   Úitemsrœ   r¬   )r   Úattrsr¡   r±   r@   r>   Zdeclnamer   r   r   rÍ   5  s"    



zFragmentBuilderNS._getNSattrsN)r.   r/   r0   r·   rJ   rÍ   r   r   r   r   rÚ   .  s   rÚ   c               @   s   e Zd ZdZdS )rx   zEException raised to short-circuit parsing in InternalSubsetExtractor.N)r.   r/   r0   r·   r   r   r   r   rx   S  s   rx   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)rC   r|   rx   )r   ry   r   r   r   r|   `  s    z!InternalSubsetExtractor.parseFilec             C   s*   yt j| |ƒ W n tk
r$   Y nX d S )N)rC   r~   rx   )r   r}   r   r   r   r~   f  s    z#InternalSubsetExtractor.parseStringc             C   s   | j |_| j|_d S )N)rV   rW   r¢   rY   )r   rq   r   r   r   rO   l  s    zInternalSubsetExtractor.installc             C   s0   |r&| j ƒ }g | _| jj|_| j|_ntƒ ‚d S )N)rP   rƒ   rœ   ZDefaultHandlerrŒ   r�   rx   )r   r;   r�   rŽ   r�   rq   r   r   r   rV   p  s    

z2InternalSubsetExtractor.start_doctype_decl_handlerc             C   s,   dj | jƒjddƒjddƒ}|| _tƒ ‚d S )Nrs   z
Ú
ú)Újoinrƒ   Úreplacerx   )r   r4   r   r   r   rŒ   z  s    z0InternalSubsetExtractor.end_doctype_decl_handlerc             C   s
   t ƒ ‚d S )N)rx   )r   r;   rÞ   r   r   r   r¢     s    z-InternalSubsetExtractor.start_element_handler)r.   r/   r0   r·   rƒ   r�   r|   r~   rO   rV   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Ù   rC   Ú
isinstanceÚstrÚopenr|   )ry   Ú
namespacesr3   Ú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Ù   rC   r~   )r}   rç   r3   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|   )ry   r¡   rç   r3   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ç   r3   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Ù   rC   )rK   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getDOMImplementationrQ   ZTypeInfor"   Úobjectr   r5   rB   rC   r»   rF   rÁ   r©   r«   rÑ   rÎ   rÈ   rÒ   rÙ   rÚ   Ú	Exceptionrx   r€   rê   r~   rë   rì   rí   r   r   r   r   Ú<module>   s^   







3  C
:u_%,



