fm dZddlmZmZmZddlmZmZmZddlm Z ddl m Z m Z ddl mZejZej Zej"Zej$j&Zej$j(Zej$j*Zej$j,Zej.Zej2ddej2dd ej2dd ej2dd ej2dd ej2dd ej2ddej2ddej2ddd ZGddeZdZdZGddZeeefZ GddeZ!GddeZ"Gdde"Z#Gdde"Z$d Z%d!e%zZ&Gd"d#eZ'Gd$d%Z(Gd&d'e(eZ)Gd(d)e(e'Z*Gd*d+e+Z,Gd,d-eZ-d3d.Z.d3d/Z/d3d0Z0d3d1Z1d2Z2y)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. ) xmlbuilderminidomNode)EMPTY_NAMESPACE EMPTY_PREFIXXMLNS_NAMESPACE)expat) _append_child_set_attribute_node) NodeFilterNcdata enumerationentityentitiesididrefidrefsnmtokennmtokens) CDATAENUMENTITYENTITIESIDIDREFIDREFSNMTOKENNMTOKENScHeZdZdZd dZdZdZdZdZdZ d Z d Z d Z y) ElementInfo _attr_info_modeltagNameNc.||_g|_||_yN)r$r"r#)selfr$models +/usr/lib/python3.12/xml/dom/expatbuilder.py__init__zElementInfo.__init__?s  cH|j|j|jfSr&r!r's r) __getstate__zElementInfo.__getstate__Ds T\\99r+c.|\|_|_|_yr&r!)r'states r) __setstate__zElementInfo.__setstate__Gs5:2dlr+c|jD]0}|d|k(s |d}|ddk(r tdcSt|dcStjS)Nr(r)r" _typeinfo_mapr_no_type)r'anameinfots r)getAttributeTypezElementInfo.getAttributeTypeJs]OO 3DAw%HQ43;(00(b22  3r+c"tjSr&)rr7)r' namespaceURI localNames r)getAttributeTypeNSzElementInfo.getAttributeTypeNSTsr+c|jrE|jd}|tjjtjjfvSyNrF)r#r r( XML_CTYPE_ANYXML_CTYPE_MIXED)r'types r)isElementContentzElementInfo.isElementContentWsF ;;;;q>D 9 9 % ; ; == =r+cp|jr*|jdtjjk(SyrA)r#r r(XML_CTYPE_EMPTYr-s r)isEmptyzElementInfo.isEmpty_s) ;;;;q>U[[%@%@@ @r+cJ|jD]}|d|k(s |ddk(cSy)Nr3r4rF)r")r'r8r9s r)isIdzElementInfo.isIdes5OO (DAw%Bx4'' (r+c(|j||fSr&)rJ)r'eurienameaurir8s r)isIdNSzElementInfo.isIdNSksyy$''r+r&) __name__ __module__ __qualname__ __slots__r*r.r1r;r?rErHrJrOr+r)r r <s41I :;    (r+r c&|j||Sr&)_intern_setdefault)builderss r)_internrYos  % %a ++r+c6d|vsJ|jd}|j}t|dk(r)|\}}}|||}|d|}|||}|||}n3t|dk(r|\}}t}|||x}}nt d|z||||||fS)N :z4Unsupported syntax: spaces in URIs not supported: %r)splitrVlenr ValueError)rWnamepartsinternuri localnameprefixqnames r)_parse_ns_namerirs $;; JJsOE  ' 'F 5zQ!&Y'!9-ue$9i0 UqY"9i88 ORVVWW #s Y 55r+ceZdZdZddZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZy) ExpatBuilderzPDocument builder that uses Expat to build a ParsedXML.DOM document instance.Nc|tj}||_|jj%t |jj|_nd|_t |_d|_|jyr&) rOptions_optionsfilterFilterVisibilityController_filterr_finish_start_element_parserreset)r'optionss r)r*zExpatBuilder.__init__sc ? ((*G ==   +5dmm6J6JKDLDL*,D &  r+c*tjS)zCreate a new parser object.)r ParserCreater-s r) createParserzExpatBuilder.createParsers!!##r+cB|js|j|_|jjj|_d|j_d|j_d|j_|j|j|jS)z7Return the parser object, creating a new one if needed.T) rsrxrd setdefaultrV buffer_textordered_attributesspecified_attributesinstallr-s r) getParserzExpatBuilder.getParserso||,,.DL&*ll&9&9&D&DD #'+DLL $.2DLL +04DLL - LL &||r+ctjtdd|_|j|_|jj |_d|_y)z6Free all data structures used during DOM construction.NF)theDOMImplementationcreateDocumentrdocumentcurNode _elem_info_cdatar-s r)rtzExpatBuilder.resets>,;; T4) }} --22 r+c|j|_|j|_|j|_|j |_|jjr|j|_ |j|_ |jjr|j|_|jj"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_handlerStartDoctypeDeclHandlerfirst_element_handlerStartElementHandlerend_element_handlerEndElementHandler pi_handlerProcessingInstructionHandlerrnrentity_decl_handlerEntityDeclHandlernotation_decl_handlerNotationDeclHandlercommentscomment_handlerCommentHandlercdata_sectionsstart_cdata_section_handlerStartCdataSectionHandlerend_cdata_section_handlerEndCdataSectionHandlercharacter_data_handler_cdataCharacterDataHandlercharacter_data_handlerexternal_entity_ref_handlerExternalEntityRefHandlerxml_decl_handlerXmlDeclHandlerelement_decl_handlerElementDeclHandlerattlist_decl_handlerAttlistDeclHandlerr'parsers r)r~zExpatBuilder.installs*.)H)H&%)%?%?"#'#;#; .2oo+ == ! !'+'?'?F $%)%?%?" == ! !$($8$8F ! == ' '.2.N.NF +,0,J,JF )*.*K*KF '*.*E*EF '*.*J*J' $ 5 5$($=$=!$($=$=!r+c||j}d} |jdx}rQ|j|d|r'|jjr|j |d}|jdx}rQ|jdd|j}|jd|_|S#t $rY0wxYw)zIParse a document from a file object, returning the document node.Ti@Fr+N) rreadParserdocumentElement _setup_subset ParseEscapertrs)r'filer first_bufferbufferdocs r) parseFilezExpatBuilder.parseFiles!   IIg..&. VU+DMM$A$A&&v.$ !IIg..&. LLd #mm      sA#B/8B// B;:B;c|j} |j|d|j||j}|j d|_|S#t$rY0wxYw)z*>DLL '48OO 14<<')D $$0r+c|jj||}t|j||jr?|jj |t k(r|jj|yyyr&)rcreateProcessingInstructionr rrqrr removeChild)r'targetdatanodes r)rzExpatBuilder.pi_handler s]}}88FdllD) <DII$EDI <<>DDI!%D dllD)r+c2|jj}|r0|djtk(r|d}|j|z|_yt j }|j|z|_|j|_t|j|yr) rrrrrrrrrr )r'rrrs r)rz#ExpatBuilder.character_data_handler#sv\\,, *R.11Y>b>D D(DI ||~II$ !]]dllD)r+c |ry|jjsy|jj||||}|6|jj |} |j j | |jjjjj ||jrO|jj|tk(r,|jjjjd=yyyr) rnrr_create_entitycreateTextNoderappendrrrqrr) r' entityNameis_parameter_entityrbaserr notationNamerchilds r)rz ExpatBuilder.entity_decl_handler.s  }}%% }}++J,4lD  MM007E OO " "5 ) &&++2248 <.& :O**+ *( *8$9 + %%5 -".* !$" B1r+rkc:eZdZdZdZdZdZdZeje jeje jeje jej e j"ej$e j&ej(e j*ej,e j.ej0e j2ej4e j6ej8e j:ej<e j>ej@e jBi Z"y)rpzoWrapper around a DOMBuilderFilter which implements the checks to make the whatToShow filter attribute work.roc||_yr&r)r'ros r)r*z#FilterVisibilityController.__init__s  r+c|j|j}|jj|zrK|jj |}|t k(rt |tvrtdt|z|StS)Nz)startContainer() returned illegal value: ) _nodetype_maskrro whatToShowrFILTER_INTERRUPTr_ALLOWED_FILTER_RETURNSrareprr)r'rmaskvals r)rz)FilterVisibilityController.startContainersz""4==1 ;; ! !D (++,,T2C&&!!11 ADIMOOJ r+c|j|j}|jj|zr|jj |}|t k(rt |tk(r7|j}|jddD]}|j|tS|tvrtdt|z|StS)Nz%acceptNode() returned illegal value: )rrrorrrrrrr appendChildrr rar!r)r'rr"r#parentrs r)rz%FilterVisibilityController.acceptNodes""4==1 ;; ! !D (++((.C&&!!k!!__Q/.E&&u-.%$11 =S IKKJ r+N)#rPrQrRrrSr*rrr ELEMENT_NODEr SHOW_ELEMENTATTRIBUTE_NODESHOW_ATTRIBUTEr SHOW_TEXTrSHOW_CDATA_SECTIONENTITY_REFERENCE_NODESHOW_ENTITY_REFERENCE ENTITY_NODE SHOW_ENTITYPROCESSING_INSTRUCTION_NODESHOW_PROCESSING_INSTRUCTION COMMENT_NODE SHOW_COMMENT DOCUMENT_NODE SHOW_DOCUMENTDOCUMENT_TYPE_NODESHOW_DOCUMENT_TYPEDOCUMENT_FRAGMENT_NODESHOW_DOCUMENT_FRAGMENT NOTATION_NODE SHOW_NOTATIONrrTr+r)rprps5I !!* **A*A **C*C **>*> **G*G ""**J*J **@*@ ((**P*P **A*A **B*B **G*G ##**K*K **B*B  Nr+rpceZdZdZdZy) FilterCrutch)_builder_level _old_start_old_endcd|_||_|j}|j|_|j |_|j|_|j|_yr) r@r?rsrrArrBrr)r'rWrs r)r*zFilterCrutch.__init__sO   4400 %)%?%?"#'#;#; r+N)rPrQrRrSr*rTr+r)r>r>s >Ic"eZdZdZdZdZdZy)rrTcptj|||j}dD]}t||dy)N)rrrrrr)r>r*rssetattr)r'rWrrbs r)r*zRejecter.__init__s:dG, (D FD$ ' (r+c,|jdz|_yr)r@r'argss r)rzRejecter.start_element_handlerskkAo r+c|jdk(rT|jj}|jj||j|_|j |_y|jdz |_yNrr3)r@r?rsr~rArrBr)r'rIrs r)rzRejecter.end_element_handlersV ;;! ]]**F MM ! !& ))-F &'+}}F $++/DKr+N)rPrQrRrSr*rrrTr+r)rr sI (&*r+rceZdZdZdZdZy)rrTc|jj}|j||jj|ur|jdz|_yyr)r?rrAr@)r'rIrs r)rzSkipper.start_element_handler*sE}}$$ ==  ,++/DK -r+c |jdk(rR|j|jj_|j |jj_d|_y|jdz |_|j |yrK)r@rAr?rsrrBrrHs r)rzSkipper.end_element_handler0s` ;;! 9=DMM ! ! 56:mmDMM ! ! 3 DM++/DK DMM4 r+N)rPrQrRrSrrrTr+r)rr'sI* !r+rz8http://xml.python.org/entities/fragment-builder/internalz %%s ]> &fragment-builder-internal;c<eZdZdZd dZdZdZdZdZdZ 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|jtk(r||_||_n|j|_||_t j ||yr&)rr5originalDocumentrrrkr*)r'rrus r)r*zFragmentBuilder.__init__XsD   } ,$+D !"DL$+$9$9D !"DLdG,r+c<tj|d|_yr&)rkrtfragmentr-s r)rtzFragmentBuilder.resetas4  r+c@|j|jS)zRParse a document fragment from a file object, returning the fragment node.)rrr'rs r)rzFragmentBuilder.parseFilees ,,r+c||_|j}|jj}d}|rd|jxs|j }|j rd|j d|jd}n|jrd|jz}nd}|j}t|||fz} |j|d|j}|j|S#|jxYw)zMParse a document fragment from a string, returning the fragment node.zPUBLIC "z" ""z SYSTEM "%s"T) _sourcerrRrr_getDeclarationsrr _getNSattrs_FRAGMENT_BUILDER_TEMPLATErrtrT) r'rrridentrnsattrsrrTs r)rzFragmentBuilder.parseStringjs !''// ++Ft/D/D/FF#,,g.>.>@!!%(8(88F""$-0HH  LL4 (==    JJL s 5C%%C8c:|jjj}d}|rut|jj D]s}|jj |}|r|dz}|d|j}|jr |d|jd|jd}b|d|jd}ut|jj D]}|jj |}|r|dz}|d|j}|jr |d|jd|jd }n;|jr|d|jd }n|d |jjd }|jr|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. rXz z z SYSTEM "z )rrrrrlengthitemnodeNamerrr firstChildrr)r'rrXrnotationrs r)r[z FragmentBuilder._getDeclarationsso ,,,,44  7,,334 C",,11!4F A)*H,=,=>$$h//1B1BDA./0A0ABA C7++223  ))..q1F A'(&//:??foov@A__,-v?A%&(9(9(>(>?A&&,-v/B/BCAG r+cy)NrXrTr-s r)r\zFragmentBuilder._getNSattrssr+c|tk(r|j}|j}|jj |}|j |_|jj |_|j|_ |j|jd||_||_d|_ ytj|||||S#||_||_d|_ wxYw)NTr) $_FRAGMENT_BUILDER_INTERNAL_SYSTEM_IDrrrsExternalEntityParserCreaterRcreateDocumentFragmentrTrrZrkr)r'rrrr old_document old_cur_noders r)rz+FragmentBuilder.external_entity_ref_handlers ; ; ==L<|jj||fy)z/Push this namespace declaration on our storage.N)rqr)r'rgres r)rxz'Namespaces.start_namespace_decl_handlers !!((&#7r+cd|vrt||\}}}}nt}|}d}t}tj||||}|j |_t|j|||_|jr|jD]u\}}|r*tjt|d|zt|d}n tjdtdt}||_ |j |_t||w|jdd=|r|j|j } |j"} t%dt'|dD]} || } || dz} d| vr6t|| \}}}}tj||||}|| |<|| ||f<n0tj| t| t}|| | <|| t| f<|j |_| |_ ||_yy)Nr[xmlns:xmlnsrr^r3)rirrrElementrrr rrqrrYrrr _ensure_attributes_attrs_attrsNSrr` ownerElement)r'rbrrerfrgrhrrrrrr8rs r)rz Namespaces.start_element_handlers $;,:4,F )CFE!CEI!Fuc69=!]]dllD)  $ $#88 -  WT8f3D%E%4fgGA Wo%,lrgrdrrr)r'rbrrerfrgrhs r)rzNamespaces.end_element_handlersllGd{0>tT0J-Y,,3#--:#NNf4???5 ''4/@?@/++>DCD>"--DL  $ $W -r+N) rPrQrRrrrrxr~rxrrrTr+r)roros)A'  38-&^  .r+roceZdZdZdZy)ExpatBuilderNSz*Document builder that supports namespaces.cNtj||jyr&)rkrtrrr-s r)rtzExpatBuilderNS.reset&s4  r+N)rPrQrRrrtrTr+r)rr#s 4r+rceZdZdZdZdZy)FragmentBuilderNSz*Fragment builder that supports namespaces.cNtj||jyr&)rPrtrrr-s r)rtzFragmentBuilderNS.reset.sd# r+cd}|j}g}|rtt|drY|jjD]<\}}||vr |j ||rd|z}nd}|r |d|d|d}4d|d|d}>|j }|rt|S) zNReturn string of namespace attributes from this element and ancestors.rX_ns_prefix_urir|r}z z=''r[)rhasattrritemsrr)r'attrsrr rgredeclnames r)r\zFragmentBuilderNS._getNSattrs2s,, w 01#*#9#9#?#?#A =KFC{ HHV$#+f#4#*5:Hc J/7 < =((G  r+N)rPrQrRrrtr\rTr+r)rr+s4r+rceZdZdZy)rzEException raised to short-circuit parsing in InternalSubsetExtractor.N)rPrQrRrrTr+r)rrPsOr+rc>eZdZdZdZdZdZdZdZdZ dZ d Z y) rzBXML processor which can rip out the internal document type subset.Nc|jS)z'Return the internal subset as a string.)rr-s r)rz!InternalSubsetExtractor.getSubsetYs {{r+cP tj||y#t$rYywxYwr&)rkrrrVs r)rz!InternalSubsetExtractor.parseFile]s)   " "4 .     %%cP tj||y#t$rYywxYwr&)rkrr)r'rs r)rz#InternalSubsetExtractor.parseStringcs)   $ $T6 2   rcH|j|_|j|_yr&)rrrrrs r)r~zInternalSubsetExtractor.installis)-)H)H&%)%?%?"r+c|rD|j}g|_|jj|_|j|_yt r&)rrrDefaultHandlerrrr)r'rbrrrrs r)rz2InternalSubsetExtractor.start_doctype_decl_handlerms@ ^^%FDK$(KK$6$6F !+/+H+HF (- r+cdj|jjddjdd}||_t)NrXz   )joinrreplacer)r'rXs r)rz0InternalSubsetExtractor.end_doctype_decl_handlerws= GGDKK ( ( 6 > >tT J mr+ctr&)r)r'rbrs r)rz-InternalSubsetExtractor.start_element_handler|s mr+) rPrQrRrrrrrr~rrrrTr+r)rrTs.L F  @  r+rc|r t}n t}t|tr(t |d5}|j |}ddd|S|j |}|S#1swYSxYw)z{Parse a document, returning the resulting Document node. 'file' may be either a file name or an open file object. rbN)rrk isinstancestropenr)r namespacesrWfpresults r)parsersq  ".$ $  +&&r*F + M""4( M  + Ms A##A-cR|r t}n t}|j|S)zOParse a document from a string, returning the resulting Document node. )rrkr)rrrWs r)rrs' ".   v &&r+c|r t|}n t|}t|tr(t |d5}|j |}ddd|S|j |}|S#1swYSxYw)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. rN)rrPrrrr)rrrrWrrs r) parseFragmentrsv#G,!'*$ $  +&&r*F + M""4( M  + Ms A%%A/cV|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. )rrPr)rrrrWs r)parseFragmentStringrs, #G,!'*   v &&r+cF|jr t|St|S)z,Create a builder based on an Options object.)rrrk)rus r) makeBuilderrs!g&&G$$r+)T)3rxml.domrrrrrr xml.parsersr xml.dom.minidomr r xml.dom.NodeFilterr rrr5DOMBuilderFilterrrrrgetDOMImplementationrTypeInfor6objectr rYrirkr rpr>rrrir]rProrr ExceptionrrrrrrrrTr+r)rs/:.-BB>) NN ,,"" ++99 ++99 ))55 ..??3w335!  w/   }5   x0   z2   t,   w/   x0   y1   z2  1(&1(f,6&y1y1| )-E7 7 t <6 <*|*8!l!2?%*+ +r9lr9j\.\.~Z" O"J ) )l)X$'( '%r+