o
    éT•j·‹  ã                   @   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)Ú
NodeFilterNÚcdataÚenumerationÚentityÚentitiesÚidÚidrefÚidrefsÚnmtokenÚnmtokens)	ÚCDATAÚENUMÚENTITYÚENTITIESÚIDÚIDREFÚIDREFSÚNMTOKENÚ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.10/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   ó   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rt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   r2   )r$   ÚnamespaceURIÚ	localNamer&   r&   r'   ÚgetAttributeTypeNST   ó   zElementInfo.getAttributeTypeNSc                 C   s(   | j r| j d }|tjjtjjfvS dS ©Nr   F)r!   r   r%   ÚXML_CTYPE_ANYÚ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 r;   )r!   r   r%   Ú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$   r3   r4   r&   r&   r'   ÚisIde   s
   
ÿzElementInfo.isIdc                 C   s   |   ||f¡S r#   )rB   )r$   ÚeuriÚenameÚaurir3   r&   r&   r'   ÚisIdNSk   s   zElementInfo.isIdNSr#   )Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r(   r*   r-   r6   r9   r?   rA   rB   rF   r&   r&   r&   r'   r   <   s    

r   c                 C   s   |   ||¡S r#   )Ú_intern_setdefault)ÚbuilderÚsr&   r&   r'   Ú_interno   s   rN   c                 C   s¤   d|v sJ ‚|  d¡}| j}t|ƒdkr/|\}}}|||ƒ}d||f }|||ƒ}|||ƒ}nt|ƒdkrC|\}}t}|||ƒ }}ntd| ƒ‚|||ƒ|||fS )Nú é   z%s:%sé   z4Unsupported syntax: spaces in URIs not supported: %r)ÚsplitrK   Úlenr   Ú
ValueError)rL   ÚnameÚpartsÚinternÚuriÚ	localnameÚprefixÚqnamer&   r&   r'   Ú_parse_ns_namer   s   



r\   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 u rt  ¡ }|| _| jjd urt| jjƒ| _nd | _t| _d | _|  	¡  d S r#   )
r   Ú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)	rd   rh   rW   Ú
setdefaultrK   Úbuffer_textÚordered_attributesÚ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)ÚtheDOMImplementationÚcreateDocumentr   ÚdocumentÚcurNodeÚ
_elem_infoÚ_cdatar)   r&   r&   r'   re   ¦   s   ÿ

zExpatBuilder.resetc                 C   s–   | j |_| j|_| j|_| j|_| jj	r| j
|_| j|_| jjr$| j|_| jjr5| 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ÚProcessingInstructionHandlerr_   r   Úentity_decl_handlerÚEntityDeclHandlerÚnotation_decl_handlerÚNotationDeclHandlerÚcommentsÚcomment_handlerÚCommentHandlerÚ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_handlerÚXmlDeclHandlerÚelement_decl_handlerÚElementDeclHandlerÚattlist_decl_handlerÚAttlistDeclHandler©r$   Úparserr&   r&   r'   rm   ®   s$   
zExpatBuilder.installc                 C   s‚   |   ¡ }d}z%	 | d¡}|sn| |d¡ |r!| jjr!|  |¡ d}q| dd¡ W n	 ty4   Y nw | j}|  ¡  d| _|S )zIParse a document from a file object, returning the document
        node.Tr.   i @  Fó    N)	rn   ÚreadÚParserq   ÚdocumentElementÚ_setup_subsetÚParseEscapere   rd   )r$   Úfiler•   Úfirst_bufferÚbufferÚdocr&   r&   r'   Ú	parseFileÅ   s(   

