U .e*7@sdZddlmZmZmZddlZddlZddlZddlm Z ddl m Z ddlm Z dd lm Z dd lmZddlm Z d Zed Ze d jZGdddeZGdddeZddZddZGddde jZdS)aModule for supporting the lxml.etree library. The idea here is to use as much of the native library as possible, without using fragile hacks like custom element names that break between releases. The downside of this is that we cannot represent all possible trees; specifically the following are known to cause problems: Text or comments as siblings of the root element Docypes with no name When any of these things occur, we emit a DataLossWarning )absolute_importdivisionunicode_literalsN)base)DataLossWarning) constants)etree) _ihatexmlTz {([^}]*)}(.*)Zasdc@seZdZddZdS) DocumentTypecCs||_||_||_dSN)namepublicIdsystemId)selfrrrrP/usr/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py__init__#szDocumentType.__init__N)__name__ __module__ __qualname__rrrrrr "sr c@s,eZdZddZddZddZeeZdS)DocumentcCsd|_g|_dSr ) _elementTree _childNodesrrrrr*szDocument.__init__cCs|j|jdSr )rgetrootZaddnext_elementrelementrrr appendChild.szDocument.appendChildcCs|jSr )rrrrr_getChildNodes1szDocument._getChildNodesN)rrrrr r!propertyZ childNodesrrrrr)srcs6gtjdddfdd |ddS)NTZpreventDoubleDashCommentsrc s,t|ds,t|drd|jjrz|jjsF|jjsFd|jj}nd|jj|jj|jjf}dd|d|f|}|dk r|}q|dk r||d| }qnnt |t st |t rt |t st jd dkstd d||fn$d |D]}||dqn|jtkrd d||jft|d r(|jr(d d||jfnt |tjsttj|j}|dk r|d}|d}tj|}dd|||fndd||jft|drg}|jD]d\} } t| }|dk rj|\}} | } tj|}d|| f} n | } || | fq t |D]&\} } dd|d| | fq|jrڈd d|d|jf|d7}|D]} | |qt|d r(|jr(d d|d|jfdS)Ntagrz #document zz|%s%s rrz|%s"%s"z#document-fragmentz|%stailrz |%s<%s %s>z|%s<%s>attribz%s %sz |%s%s="%s")!hasattrappenddocinfo internalDTDZ public_idZ system_url root_namerZ getpreviousZgetnext isinstancestrbytessys version_infoAssertionErrorr$ comment_typetextr'r Z_Elementetree_builders tag_regexpmatchgroupr prefixes fromXmlNamer(itemsgroupssorted) rindentdtd_strZ next_elementZnsmatchnsr$prefix attributesrvalueZ attr_stringchild infosetFilterrvserializeElementrrrI;s|                       z(testSerializer..serializeElement )r)r InfosetFilterjoinrrrFrtestSerializer7s  F rNcs$gfdd|dS)z4Serialize an element and its child nodes to a stringcst|dsH|jjr:|jjr$|jj}n d|jj}||n|jtkrfd|j fn~|j sd|jfn.d dd|j D}d|j|f|j r|j |D] }|qĈd |jft|d r|j r|j dS) Nr$r%z z<%s>r&cSsg|]\}}d||fqS)z%s="%s"r).0rrDrrr sz6tostring..serializeElement..z<%s %s>zr')r)r+r,doctyper-r*rr$r4r5r(rLr<r')rr@attrrErHrIrrrIs,        z"tostring..serializeElement)rLrMrrSrtostrings rUcszeZdZeZeZdZdZeZ e Z dddZ ddZ ddZd d Zd d Zd dZdddZdfdd ZddZZS) TreeBuilderNFcstjt|dtjdd|_||_GfdddtGfdddj}Gfdd d j }||_ ||_ t j ||dS) N)fullTreeTr#cs&eZdZdfdd ZfddZdS)z(TreeBuilder.__init__..AttributesNcsr|dkr i}||_t|||D]F\}}t|trTd|d|df}n |}||jjj|<q&dSN{%s}%srr)rdictrr<r.tuplecoerceAttributer()rrrDkeyrrGrrrs   z1TreeBuilder.__init__..Attributes.__init__csPt|||t|tr4d|d|df}n |}||jjj|<dSrX)rZ __setitem__r.r[r\rr()rr]rDrr^rrr_s   z4TreeBuilder.__init__..Attributes.__setitem__)N)rrrrr_rr^rr Attributess r`csxeZdZfddZfddZfddZeeeZddZfd d Z eee Z dfd d Z fddZ d S)z%TreeBuilder.__init__..Elementcs*|}jj|||d||_dS)N) namespace) coerceElementElementr _attributes)rrrar`builderrGrrrs z.TreeBuilder.__init__..Element.__init__cs$||_||j|j|j_dSr )rb_nameZ _getETreeTagZ _namespacerr$)rrr^rr_setNames  z.TreeBuilder.__init__..Element._setNamecs |jSr )r;rgrr^rr_getNamesz.TreeBuilder.__init__..Element._getNamecSs|jSr rdrrrr_getAttributessz4TreeBuilder.__init__..Element._getAttributescs|||_dSr rj)rrC)r`rr_setAttributessz4TreeBuilder.__init__..Element._setAttributesNcs|}j|||dSr )ZcoerceCharactersrc insertText)rdataZ insertBeforerfrGrrrms z0TreeBuilder.__init__..Element.insertTextcsj||dSr )rcr )rrE)rfrrr sz1TreeBuilder.__init__..Element.appendChild)N) rrrrrhrir"rrkrlrCrmr rrerrrcs     rccs8eZdZfddZfddZddZeeeZdS)z%TreeBuilder.__init__..Commentcs|}j||dSr ) coerceCommentCommentrrrnrorrrs z.TreeBuilder.__init__..Comment.__init__cs|}||j_dSr )rprr5rrr^rr_setDatas z.TreeBuilder.__init__..Comment._setDatacSs|jjSr )rr5rrrr_getDatasz.TreeBuilder.__init__..Comment._getDataN)rrrrrsrtr"rnrrorrrqs rq)r6ZgetETreeModuler r rKrGnamespaceHTMLElementsrZrcrq elementClass commentClassrrVr)rrurWrcrqrrerrszTreeBuilder.__init__cCs$tj||j|_g|_d|_dSr )rrVresetinsertCommentInitial insertCommentinitial_commentsrQrrrrrxs zTreeBuilder.resetcCst|Sr )rNrrrrrN szTreeBuilder.testSerializercCstr |jjS|jjSdSr )rWdocumentrrrrrr getDocument szTreeBuilder.getDocumentcCsFg}|jdj}|jr"||j|t||jrB||j|S)Nr) openElementsrr5r*extendlistr')rZfragmentrrrr getFragments   zTreeBuilder.getFragmentcCsh|d}|d}|d}|s0tdtd|_n4|j|}||krPtdt||||}||_dS)Nrrrz#lxml cannot represent empty doctypez%lxml cannot represent non-xml doctype)warningswarnrrQrGrb doctypeClass)rtokenrrrZ coercedNamerQrrr insertDoctypes   zTreeBuilder.insertDoctypecCs6|dks||jkst|jjdks&t|j|dSr )r|r3rr{r*rrnparentrrrry,sz TreeBuilder.insertCommentInitialcsB||jkr,|jjdjtkr,tdttt | ||dS)Nz@lxml cannot represent adjacent comments beyond the root elements) r|rrr$r4rrrsuperrVrzr __class__rrinsertCommentMain1s   zTreeBuilder.insertCommentMainc Csd}|jr|jjst|d|jj7}|jjdk s>|jjdk r|d|j|jjpRd7}|jjr|jj}|ddkr|ddkrt dt | dd}|ddkr|d |7}q|d |7}n|d 7}|d 7}|jj|d krt dt |d7}t |}|jD] }||d}||jq ||_||j_|d }|d|j}|dkrj|} n d||f} | |_|||} || _|jj| |j| |j|_dS)NrTz rzGlxml cannot represent doctype with a different name to the root elementz$rnrarY)rQrr3rrrGZ coercePubidfindrrrreplacer Z fromstringr{rwZ addpreviousr documentClassr|Z getroottreergetZdefaultNamespacer$rvrr*r~rrz) rrZdocStrZsysidroot comment_tokenZcommentrraZ etree_tagZ root_elementrrr insertRoot7sP              zTreeBuilder.insertRoot)F)N)N)rrrrrr rrvrwZ fragmentClassr implementationrrxrNr}rrryrr __classcell__rrrrrVs L  rV)__doc__Z __future__rrrrrer1rTrr rr r6r Z lxml.etreerWcompiler7rqr$r4objectr rrNrUrVrrrrs$         O)