
    (gm                        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j2                  dd       ej2                  dd	       ej2                  dd
       ej2                  dd       ej2                  dd       ej2                  dd       ej2                  dd       ej2                  dd       ej2                  dd      d	Z G d de      Zd Zd Z G d d      ZeeefZ  G d de      Z! G d de      Z" G d de"      Z# G d de"      Z$d Z%d!e%z  Z& G d" d#e      Z' G d$ d%      Z( G d& d'e(e      Z) G d( d)e(e'      Z* G d* d+e+      Z, G d, d-e      Z-d3d.Z.d3d/Z/d3d0Z0d3d1Z1d2 Z2y)4zFacility 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                   H    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zy)ElementInfo
_attr_info_modeltagNameNc                 .    || _         g | _        || _        y N)r$   r"   r#   )selfr$   models      +/usr/lib/python3.12/xml/dom/expatbuilder.py__init__zElementInfo.__init__?   s        c                 H    | j                   | j                  | j                  fS r&   r!   r'   s    r)   __getstate__zElementInfo.__getstate__D   s    T\\99r+   c                 .    |\  | _         | _        | _        y r&   r!   )r'   states     r)   __setstate__zElementInfo.__setstate__G   s    5:2dlr+   c                     | j                   D ]0  }|d   |k(  s|d   }|d   dk(  rt        d   c S t        |d      c S  t        j                  S )N   r   (r   )r"   _typeinfo_mapr   _no_type)r'   anameinfots       r)   getAttributeTypezElementInfo.getAttributeTypeJ   s]    OO 	3DAw%HQ43;(00(b22	3 r+   c                 "    t         j                  S r&   )r   r7   )r'   namespaceURI	localNames      r)   getAttributeTypeNSzElementInfo.getAttributeTypeNST   s    r+   c                     | j                   rE| j                   d   }|t        j                  j                  t        j                  j                  fvS yNr   F)r#   r	   r(   XML_CTYPE_ANYXML_CTYPE_MIXED)r'   types     r)   isElementContentzElementInfo.isElementContentW   sF    ;;;;q>D 9 9 % ; ; = = = r+   c                 p    | j                   r*| j                   d   t        j                  j                  k(  S yrA   )r#   r	   r(   XML_CTYPE_EMPTYr-   s    r)   isEmptyzElementInfo.isEmpty_   s)    ;;;;q>U[[%@%@@@r+   c                 J    | j                   D ]  }|d   |k(  s|d   dk(  c S  y)Nr3   r4   r   F)r"   )r'   r8   r9   s      r)   isIdzElementInfo.isIde   s5    OO 	(DAw%Bx4''	( r+   c                 (    | j                  ||f      S r&   )rJ   )r'   eurienameaurir8   s        r)   isIdNSzElementInfo.isIdNSk   s    yy$''r+   r&   )__name__
__module____qualname__	__slots__r*   r.   r1   r;   r?   rE   rH   rJ   rO    r+   r)   r    r    <   s4    1I
:;  (r+   r    c                 &    | j                  ||      S r&   )_intern_setdefault)builderss     r)   _internrY   o   s    %%a++r+   c                 6   d|v sJ |j                  d      }| j                  }t        |      dk(  r)|\  }}} |||      }|d|} |||      } |||      }n3t        |      dk(  r|\  }}t        } |||      x}}nt	        d|z         |||      |||fS )N    :   z4Unsupported syntax: spaces in URIs not supported: %r)splitrV   lenr   
ValueError)rW   namepartsinternuri	localnameprefixqnames           r)   _parse_ns_nameri   r   s    $;;JJsOE''F
5zQ!&Y'!9-ue$9i0		UqY"9i88	ORVVWW#sY55r+   c                       e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy) ExpatBuilderzPDocument builder that uses Expat to build a ParsedXML.DOM document
    instance.Nc                    |t        j                         }|| _        | j                  j                  %t	        | j                  j                        | _        nd | _        t        | _        d | _        | j                          y r&   )