ùÿzExpatBuilder.parseFilec                 C   sN   |   ¡ }z| |d¡ |  |¡ W n	 ty   Y nw | j}|  ¡  d| _|S )z<Parse a document from a string, returning the document node.TN)rn   r˜   rš   r›   rq   re   rd   )r$   Ústringr•   rŸ   r&   r&   r'   ÚparseStringÛ   s   ÿzExpatBuilder.parseStringc                 C   s2   | j jrtƒ }| |¡ | ¡ }|| j j_dS dS )z/Load the internal subset if there might be one.N)rq   ÚdoctypeÚInternalSubsetExtractorr¢   Ú	getSubsetÚinternalSubset)r$   rž   Ú	extractorÚsubsetr&   r&   r'   rš   è   s   
üzExpatBuilder._setup_subsetc                 C   s¨   | j j |||¡}| j |_t| j |ƒ || j _| jr5| j |¡tkr5d | j _| j j	d= d }d | j
_d | j
_|rR|d urCg |j_g |j_d | j
_d | j
_| j| j
_d S d S ©Néÿÿÿÿ)rq   ÚimplementationÚcreateDocumentTypeÚownerDocumentr	   r£   rb   Ú
acceptNodeÚFILTER_REJECTÚ
childNodesrd   r~   r€   r   Ú_seqÚ	notationsrƒ   r|   Úend_doctype_decl_handlerÚEndDoctypeDeclHandler)r$   ÚdoctypeNameÚsystemIdÚpublicIdÚhas_internal_subsetr£   r&   r&   r'   ru   ð   s(   ÿ
úz'ExpatBuilder.start_doctype_decl_handlerc                 C   s:   | j jr	| j| j_| j| j_| js| jst	| _
d S d S d S r#   )r_   r�   r‚   rd   rƒ   r{   r|   rs   rb   r   Ú_finish_end_elementr)   r&   r&   r'   r³     s   


ÿz%ExpatBuilder.end_doctype_decl_handlerc                 C   sH   | j  ||¡}t| j|ƒ | jr | j |¡tkr"| j |¡ d S d S d S r#   )rq   ÚcreateProcessingInstructionr	   rr   rb   r®   r¯   ÚremoveChild)r$   ÚtargetÚdataÚnoder&   r&   r'   r{     s
   ÿzExpatBuilder.pi_handlerc                 C   sœ   | j j}| jr$| jr|d jtkr|d  |¡ d S | j |¡}d| _n"|r;|d jt	kr;|d }|j
| }||_
d S t ¡ }||_
| j|_t| j |ƒ d S )Nrª   T)rr   r°   rt   Ú_cdata_continueÚnodeTypeÚCDATA_SECTION_NODEÚ
appendDatarq   ÚcreateCDATASectionÚ	TEXT_NODEr½   r   ÚTextr­   r	   )r$   r½   r°   r¾   Úvaluer&   r&   r'   r‰     s"   
z)ExpatBuilder.character_data_handler_cdatac                 C   s^   | j j}|r|d jtkr|d }|j| |_d S t ¡ }|j| |_| j|_t	| j |ƒ d S r©   )
rr   r°   rÀ   rÄ   r½   r   rÅ   rq   r­   r	   )r$   r½   r°   r¾   r&   r&   r'   r‹   &  s   z#ExpatBuilder.character_data_handlerc           
      C   sˆ   |rd S | j js
d S | j ||||¡}|d ur#| j |¡}	|j |	¡ | jjjj |¡ | j	r@| j	 
|¡tkrB| jjjjd= d S d S d S r©   )r_   r   rq   Ú_create_entityÚcreateTextNoder°   Úappendr£   r±   rb   r®   r¯   )
r$   Ú
entityNameÚis_parameter_entityrÆ   Úbaser¶   r·   ÚnotationNamer¾   Úchildr&   r&   r'   r}   1  s   
ÿÿz ExpatBuilder.entity_decl_handlerc                 C   sR   | j  |||¡}| j jjj |¡ | jr%| j |¡tkr'| j jjjd= d S d S d S r©   )	rq   Ú_create_notationr£   r²   r±   rÉ   rb   r®   ÚFILTER_ACCEPT)r$   rÍ   rÌ   r¶   r·   r¾   r&   r&   r'   r   C  s
   ÿz"ExpatBuilder.notation_decl_handlerc                 C   sF   | j  |¡}t| j|ƒ | jr| j |¡tkr!| j |¡ d S d S d S r#   )rq   ÚcreateCommentr	   rr   rb   r®   r¯   r»   )r$   r½   r¾   r&   r&   r'   r‚   I  s
   ÿzExpatBuilder.comment_handlerc                 C   s   d| _ d| _d S )NTF©rt   r¿   r)   r&   r&   r'   r…   O  ó   
