a [f8@sddlmZmZmZddlmZddlmZmZm Z dZ e edfe ee ddfhBdfe ee dd fe dd fhBdfe e ddfe dd fgdfe e dd fe dd fgdfdZ Gddde ZGdddeZGddde ZdS))absolute_importdivisionunicode_literals) text_type)scopingElementstableInsertModeElements namespacesNFhtmlbuttonZolZultableoptgroupoptionT)Nr listr Zselectc@sbeZdZdZddZddZddZdd Zdd d Zd dZ ddZ ddZ ddZ ddZ d S)NodezRepresents an item in the treecCs(||_d|_d|_i|_g|_g|_dS)zRCreates a Node :arg name: The tag name associated with the node N)nameparentvalue attributes childNodesZ_flags)selfrrJ/usr/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/base.py__init__s z Node.__init__cCs:ddd|jD}|r,d|j|fSd|jSdS)N cSsg|]\}}d||fqS)z%s="%s"r).0rrrrr .sz Node.__str__..z<%s %s><%s>)joinritemsr)rZ attributesStrrrr__str__-s  z Node.__str__cCs d|jS)Nr)rrrrr__repr__6sz Node.__repr__cCstdS)z[Insert node as a child of the current node :arg node: the node to insert NNotImplementedErrorrnoderrr appendChild9szNode.appendChildNcCstdS)aBInsert data as text in the current node, positioned before the start of node insertBefore or to the end of the node's text. :arg data: the data to insert :arg insertBefore: True if you want to insert the text before the node and False if you want to insert it after the node Nr#)rdata insertBeforerrr insertTextAs zNode.insertTextcCstdS)aInsert node as a child of the current node, before refNode in the list of child nodes. Raises ValueError if refNode is not a child of the current node :arg node: the node to insert :arg refNode: the child node to insert the node before Nr#)rr&ZrefNoderrrr)Ms zNode.insertBeforecCstdS)zhRemove node from the children of the current node :arg node: the child node to remove Nr#r%rrr removeChildYszNode.removeChildcCs |jD]}||qg|_dS)zMove all the children of the current node to newParent. This is needed so that trees that don't store text as nodes move the text in the correct way :arg newParent: the node to move all this node's children to N)rr')rZ newParentchildrrrreparentChildrenas  zNode.reparentChildrencCstdS)zReturn a shallow copy of the current node i.e. a node with the same name and attributes but with no parent or child nodes Nr#r!rrr cloneNodenszNode.cloneNodecCstdS)zFReturn true if the node has children or text, false otherwise Nr#r!rrr hasContenttszNode.hasContent)N)__name__ __module__ __qualname____doc__rr r"r'r*r)r+r-r.r/rrrrrs    rc@seZdZddZddZdS)ActiveFormattingElementscCsfd}|tkrV|dddD]:}|tkr*qV|||r>|d7}|dkr||qVqt||dS)Nr)Marker nodesEqualremoverappend)rr&Z equalCountelementrrrr;{s  zActiveFormattingElements.appendcCs$|j|jksdS|j|jks dSdS)NFT) nameTupler)rZnode1Znode2rrrr9s   z#ActiveFormattingElements.nodesEqualN)r0r1r2r;r9rrrrr4zs r4c@seZdZdZdZdZdZdZdZddZ ddZ d+ddZ d d Z d d Z d dZddZddZd,ddZddZddZddZeeeZddZddZd-dd Zd!d"Zd.d#d$Zd%d&Zd'd(Zd)d*ZdS)/ TreeBuilderaBase treebuilder implementation * documentClass - the class to use for the bottommost node of a document * elementClass - the class to use for HTML Elements * commentClass - the class to use for comments * doctypeClass - the class to use for doctypes NcCs|r d|_nd|_|dS)zmCreate a TreeBuilder :arg namespaceHTMLElements: whether or not to namespace HTML elements zhttp://www.w3.org/1999/xhtmlN)defaultNamespacereset)rZnamespaceHTMLElementsrrrrszTreeBuilder.__init__cCs.g|_t|_d|_d|_d|_||_dS)NF) openElementsr4activeFormattingElementsZ headPointerZ formPointerinsertFromTable documentClassdocumentr!rrrr@s zTreeBuilder.resetcCst|d}|s2t|tr$td|f}t|ts2Jt|\}}t|jD]>}|r^||kr^dS|sr|j|krrdS||j|vArHdSqHdsJdS)Nr=r TF) hasattr isinstancerr tuplelistElementsMapreversedrAr=)rtargetZvariantZ exactNodeZ listElementsinvertr&rrrelementInScopes     zTreeBuilder.elementInScopecCs|js dSt|jd}|j|}|tks4||jvr8dS|tkrl||jvrl|dkrXd}ql|d8}|j|}q8|d7}|j|}|}|d|j|j|jd}||j|<||jdkrlqqldS)Nr6rr5ZStartTag)typer namespacer() rBlenr8rAr. insertElementrrOr)rientryZcloner<rrr#reconstructActiveFormattingElementss.    z/TreeBuilder.reconstructActiveFormattingElementscCs(|j}|jr$|tkr$|j}q dSN)rBpopr8)rrSrrrclearActiveFormattingElementss z)TreeBuilder.clearActiveFormattingElementscCs:|jdddD]$}|tkr"q6q|j|kr|SqdS)zCheck if an element exists between the end of the active formatting elements and the last marker. If it does, return it, else return falseNr5F)rBr8r)rritemrrr!elementInActiveFormattingElements s   z-TreeBuilder.elementInActiveFormattingElementscCs&||}|j||j|dSrU) createElementrAr;rEr')rtokenr<rrr insertRoots  zTreeBuilder.insertRootcCs6|d}|d}|d}||||}|j|dS)NrpublicIdsystemId) doctypeClassrEr')rr[rr]r^Zdoctyperrr insertDoctype s zTreeBuilder.insertDoctypecCs*|dur|jd}|||ddS)Nr5r()rAr' commentClass)rr[rrrr insertComment(s zTreeBuilder.insertCommentcCs0|d}|d|j}|||}|d|_|S)z.Create an element but don't insert it anywhererrOr()getr? elementClassrrr[rrOr<rrrrZ-s   zTreeBuilder.createElementcCs|jSrU)_insertFromTabler!rrr_getInsertFromTable5szTreeBuilder._getInsertFromTablecCs ||_|r|j|_n|j|_dS)zsSwitch the function used to insert an element from the normal one to the misnested table one and back againN)rfinsertElementTablerQinsertElementNormal)rrrrr_setInsertFromTable8s zTreeBuilder._setInsertFromTablecCsb|d}t|tsJd||d|j}|||}|d|_|jd||j||S)NrzElement %s not unicoderOr(r5) rGrrcr?rdrrAr'r;rerrrriCs   zTreeBuilder.insertElementNormalcCs`||}|jdjtvr$||S|\}}|durD||n ||||j||S)z-Create an element and insert it into the treer5N) rZrArrrigetTableMisnestedNodePositionr'r)r;)rr[r<rr)rrrrhMs      zTreeBuilder.insertElementTablecCsV|dur|jd}|jr.|jr:|jdjtvr:||n|\}}|||dS)zInsert text data.Nr5)rArCrrr*rk)rr(rr)rrrr*]s     zTreeBuilder.insertTextcCstd}d}d}|jdddD]}|jdkr|}q4q|rb|jrJ|j}|}ql|j|j|d}n |jd}||fS)zsGet the foster parent element, and sibling to insert before (or None) when inserting a misnested table nodeNr5r r6r)rArrindex)rZ lastTableZ fosterParentr)Zelmrrrrkls   z)TreeBuilder.getTableMisnestedNodePositioncCs8|jdj}|tdvr4||kr4|j||dS)Nr5)ddZdtZlirr pZrpZrt)rAr frozensetrVgenerateImpliedEndTags)rZexcluderrrrrps    z"TreeBuilder.generateImpliedEndTagscCs|jS)zReturn the final tree)rEr!rrr getDocumentszTreeBuilder.getDocumentcCs|}|jd||S)zReturn the final fragmentr) fragmentClassrAr-)rfragmentrrr getFragmentszTreeBuilder.getFragmentcCstdS)zSerialize the subtree of node in the format required by unit tests :arg node: the node from which to start serializing Nr#r%rrrtestSerializerszTreeBuilder.testSerializer)N)N)N)N)r0r1r2r3rDrdrar_rrrr@rMrTrWrYr\r`rbrZrgrjpropertyrCrirhr*rkrprqrtrurrrrr>s6   .     r>)Z __future__rrrZpip._vendor.sixrZ constantsrrr r8rorIobjectrrr4r>rrrrs0        c