r   Options_optionsfilterFilterVisibilityController_filterr   _finish_start_element_parserreset)r'   optionss     r)   r*   zExpatBuilder.__init__   sc    ? ((*G==+5dmm6J6JKDLDL *,D&

r+   c                 *    t        j                         S )zCreate a new parser object.)r	   ParserCreater-   s    r)   createParserzExpatBuilder.createParser   s    !!##r+   c                 B   | 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)	rs   rx   rd   
setdefaultrV   buffer_textordered_attributesspecified_attributesinstallr-   s    r)   	getParserzExpatBuilder.getParser   so    ||,,.DL&*ll&9&9&D&DD#'+DLL$.2DLL+04DLL-LL&||r+   c                     t         j                  t        dd      | _        | j                  | _        | j                  j
                  | _        d| _        y)z6Free all data structures used during DOM construction.NF)theDOMImplementationcreateDocumentr   documentcurNode
_elem_info_cdatar-   s    r)   rt   zExpatBuilder.reset   s>    ,;;T4)}}--22r+   c                    | j                   |_        | j                  |_        | j                  |_        | j                  |_        | j                  j                  r| j                  |_        | j                  |_        | j                  j                  r| j                  |_        | j                  j"                  r4| j$                  |_        | j(                  |_        | j,                  |_        n| j0                  |_        | j2                  |_        | j6                  |_        | j:                  |_        | j>                  |_         y)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ProcessingInstructionHandlerrn   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'   parsers     r)   r~   zExpatBuilder.install   s     *.)H)H&%)%?%?"#'#;#; .2oo+==!!'+'?'?F$%)%?%?"==!!$($8$8F!==''.2.N.NF+,0,J,JF)*.*K*KF'*.*E*EF'*.*J*J' $ 5 5$($=$=!$($=$=!r+   c                 |   | j                         }d}	 |j                  d      x}rQ|j                  |d       |r'| j                  j                  r| j                  |       d}|j                  d      x}rQ|j                  dd       | j                  }| j                          d| _        |S # t        $ r Y 0w xY w)zIParse a document from a file object, returning the document
        node.Ti @  Fr+   N)	r   readParser   documentElement_setup_subsetParseEscapert   rs   )r'   filer   first_bufferbufferdocs         r)   	parseFilezExpatBuilder.parseFile   s     !	 IIg..&.VU+DMM$A$A&&v.$	 !IIg..&.
 LLd# mm


  		s   A#B/ 8B/ /	B;:B;c                     | j                         }	 |j                  |d       | j                  |       | j                  }| j                          d| _        |S # t        $ r Y 0w xY w)z<Parse a document from a string, returning the document node.TN)r   r   r   r   r   rt   rs   )r'   stringr   r   s       r)   parseStringzExpatBuilder.parseString   sc    !	LL&v& mm


  		s   #A 	A&%A&c                     | j                   j                  rGt               }|j                  |       |j	                         }|| j                   j                  _        yy)z/Load the internal subset if there might be one.N)r   doctypeInternalSubsetExtractorr   	getSubsetinternalSubset)r'   r   	extractorsubsets       r)   r   zExpatBuilder._setup_subset   sJ    ==  /1I!!&)((*F39DMM!!0	 !r+   c                 ~   | j                   j                  j                  |||      }| j                   |_        t	        | j                   |       || j                   _        | j                  rn| j                  j                  |      t        k(  rLd | j                   _        | j                   j                  d= d }d | j                  _        d | j                  _        |rb|"g |j                  _        g |j                  _        d | j                  _        d | j                  _        | j$                  | j                  _        y y N)r   implementationcreateDocumentTypeownerDocumentr
   r   rq   