z(ExpatBuilder.start_cdata_section_handlerc                 C   s   d| _ d| _d S )NFrÒ   r)   r&   r&   r'   r‡   S  rÓ   z&ExpatBuilder.end_cdata_section_handlerc                 C   ó   dS ©Nr.   r&   )r$   ÚcontextrÌ   r¶   r·   r&   r&   r'   rŒ   W  ó   z(ExpatBuilder.external_entity_ref_handlerc                 C   s2   | j d u r| jst| _| j|  ¡ _|  ||¡ d S r#   )rb   rs   r   r¹   Ústart_element_handlerrn   rx   )r$   rU   Ú
attributesr&   r&   r'   rw   Z  s   z"ExpatBuilder.first_element_handlerc                 C   sŽ   | j  |¡}t| j|ƒ || _|r8tdt|ƒdƒD ]}t || td t	¡}||d  }||_
| j |_t||ƒ q|| j jurE|  |¡ d S d S )Nr   rQ   r.   )rq   ÚcreateElementr	   rr   ÚrangerS   r   ÚAttrr   r   rÆ   r­   r
   r™   rc   )r$   rU   rÙ   r¾   ÚiÚarÆ   r&   r&   r'   rØ   `  s   ÿÿz"ExpatBuilder.start_element_handlerc                 C   sn   | j r5|| jju rd S | j  |¡}|tkrt| ƒ n|tkr#t| ƒ nd S |j| _	|j 
|¡ | ¡  d S d S r#   )rb   rq   r™   ÚstartContainerr¯   ÚRejecterÚFILTER_SKIPÚSkipperÚ
parentNoderr   r»   Úunlink)r$   r¾   Úfiltr&   r&   r'   rc   q  s   

ïz"ExpatBuilder._finish_start_elementc                 C   s   | j }|j| _ |  |¡ d S r#   )rr   rã   r¹   )r$   rU   rr   r&   r&   r'   ry   ˆ  s   z ExpatBuilder.end_element_handlerc                 C   sd   | j  |j¡}|r|  ||¡ | jr.|| jju rd S | j |¡tkr0| j	 
|¡ | ¡  d S d S d S r#   )rs   Úgetr"   Ú_handle_white_text_nodesrb   rq   r™   r®   r¯   rr   r»   rä   )r$   rr   r4   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 ]}| 	|¡ q#d S r#   )
r_   Úwhitespace_in_element_contentr?   r°   rÀ   rÄ   r½   ÚstriprÉ   r»   )r$   r¾   r4   ÚLrÎ   r&   r&   r'   rç   ˜  s   ÿ

€ÿz%ExpatBuilder._handle_white_text_nodesc                 C   s@   | j  |¡}|d u rt||ƒ| j |< d S |jd u sJ ‚||_d S r#   )rs   ræ   r   r!   )r$   rU   r%   r4   r&   r&   r'   r�   ©  s
   
z!ExpatBuilder.element_decl_handlerc              
   C   sF   | j  |¡}|d u rt|ƒ}|| j |< |j d |d d |d||g¡ d S ©Nr   )rs   ræ   r   r    rÉ   )r$   ÚelemrU   r>   ÚdefaultÚrequiredr4   r&   r&   r'   r’   ±  s   
ÿz!ExpatBuilder.attlist_decl_handlerc                 C   s8   || j _|| j _|dkr|rd| j _d S d| j _d S d S )Nr   TF)rq   ÚversionÚencodingÚ
standalone)r$   rï   rð   rñ   r&   r&   r'   rŽ   ¹  s   üzExpatBuilder.xml_decl_handlerr#   ) rG   rH   rI   Ú__doc__r(   rh   rn   re   rm   r    r¢   rš   ru   r³   r{   r‰   r‹   r}   r   r‚   r…   r‡   rŒ   rw   rØ   rc   ry   r¹   rç   r�   r’   rŽ   r&   r&   r&   r'   r]   …   s<    
r]   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 )
ra   zoWrapper around a DOMBuilderFilter which implements the checks
    to make the whatToShow filter attribute work.©r`   c                 C   s
   || _ d S r#   ró   )r$   r`   r&   r&   r'   r(   Î  s   
