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 st|ds t|drd|jjrz|jjsF|jjsFd|jj}nd|jj|jj|jjf}dd|d|f|}|dk r|}q|dk r||d| }qnNt |t st |t rd d||fn"d |D]}||dqn|j tkr`d d||jft|d r|jrd d||jfntj|j }|dk r|d }|d}tj|}dd|||fndd||j ft|drg}|jD]d\} } t| }|dk r8|\}} | } tj|}d|| f} n | } || | fqt|D]&\} } dd|d| | fq\|jrd d|d|jf|d7}|D]} | |qt|d r|jrd d|d|jfdS)Ntagrz #document zz|%s%s rz|%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 isinstancestrbytesr$ comment_typetextr'etree_builders tag_regexpmatchgroupr prefixes fromXmlNamer(itemsgroupssorted) rindentdtd_strZ next_elementZnsmatchnsr$prefix attributesrvalueZ attr_stringchild infosetFilterrvserializeElementrrrF;sx                       z(testSerializer..serializeElement )r)r InfosetFilterjoinrrrCrtestSerializer7s  F rKcs$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).0rrArrr sz6tostring..serializeElement..z<%s %s>zr')r)r+r,doctyper-r*rr$r1r2r(rIr9r')rr=attrrBrErFrrrFs,        z"tostring..serializeElement)rIrJrrPrtostrings rRcszeZdZeZeZdZdZeZ 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)rdictrr9r.tuplecoerceAttributer()rrrAkeyrrDrrrs   z1TreeBuilder.__init__..Attributes.__init__csPt|||t|tr4d|d|df}n |}||jjj|<dSrU)rW __setitem__r.rXrYrr()rrZrArr[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)rrr^r]builderrDrrrs z.TreeBuilder.__init__..Element.__init__cs$||_||j|j|j_dSr )r__nameZ _getETreeTagZ _namespacerr$)rrr[rr_setNames  z.TreeBuilder.__init__..Element._setNamecs |jSr )r8rdrr[rr_getNamesz.TreeBuilder.__init__..Element._getNamecSs|jSr rarrrr_getAttributessz4TreeBuilder.__init__..Element._getAttributescs|||_dSr rg)rr@)r]rr_setAttributessz4TreeBuilder.__init__..Element._setAttributesNcs|}j|||dSr )ZcoerceCharactersr` insertText)rdataZ insertBeforercrDrrrjs z0TreeBuilder.__init__..Element.insertTextcsj||dSr )r`r )rrB)rcrrr sz1TreeBuilder.__init__..Element.appendChild)N) rrrrrerfr"rrhrir@rjr rrbrrr`s     r`cs8eZdZfddZfddZddZeeeZdS)z%TreeBuilder.__init__..Commentcs|}j||dSr ) coerceCommentCommentrrrkrlrrrs z.TreeBuilder.__init__..Comment.__init__cs|}||j_dSr )rmrr2ror[rr_setDatas z.TreeBuilder.__init__..Comment._setDatacSs|jjSr )rr2rrrr_getDatasz.TreeBuilder.__init__..Comment._getDataN)rrrrrprqr"rkrrlrrrns rn)r3ZgetETreeModuler r rHrDnamespaceHTMLElementsrWr`rn elementClass commentClassrrSr)rrrrTr`rnrrbrrszTreeBuilder.__init__cCs$tj||j|_g|_d|_dSr )rrSresetinsertCommentInitial insertCommentinitial_commentsrNrrrrrus zTreeBuilder.resetcCst|Sr )rKrrrrrK szTreeBuilder.testSerializercCstr |jjS|jjSdSr )rTdocumentrrrrrr getDocument szTreeBuilder.getDocumentcCsFg}|jdj}|jr"||j|t||jrB||j|S)Nr) openElementsrr2r*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)warningswarnrrNrDr_ doctypeClass)rtokenrrrZ coercedNamerNrrr insertDoctypes   zTreeBuilder.insertDoctypecCs|j|dSr )rxr*rrkparentrrrrv,sz TreeBuilder.insertCommentInitialcsB||jkr,|jjdjtkr,tdttt | ||dS)Nz@lxml cannot represent adjacent comments beyond the root elements) ryrrr$r1rrrsuperrSrwr __class__rrinsertCommentMain1s   zTreeBuilder.insertCommentMainc Csd}|jr|d|jj7}|jjdk s2|jjdk r|d|j|jjpFd7}|jjr|jj}|ddkr|ddkrtdt | dd}|ddkr|d |7}q|d |7}n|d 7}|d 7}|jj|d krtdt |d7}t |}|j D] }||d}||jq||_||j_|d }|d|j}|dkr^|} n d||f} | |_|||} || _|jj| |j| |j|_dS)NrQz rzGlxml cannot represent doctype with a different name to the root elementz$rkr^rV)rNrrrrDZ coercePubidfindrrrreplacer Z fromstringrxrtZ addpreviousr documentClassryZ getroottreergetZdefaultNamespacer$rsrr*r{rrw) rrZdocStrZsysidroot comment_tokenZcommentrr^Z etree_tagZ root_elementrrr insertRoot7sN             zTreeBuilder.insertRoot)F)N)N)rrrrrr rrsrtZ fragmentClassr implementationrrurKrzr~rrvrr __classcell__rrrrrSs L  rS)__doc__Z __future__rrrrresysrQrr rr r3r Z lxml.etreerTcompiler4rnr$r1objectr rrKrRrSrrrrs$         O)