acceptNodeFILTER_REJECT
childNodesrs   r   r   r   _seq	notationsr   r   end_doctype_decl_handlerEndDoctypeDeclHandler)r'   doctypeNamesystemIdpublicIdhas_internal_subsetr   s         r)   r   z'ExpatBuilder.start_doctype_decl_handler   s    --..AA8- $dmmW- '<<DLL33G<M$(DMM!((,G-1DLL*/3DLL,"(*  %)+!!&*.DLL'8<DLL5151N1NDLL. r+   c                     | j                   j                  r| j                  | j                  _        | j
                  | j                  _        | j                  s| j                  st        | _
        y y y r&   )rn   r   r   rs   r   r   r   r   rq   r   _finish_end_elementr-   s    r)   r   z%ExpatBuilder.end_doctype_decl_handler  sM    ==!!*.*>*>DLL'48OO14<<')D$ $0r+   c                     | j                   j                  ||      }t        | j                  |       | j                  r?| j                  j                  |      t        k(  r| j                  j                  |       y y y r&   )r   createProcessingInstructionr
   r   rq   r   r   removeChild)r'   targetdatanodes       r)   r   zExpatBuilder.pi_handler	  s]    }}88FdllD)<<DLL33D9]JLL$$T* K<r+   c                    | j                   j                  }| j                  rZ| j                  r+|d   j                  t
        k(  r|d   j                  |       y | j                  j                  |      }d| _        n`|r2|d   j                  t        k(  r|d   }|j                  |z   }||_
        y t        j                         }||_
        | j                  |_        t        | j                   |       y )Nr   T)r   r   r   _cdata_continuenodeTypeCDATA_SECTION_NODE
appendDatar   createCDATASection	TEXT_NODEr   r   Textr   r
   )r'   r   r   r   values        r)   r   z)ExpatBuilder.character_data_handler_cdata  s    \\,,
;;&& n--1CC2))$/==33D9D#'D JrN33y@b>DII$EDI<<>DDI!%DdllD)r+   c                 2   | j                   j                  }|r0|d   j                  t        k(  r|d   }|j                  |z   |_        y t        j                         }|j                  |z   |_        | j                  |_        t        | j                   |       y r   )
r   r   r   r   r   r   r   r   r   r
   )r'   r   r   r   s       r)   r   z#ExpatBuilder.character_data_handler#  sv    \\,,
*R.11Y>b>D		D(DI||~II$	!]]dllD)r+   c                    |ry | j                   j                  sy | j                  j                  ||||      }|6| j                  j	                  |      }	|j
                  j                  |	       | j                  j                  j                  j                  j                  |       | j                  rO| j                  j                  |      t        k(  r,| j                  j                  j                  j                  d= y y y r   )rn   r   r   _create_entitycreateTextNoder   appendr   r   rq   r   r   )
r'   
entityNameis_parameter_entityr   baser   r   notationNamer   childs
             r)   r   z ExpatBuilder.entity_decl_handler.  s    }}%%}}++J,4lD MM007EOO""5)&&++2248<<DLL33D9]J%%..33B7 K<r+   c                 f   | j                   j                  |||      }| j                   j                  j                  j                  j                  |       | j                  rO| j                  j                  |      t        k(  r,| j                   j                  j                  j                  d= y y y r   )	r   _create_notationr   r   r   r   rq   r   FILTER_ACCEPT)r'   r   r   r   r   r   s         r)   r   z"ExpatBuilder.notation_decl_handler@  s    }}--lHhO'',,33D9<<DLL33D9]J%%//44R8 K<r+   c                     | j                   j                  |      }t        | j                  |       | j                  r?| j                  j                  |      t        k(  r| j                  j                  |       y y y r&   )r   createCommentr
   r   rq   r   r   r   )r'   r   r   s      r)   r   zExpatBuilder.comment_handlerF  s[    }}**40dllD)<<DLL33D9]JLL$$T* K<r+   c                      d| _         d| _        y )NTFr   r   r-   s    r)   r   z(ExpatBuilder.start_cdata_section_handlerL  s    $r+   c                      d| _         d| _        y )NFr   r-   s    r)   r   z&ExpatBuilder.end_cdata_section_handlerP  s    $r+   c                      yNr3   rT   )r'   contextr   r   r   s        r)   r   z(ExpatBuilder.external_entity_ref_handlerT  s    r+   c                     | j                   | j                  st        | _        | j                  | j                         _        | j	                  ||       y r&   )rq   r   r   r   start_element_handlerr   r   )r'   rb   
attributess      r)   r   z"ExpatBuilder.first_element_handlerW  s?    <<')D$/3/I/I,""44r+   c                    | j                   j                  |      }t        | j                  |       || _        |rjt	        dt        |      d      D ]Q  }t        j                  ||   t        d t              }||dz      }||_
        | j                   |_        t        ||       S || j                   j                  ur| j                  |       y y )Nr   r^   r3   )r   createElementr
   r   ranger`   r   Attrr   r   r   r   r   r   rr   )r'   rb   r   r   iar   s          r)   r   z"ExpatBuilder.start_element_handler]  s    }}**40dllD)1c*oq1 -LLA!%|5"1Q3"&--#D!,- t}}444&&t, 5r+   c                 T   | j                   r|| j                  j                  u ry | j                   j                  |      }|t        k(  rt        |        n|t        k(  rt        |        ny |j                  | _	        |j                  j                  |       |j                          y y r&   )rq   r   r   startContainerr   RejecterFILTER_SKIPSkipper