z#FilterVisibilityController.__init__c                 C   sP   | j |j }| jj|@ r&| j |¡}|tkrt‚|tvr$tdt	|ƒ ƒ‚|S t
S )Nz)startContainer() returned illegal value: )Ú_nodetype_maskrÀ   r`   Ú
whatToShowrß   ÚFILTER_INTERRUPTr›   Ú_ALLOWED_FILTER_RETURNSrT   ÚreprrÐ   )r$   r¾   ÚmaskÚvalr&   r&   r'   rß   Ñ  s   
ÿz)FilterVisibilityController.startContainerc                 C   s€   | j |j }| jj|@ r>| j |¡}|tkrt‚|tkr0|j}|j	d d … D ]}| 
|¡ q&tS |tvr<tdt|ƒ ƒ‚|S tS )Nz%acceptNode() returned illegal value: )rô   rÀ   r`   rõ   r®   rö   r›   rá   rã   r°   ÚappendChildr¯   r÷   rT   rø   rÐ   )r$   r¾   rù   rú   ÚparentrÎ   r&   r&   r'   r®   Þ  s    
ÿz%FilterVisibilityController.acceptNodeN)#rG   rH   rI   rò   rJ   r(   rß   r®   r   ÚELEMENT_NODEr   ÚSHOW_ELEMENTÚATTRIBUTE_NODEÚSHOW_ATTRIBUTErÄ   Ú	SHOW_TEXTrÁ   ÚSHOW_CDATA_SECTIONÚENTITY_REFERENCE_NODEÚSHOW_ENTITY_REFERENCEÚENTITY_NODEÚSHOW_ENTITYÚPROCESSING_INSTRUCTION_NODEÚSHOW_PROCESSING_INSTRUCTIONÚCOMMENT_NODEÚSHOW_COMMENTÚDOCUMENT_NODEÚSHOW_DOCUMENTÚDOCUMENT_TYPE_NODEÚSHOW_DOCUMENT_TYPEÚDOCUMENT_FRAGMENT_NODEÚSHOW_DOCUMENT_FRAGMENTÚNOTATION_NODEÚSHOW_NOTATIONrô   r&   r&   r&   r'   ra   È  s&    ôra   c                   @   ó   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  rd   rx   r  rz   r  rØ   ry   )r$   rL   r•   r&   r&   r'   r(     s   zFilterCrutch.__init__N)rG   rH   rI   rJ   r(   r&   r&   r&   r'   r    ó    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)r|   rƒ   rŠ   r†   rˆ   r�   )r  r(   rd   Úsetattr)r$   rL   r•   rU   r&   r&   r'   r(     s
   ùzRejecter.__init__c                 G   s   | j d | _ d S rÕ   )r  ©r$   Úargsr&   r&   r'   rØ     r+   zRejecter.start_element_handlerc                 G   sB   | j dkr| jj}| j |¡ | j|_| j|_d S | j d | _ d S ©Nr   r.   )r  r  rd   rm   r  rx   r  rz   )r$   r  r•   r&   r&   r'   ry      s   
zRejecter.end_element_handlerN)rG   rH   rI   rJ   r(   rØ   ry   r&   r&   r&   r'   rà     s
    rà   c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )râ   r&   c                 G   s2   | j j}| j|Ž  | j j|ur| jd | _d S d S rÕ   )r  rr   r  r  )r$   r  r¾   r&   r&   r'   rØ   -  s
   
ÿzSkipper.start_element_handlerc                 G   sF   | j dkr| j| jj_| j| jj_d | _d S | j d | _ | j|Ž  d S r  )r  r  r  rd   rx   r  rz   r  r&   r&   r'   ry   3  s   

zSkipper.end_element_handlerN)rG   rH   rI   rJ   rØ   ry   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­   r]   r(   )r$   rÖ   rf   r&   r&   r'   r(   [  s   
zFragmentBuilder.__init__c                 C   s   t  | ¡ d | _d S r#   )r]   re   Úfragmentr)   r&   r&   r'   re   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}|r+|jp|  ¡ }|jr"d|j|jf }n|jr*d|j }nd}|  ¡ }t	|||f }z| 
|d¡ W n   |  ¡  ‚ | j}|  ¡  |S )zMParse a document fragment from a string, returning the
        fragment node.Ú zPUBLIC "%s" "%s"zSYSTEM "%s"T)Ú_sourcern   r   r£   r¦   Ú_getDeclarationsr·   r¶   Ú_getNSattrsÚ_FRAGMENT_BUILDER_TEMPLATEr˜   re   r!  )	r$   r¡   r•   r£   Úidentr¨   Únsattrsrq   r!  r&   r&   r'   r¢   m  s0   
ÿ
€zFragmentBuilder.parseStringc                 C   s
  | j jj}d}|rƒt|jjƒD ])}|j |¡}|r|d }d||jf }|jr1d||j|j	f }qd||j	f }qt|j
