o
    f                     @   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 )<zFacility 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 )FragmentBuilderzBuilder 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}|rt|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 )zRe-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 rt | |\}}}}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 )zParse 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 )zParse 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_%
,