parentNoder   r   unlink)r'   r   filts      r)   rr   z"ExpatBuilder._finish_start_elementn  s    << t}}444<<..t4D}$$ ??DLOO''-KKM# r+   c                 `    | j                   }|j                  | _         | j                  |       y r&   )r   r  r   )r'   rb   r   s      r)   r   z ExpatBuilder.end_element_handler  s&    ,,))  )r+   c                 ^   | j                   j                  |j                        }|r| j                  ||       | j                  rh|| j
                  j                  u ry | j                  j                  |      t        k(  r,| j                  j                  |       |j                          y y y r&   )r   getr$   _handle_white_text_nodesrq   r   r   r   r   r   r   r  )r'   r   r9   s      r)   r   z ExpatBuilder._finish_end_element  s    ""7??3))'48<<$--777||&&w/=@((1  A r+   c                 (   | j                   j                  s|j                         sy g }|j                  D ]B  }|j                  t
        k(  s|j                  j                         r2|j                  |       D |D ]  }|j                  |        y r&   )
rn   whitespace_in_element_contentrE   r   r   r   r   stripr   r   )r'   r   r9   Lr   s        r)   r	  z%ExpatBuilder._handle_white_text_nodes  s}    MM77((*
 __ 	 E~~*5::3C3C3E	 
  	$EU#	$r+   c                     | j                   j                  |      }|t        ||      | j                   |<   y |j                  J ||_        y r&   )r   r  r    r#   )r'   rb   r(   r9   s       r)   r   z!ExpatBuilder.element_decl_handler  sG    ""4(<$/e$<DOOD!;;&&&DKr+   c           
          | j                   j                  |      }|t        |      }|| j                   |<   |j                  j	                  d |d d |d||g       y Nr   )r   r  r    r"   r   )r'   elemrb   rD   defaultrequiredr9   s          r)   r   z!ExpatBuilder.attlist_decl_handler  sZ    ""4(<t$D$(DOOD!4tWax@	Br+   c                     || j                   _        || j                   _        |dk\  r&|rd| j                   _        y d| j                   _        y y )Nr   TF)r   versionencoding
standalone)r'   r  r  r  s       r)   r   zExpatBuilder.xml_decl_handler  sA     '!)?+/(+0(	 r+   r&   ) rP   rQ   rR   __doc__r*   rx   r   rt   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rr   r   r   r	  r   r   r   rT   r+   r)   rk   rk      s    $	>.&:O**+*(	*8$9+%%5-".*
	!$" B1r+   rk   c                   :   e Zd ZdZdZd Zd Z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j0                  e
j2                  ej4                  e
j6                  ej8                  e
j:                  ej<                  e
j>                  ej@                  e
jB                  iZ"y)rp   zoWrapper around a DOMBuilderFilter which implements the checks
    to make the whatToShow filter attribute work.ro   c                     || _         y r&   r  )r'   ro   s     r)   r*   z#FilterVisibilityController.__init__  s	    r+   c                    | j                   |j                     }| j                  j                  |z  rK| j                  j	                  |      }|t
        k(  rt        |t        vrt        dt        |      z         |S t        S )Nz)startContainer() returned illegal value: )_nodetype_maskr   ro   