jƒD ]C}|j
 |¡}|rM|d }d||jf }|jrad||j|j	f }n|j	rld||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.
        r#  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   Ú
firstChildr½   rÍ   )r$   r£   rM   rÝ   Únotationr   r&   r&   r'   r%  ‰  s:   
ÿÿ
z FragmentBuilder._getDeclarationsc                 C   rÔ   )Nr#  r&   r)   r&   r&   r'   r&  ­  r×   zFragmentBuilder._getNSattrsc                 C   sŠ   |t kr<| j}| j}| j |¡}| j| _| j ¡ | _| j| _z| | j	d¡ W || _|| _d | _	dS || _|| _d | _	w t
 | ||||¡S )NTrª   )Ú$_FRAGMENT_BUILDER_INTERNAL_SYSTEM_IDrq   rr   rd   ÚExternalEntityParserCreater   ÚcreateDocumentFragmentr!  r˜   r$  r]   rŒ   )r$   rÖ   rÌ   r¶   r·   Úold_documentÚold_cur_noder•   r&   r&   r'   rŒ   °  s&   ý
ÿz+FragmentBuilder.external_entity_ref_handlerr#   )rG   rH   rI   rò   r(   re   r    r¢   r%  r&  rŒ   r&   r&   r&   r'   r  R  s    
	$r  c                   @   sB   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.rO   )Únamespace_separatorT)r   rg   Únamespace_prefixesr”   r&   r&   r'   rh   Ï  s   zNamespaces.createParserc                 C   s$   t  | |¡ | jjr| j|_dS dS )z.Insert the namespace-handlers onto the parser.N)r]   rm   r_   Únamespace_declarationsÚstart_namespace_decl_handlerÚStartNamespaceDeclHandlerr”   r&   r&   r'   rm   Õ  s
   ÿÿzNamespaces.installc                 C   s   | j  ||f¡ dS )z/Push this namespace declaration on our storage.N)r6  rÉ   )r$   rZ   rX   r&   r&   r'   r;  Ü  s   z'Namespaces.start_namespace_decl_handlerc                 C   s‚  d|v rt | |ƒ\}}}}nt}|}d }t}t ||||¡}| j|_t| j|ƒ || _| j	r`| j	D ](\}}|rEt 
t| d| ƒt|d¡}nt 
dtdt¡}||_| j|_t||ƒ q1| j	d d …= |r½| ¡  |j}	|j}
tdt|ƒdƒD ]J}|| }||d  }d|v r t | |ƒ\}}}}t 
||||¡}||	|< ||
||f< nt 
|t|t¡}||	|< ||
t|f< | j|_||_||_qtd S d S )NrO   úxmlns:Úxmlnsr   rQ   r.   )r\   r   r   r   ÚElementrq   r­   r	   rr   r6  rÜ   rN   r   rÆ   r
   Ú_ensure_attributesÚ_attrsÚ_attrsNSrÛ   rS   ÚownerElement)r$   rU   rÙ   rX   rY   rZ   r[   r¾   rÞ   rA  rB  rÝ   r3   rÆ   r&   r&   r'   rØ   à  sZ   ÿÿÿíz Namespaces.start_element_handlerTc                 C   s‚   | j }d|v r$t| |ƒ\}}}}|j|kr|j|kr|j|ks#J dƒ‚n|j|ks-J dƒ‚|jtks6J dƒ‚|j| _ |  |¡ d S )NrO   z$element stack messed up! (namespace)z&element stack messed up - bad nodeNamez*element stack messed up - bad namespaceURI)	rr   r\   r7   r8   rZ   r-  r   rã   r¹   )r$   rU   rr   rX   rY   rZ   r[   r&   r&   r'   ry     s    

ÿÿÿzNamespaces.end_element_handlerN)
rG   rH   rI   rò   r7  rh   rm   r;  rØ   ry   r&   r&   r&   r'   r5  Ç  s    /r5  c                   @   r  )ÚExpatBuilderNSz*Document builder that supports namespaces.c                 C   ó   t  | ¡ |  ¡  d S r#   )r]   re   r7  r)   r&   r&   r'   re   )  ó   
zExpatBuilderNS.resetN)rG   rH   rI   rò   re   r&   r&   r&   r'   rD  &  r  rD  c                   @   r  )ÚFragmentBuilderNSz*Fragment builder that supports namespaces.c                 C   rE  r#   )r  re   r7  r)   r&   r&   r'   re   1  rF  zFragmentBuilderNS.resetc                 C   s„   d}| j }g }|r@t|dƒr;|j ¡ D ]'\}}||v rq| |¡ |r(d| }nd}|r4d|||f }qd||f }q|j}|s	|S )zNReturn string of namespace attributes from this element and
        ancestors.r#  Ú_ns_prefix_urir=  r>  z%s
    %s='%s'z %s='%s')rÖ   ÚhasattrrH  ÚitemsrÉ   rã   )r$   ÚattrsrÖ   rê   rZ   rX   Údeclnamer&   r&   r'   r&  5  s$   


ñzFragmentBuilderNS._getNSattrsN)rG   rH   rI   rò   re   r&  r&   r&   r&   r'   rG  .  s    rG  c                   @   s   e Zd ZdZdS )r›   zEException raised to short-circuit parsing in InternalSubsetExtractor.N)rG   rH   rI   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   ó(   z	t  | |¡ W d S  ty   Y d S w r#   )r]   r    r›   r"  r&   r&   r'   r    `  ó
   ÿz!InternalSubsetExtractor.parseFilec                 C   rM  r#   )r]   r¢   r›   )r$   r¡   r&   r&   r'   r¢   f  rN  z#InternalSubsetExtractor.parseStringc                 C   s   | j |_| j|_d S r#   )ru   rv   rØ   rx   r”   r&   r&   r'   rm   l  s   zInternalSubsetExtractor.installc                 C   s.   |r|   ¡ }g | _| jj|_| j|_d S tƒ ‚r#   )rn   r¨   rÉ   ÚDefaultHandlerr³   r´   r›   )r$   rU   r·   r¶   r¸   r•   r&   r&   r'   ru   p  s   
z2InternalSubsetExtractor.start_doctype_decl_handlerc                 C   s(   d  | j¡ dd¡ dd¡}|| _tƒ ‚)Nr#  z
Ú
ú)Újoinr¨   Úreplacer›   )r$   rM   r&   r&   r'   r³   z  s   z0InternalSubsetExtractor.end_doctype_decl_handlerc                 C   s   t ƒ ‚r#   )r›   )r$   rU   rK  r&   r&   r'   rØ     r:   z-InternalSubsetExtractor.start_element_handler)rG   rH   rI   rò   r¨   r¥   r    r¢   rm   ru   r³   rØ   r&   r&   r&   r'   r¤   W  s    
r¤   Tc                 C   sd   |rt ƒ }ntƒ }t| tƒr+t| dƒ�}| |¡}W d  ƒ |S 1 s$w   Y  |S | | ¡}|S )z{Parse a document, returning the resulting Document node.

    'file' may be either a file name or an open file object.
    ÚrbN)rD  r]   Ú
isinstanceÚstrÚopenr    )rœ   Ú
namespacesrL   Ú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.
    )rD  r]   r¢   )r¡   rX  rL   r&   r&   r'   r¢   •  s   
r¢   c                 C   sh   |rt |ƒ}nt|ƒ}t| tƒr-t| dƒ�}| |¡}W d  ƒ |S 1 s&w   Y  |S | | ¡}|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.
    rT  N)rG  r  rU  rV  rW  r    )rœ   rÖ   rX  rL   rY  rZ  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.
    )rG  r  r¢   )r¡   rÖ   rX  rL   r&   r&   r'   ÚparseFragmentString´  s   

r]  c                 C   s   | j rt| ƒS t| ƒS )z,Create a builder based on an Options object.)rX  rD  r]   )rf   r&   r&   r'   ÚmakeBuilderÀ  s   r^  )T)3rò   Úxml.domr   r   r   r   r   r   Úxml.parsersr   Úxml.dom.minidomr	   r
   Úxml.dom.NodeFilterr   rÄ   rÁ   r  ÚDOMBuilderFilterrÐ   r¯   rá   rö   ÚgetDOMImplementationro   ÚTypeInfor1   Úobjectr   rN   r\   r]   r÷   ra   r  rà   râ   r0  r'  r  r5  rD  rG  Ú	Exceptionr›   r¤   r[  r¢   r\  r]  r^  r&   r&   r&   r'   Ú<module>   sh    








÷3  
C:ÿ	÷ÿu_%
,