whatToShowr   FILTER_INTERRUPTr   _ALLOWED_FILTER_RETURNSra   reprr   )r'   r   maskvals       r)   r   z)FilterVisibilityController.startContainer  sz    ""4==1;;!!D(++,,T2C&&!!11 ADIMO OJ  r+   c                    | j                   |j                     }| j                  j                  |z  r| j                  j	                  |      }|t
        k(  rt        |t        k(  r7|j                  }|j                  d d  D ]  }|j                  |        t        S |t        vrt        dt        |      z         |S t        S )Nz%acceptNode() returned illegal value: )r  r   ro   r  r   r  r   r  r  r   appendChildr   r   ra   r!  r   )r'   r   r"  r#  parentr   s         r)   r   z%FilterVisibilityController.acceptNode  s    ""4==1;;!!D(++((.C&&!!k!!__Q/ .E&&u-. %$11 =S	IK KJ  r+   N)#rP   rQ   rR   r  rS   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  rT   r+   r)   rp   rp     s    5 I!!* 	**A*A**C*C**>*>**G*G""**J*J**@*@((**P*P**A*A**B*B**G*G##**K*K**B*B
Nr+   rp   c                       e Zd ZdZd Zy)FilterCrutch)_builder_level
_old_start_old_endc                     d| _         || _        |j                  }|j                  | _        |j
                  | _        | j                  |_        | j                  |_        y r  )	r@  r?  rs   r   rA  r   rB  r   r   )r'   rW   r   s      r)   r*   zFilterCrutch.__init__  sO     4400%)%?%?"#'#;#; r+   N)rP   rQ   rR   rS   r*   rT   r+   r)   r>  r>    s    >I<r+   r>  c                   "    e Zd ZdZd Zd Zd Zy)r   rT   c                 p    t         j                  | |       |j                  }dD ]  }t        ||d         y )N)r   r   r   r   r   r   )r>  r*   rs   setattr)r'   rW   r   rb   s       r)   r*   zRejecter.__init__  s:    dG, 	(D FD$'	(r+   c                 ,    | j                   dz   | _         y r   )r@  r'   argss     r)   r   zRejecter.start_element_handler  s    kkAor+   c                     | j                   dk(  rT| j                  j                  }| j                  j                  |       | j                  |_        | j                  |_        y | j                   dz
  | _         y Nr   r3   )r@  r?  rs   r~   rA  r   rB  r   )r'   rI  r   s      r)   r   zRejecter.end_element_handler  sV    ;;!]]**FMM!!&))-F&'+}}F$++/DKr+   N)rP   rQ   rR   rS   r*   r   r   rT   r+   r)   r   r     s    I
(&*r+   r   c                       e Zd ZdZd Zd Zy)r  rT   c                     | j                   j                  } | j                  |  | j                   j                  |ur| j                  dz   | _        y y r   )r?  r   rA  r@  )r'   rI  r   s      r)   r   zSkipper.start_element_handler*  sE    }}$$==  ,++/DK -r+   c                    | j                   dk(  rR| j                  | j                  j                  _        | j
                  | j                  j                  _        d | _        y | j                   dz
  | _          | j
                  |  y rK  )r@  rA  r?  rs   r   rB  r   rH  s     r)   r   zSkipper.end_element_handler0  s`    ;;! 9=DMM!!56:mmDMM!!3 DM++/DKDMM4 r+   N)rP   rQ   rR   rS   r   r   rT   r+   r)   r  r  '  s    I*	!r+   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                   <    e Zd ZdZd
dZd Zd Zd Zd Zd Z	d	 Z
y)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                     |j                   t        k(  r|| _        || _        n|j                  | _        || _        t
        j                  | |       y r&   )r   r5  originalDocumentr   r   rk   r*   )r'   r   ru   s      r)   r*   zFragmentBuilder.__init__X  sD    },$+D!"DL$+$9$9D!"DLdG,r+   c                 <    t         j                  |        d | _        y r&   )rk   rt   fragmentr-   s    r)   rt   zFragmentBuilder.reseta  s    4 r+   c                 @    | j                  |j                               S )zRParse a document fragment from a file object, returning the
        fragment node.)r   r   r'   r   s     r)   r   zFragmentBuilder.parseFilee  s     		,,r+   c                    || _         | j                         }| j                  j                  }d}|rd|j                  xs | j                         }|j                  rd|j                  d|j                  d}n|j                  rd|j                  z  }nd}| j                         }t        |||fz  }	 |j                  |d       | j                  }| j                          |S #  | j                           xY w)zMParse a document fragment from a string, returning the
        fragment node. zPUBLIC "z" ""zSYSTEM "%s"T)_sourcer   rR  r   r   _getDeclarationsr   r   _getNSattrs_FRAGMENT_BUILDER_TEMPLATEr   rt   rT  )	r'   r   r   r   identr   nsattrsr   rT  s	            r)   r   zFragmentBuilder.parseStringj  s     !''//++Ft/D/D/FF#,,g.>.>@!!%(8(88F""$-0HH	LL4( ==

	JJLs   5C% %C8c                 :   | j                   j                  j                  }d}|rut        |j                  j
                        D ]s  }|j                  j                  |      }|r|dz   }|d|j                  }|j                  r |d|j                  d|j                  d}b|d|j                  d}u t        |j                  j
                        D ]  }|j                  j                  |      }|r|dz   }|d|j                  }|j                  r |d|j                  d|j                  d	}n;|j                  r|d|j                  d	}n|d
|j                  j                  d	}|j                  r|d|j                  }|dz   } |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.
        rX  z
  z<!NOTATION z	 PUBLIC "z"
             "z">z	 SYSTEM "z	<!ENTITY rY  z "z
 NOTATION >)r   r   r   r   r   lengthitemnodeNamer   r   r   
firstChildr   r   )r'   r   rX   r   notationr   s         r)   r[  z FragmentBuilder._getDeclarations  so    ,,,,447,,334 	C",,11!4F
A)*H,=,=>$$h//1B1BDA ./0A0ABA	C 7++223  ))..q1F
A'(&//:??foov@A__,-v?A%&(9(9(>(>?A&&,-v/B/BCAG r+   c                      y)NrX  rT   r-   s    r)   r\  zFragmentBuilder._getNSattrs  s    r+   c                    |t         k(  r| j                  }| j                  }| j                  j	                  |      }| j
                  | _        | j                  j                         | _        | j                  | _        	 |j                  | j                  d       || _        || _        d | _	        yt        j                  | ||||      S # || _        || _        d | _	        w xY w)NTr   )$_FRAGMENT_BUILDER_INTERNAL_SYSTEM_IDr   r   rs   ExternalEntityParserCreaterR  createDocumentFragmentrT  r   rZ  rk   r   )r'   r   r   r   r   old_documentold_cur_noder   s           r)   r   z+FragmentBuilder.external_entity_ref_handler  s    ;;  ==L<<L\\<<WEF 11DM MM@@BDM==DL$T\\40+ ,#;;gtXx9 9  , ,#s   ?C
 
C!r&   )rP   rQ   rR   r  r*   rt   r   r   r[  r\  r   rT   r+   r)   rP  rP  O  s+    --
8"H9r+   rP  c                   6    e Zd ZdZd Zd Zd Zd Zd Z	 d Z	y)	
Namespacesz7Mix-in class for builders; adds support for namespaces.c                     g | _         y r&   )_ns_ordered_prefixesr-   s    r)   _initNamespaceszNamespaces._initNamespaces  s     %'!r+   c                 @    t        j                  d      }d|_        |S )z'Create a new namespace-handling parser.r[   )namespace_separatorT)r	   rw   namespace_prefixesr   s     r)   rx   zNamespaces.createParser  s    ##<$(!r+   c                     t         j                  | |       | j                  j                  r| j                  |_        yy)z.Insert the namespace-handlers onto the parser.N)rk   r~   rn   namespace_declarationsstart_namespace_decl_handlerStartNamespaceDeclHandlerr   s     r)   r~   zNamespaces.install  s5    T6*==//11 , 0r+   c                 >    | j                   j                  ||f       y)z/Push this namespace declaration on our storage.N)rq  r   )r'   rg   re   s      r)   rx  z'Namespaces.start_namespace_decl_handler  s    !!((&#7r+   c                    d|v rt        | |      \  }}}}nt        }|}d }t        }t        j                  ||||      }| j
                  |_        t        | j                  |       || _        | j                  r| j                  D ]u  \  }}|r*t        j                  t        | d|z         t        |d      }n t        j                  dt        dt              }||_        | j
                  |_        t        ||       w | j                  d d = |r|j                          |j                   }	|j"                  }
t%        dt'        |      d      D ]  }||   }||dz      }d|v r6t        | |      \  }}}}t        j                  ||||      }||	|<   ||
||f<   n0t        j                  |t        |t              }||	|<   ||
t        |f<   | j
                  |_        ||_        ||_         y y )Nr[   xmlns:xmlnsr   r^   r3   )ri   r   r   r   Elementr   r   r
   r   rq  r   rY   r   r   r   _ensure_attributes_attrs_attrsNSr   r`   ownerElement)r'   rb   r   re   rf   rg   rh   r   r   r  r  r   r8   r   s                 r)   r   z Namespaces.start_element_handler  s   $;,:4,F)CFE!CEI!Fuc69=!]]dllD)$$#88 	-WT8f3D%E%4fgGA  Wo%,l<A"&--#D!,	- ))!,##%[[F}}H1c*oq1 &"1"1Q3%<4B44O1CFEUCFCA$%F5M12Hc9-.UO%*L:A$%F5M9:Hou56"&--!%&	 r+   c                 R   | j                   }d|v rEt        | |      \  }}}}|j                  |k(  r|j                  |k(  r|j                  |k(  s7J d       |j
                  |k(  sJ d       |j                  t        k(  sJ d       |j                  | _         | j                  |       y )Nr[   z$element stack messed up! (namespace)z&element stack messed up - bad nodeNamez*element stack messed up - bad namespaceURI)	r   ri   r=   r>   rg   rd  r   r  r   )r'   rb   r   re   rf   rg   rh   s          r)   r   zNamespaces.end_element_handler  s    llGd{0>tT0J-Y,,3#--:#NNf4? ?? 5
 ''4/ @?@/++> DCD>"--DL$$W-r+   N)
rP   rQ   rR   r  rr  rx   r~   rx  r   r   rT   r+   r)   ro  ro    s)    A'
38-&^ 	.r+   ro  c                       e Zd ZdZd Zy)ExpatBuilderNSz*Document builder that supports namespaces.c                 N    t         j                  |        | j                          y r&   )rk   rt   rr  r-   s    r)   rt   zExpatBuilderNS.reset&  s    4 r+   N)rP   rQ   rR   r  rt   rT   r+   r)   r  r  #  s
    4r+   r  c                       e Zd ZdZd Zd Zy)FragmentBuilderNSz*Fragment builder that supports namespaces.c                 N    t         j                  |        | j                          y r&   )rP  rt   rr  r-   s    r)   rt   zFragmentBuilderNS.reset.  s    d#r+   c                    d}| j                   }g }|rtt        |d      rY|j                  j                         D ]<  \  }}||v r|j	                  |       |rd|z   }nd}|r|d|d|d}4d|d|d}> |j
                  }|rt|S )	zNReturn string of namespace attributes from this element and
        ancestors.rX  _ns_prefix_urir|  r}  z
    z=''r[   )r   hasattrr  itemsr   r  )r'   attrsr   r  rg   re   declnames          r)   r\  zFragmentBuilderNS._getNSattrs2  s     ,,w 01#*#9#9#?#?#A =KFC{ HHV$#+f#4#*5:Hc J  /7 <= ((G   r+   N)rP   rQ   rR   r  rt   r\  rT   r+   r)   r  r  +  s    4r+   r  c                       e Zd ZdZy)r   zEException raised to short-circuit parsing in InternalSubsetExtractor.N)rP   rQ   rR   r  rT   r+   r)   r   r   P  s    Or+   r   c                   >    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zy)
r   zBXML processor which can rip out the internal document type subset.Nc                     | j                   S )z'Return the internal subset as a string.)r   r-   s    r)   r   z!InternalSubsetExtractor.getSubsetY  s    {{r+   c                 P    	 t         j                  | |       y # t        $ r Y y w xY wr&   )rk   r   r   rV  s     r)   r   z!InternalSubsetExtractor.parseFile]  s)    	""4. 		    	%%c                 P    	 t         j                  | |       y # t        $ r Y y w xY wr&   )rk   r   r   )r'   r   s     r)   r   z#InternalSubsetExtractor.parseStringc  s)    	$$T62 		r  c                 H    | j                   |_        | j                  |_        y r&   )r   r   r   r   r   s     r)   r~   zInternalSubsetExtractor.installi  s    )-)H)H&%)%?%?"r+   c                     |rD| j                         }g | _        | j                  j                  |_        | j                  |_        y t               r&   )r   r   r   DefaultHandlerr   r   r   )r'   rb   r   r   r   r   s         r)   r   z2InternalSubsetExtractor.start_doctype_decl_handlerm  s@    ^^%FDK$(KK$6$6F!+/+H+HF(-r+   c                     dj                  | j                        j                  dd      j                  dd      }|| _        t               )NrX  z

)joinr   replacer   )r'   rX   s     r)   r   z0InternalSubsetExtractor.end_doctype_decl_handlerw  s=    GGDKK ((6>>tTJmr+   c                     t               r&   )r   )r'   rb   r  s      r)   r   z-InternalSubsetExtractor.start_element_handler|  s
    mr+   )rP   rQ   rR   r  r   r   r   r   r~   r   r   r   rT   r+   r)   r   r   T  s.    LF@ 
r+   r   c                     |rt               }n
t               }t        | t              r(t	        | d      5 }|j                  |      }ddd       |S |j                  |       }|S # 1 sw Y   S xY w)z{Parse a document, returning the resulting Document node.

    'file' may be either a file name or an open file object.
    rbN)r  rk   
isinstancestropenr   )r   
namespacesrW   fpresults        r)   parser    sq    
  ".$$ 	+&&r*F	+ M ""4(M		+ Ms   A##A-c                 R    |rt               }n
t               }|j                  |       S )zOParse a document from a string, returning the resulting
    Document node.
    )r  rk   r   )r   r  rW   s      r)   r   r     s'      ".v&&r+   c                     |rt        |      }nt        |      }t        | t              r(t	        | d      5 }|j                  |      }ddd       |S |j                  |       }|S # 1 sw Y   S xY w)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.
    r  N)r  rP  r  r  r  r   )r   r   r  rW   r  r  s         r)   parseFragmentr    sv     #G,!'*$$ 	+&&r*F	+ M ""4(M		+ Ms   A%%A/c                 V    |rt        |      }nt        |      }|j                  |       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.
    )r  rP  r   )r   r   r  rW   s       r)   parseFragmentStringr    s,    
 #G,!'*v&&r+   c                 F    | j                   rt        |       S t        |       S )z,Create a builder based on an Options object.)r  r  rk   )ru   s    r)   makeBuilderr    s!    g&&G$$r+   )T)3r  xml.domr   r   r   r   r   r   xml.parsersr	   xml.dom.minidomr
   r   xml.dom.NodeFilterr   r   r   r5  DOMBuilderFilterr   r   r  r  getDOMImplementationr   TypeInfor6   objectr    rY   ri   rk   r   rp   r>  r   r  ri  r]  rP  ro  r  r  	Exceptionr   r   r  r   r  r  r  rT   r+   r)   <module>r     s/  : . - B B  > )NN	,, ""++99++99))55..?? 3w335  !  w/   }5   x0   z2   t,   w/   x0   y1   z2
1(& 1(f,6&y1 y1|	 )-E 7
 7
t
<6 
<*| *8!l !2 ? %* +	+ r9l r9j\. \.~Z "
O "J	) 	)l )X$'(	'%r+   