U .e8@sddlmZmZmZddlmZddlmZmZm Z dZ e edfe ee e ddfgBdfe ee e dd fe dd fgBdfe e ddfe dd fgdfe e dd fe dd fgdfdZ GdddeZGdddeZGdddeZdS))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.8/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 newParentZchildrrrreparentChildrenas  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)rZnode1Znode2rrrr8s   z#ActiveFormattingElements.nodesEqualN)r/r0r1r:r8rrrrr3zs r3c@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) openElementsr3activeFormattingElementsZ headPointerZ formPointerinsertFromTable documentClassdocumentr!rrrr?s zTreeBuilder.resetcCst|d}|s2t|tr$td|f}t|ts2tt|\}}t|jD]>}|r^||kr^dS|sr|j |krrdS||j |kArHdSqHdstdS)Nr<r TF) hasattr isinstancerr tupleAssertionErrorlistElementsMapreversedr@r<)rtargetZvariantZ exactNodeZ listElementsinvertr&rrrelementInScopes     zTreeBuilder.elementInScopecCs|js dSt|jd}|j|}|tks4||jkr8dS|tkrl||jkrl|dkrXd}ql|d8}|j|}q8|d7}|j|}|}|d|j|j|jd}||j|<||jdkrlqqldS)Nr5rr4ZStartTag)typer namespacer() rAlenr7r@r- insertElementrrOr)rientryZcloner;rrr#reconstructActiveFormattingElementss.    z/TreeBuilder.reconstructActiveFormattingElementscCs(|j}|jr$|tkr$|j}q dSN)rApopr7)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 falseNr4F)rAr7r)rritemrrr!elementInActiveFormattingElements s   z-TreeBuilder.elementInActiveFormattingElementscCs&||}|j||j|dSrU) createElementr@r:rDr')rtokenr;rrr insertRoots  zTreeBuilder.insertRootcCs6|d}|d}|d}||||}|j|dS)NrpublicIdsystemId) doctypeClassrDr')rr[rr]r^Zdoctyperrr insertDoctype s zTreeBuilder.insertDoctypecCs*|dkr|jd}|||ddS)Nr4r()r@r' 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|tstd||d|j}|||}|d|_|jd||j ||S)NrzElement %s not unicoderOr(r4) rFrrHrcr>rdrr@r'r:rerrrriCs   zTreeBuilder.insertElementNormalcCs`||}|jdjtkr$||S|\}}|dkrD||n ||||j||S)z-Create an element and insert it into the treer4N) rZr@rrrigetTableMisnestedNodePositionr'r)r:)rr[r;rr)rrrrhMs      zTreeBuilder.insertElementTablecCsV|dkr|jd}|jr.|jr:|jdjtkr:||n|\}}|||dS)zInsert text data.Nr4)r@rBrrr*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 nodeNr4r r5r)r@rrindex)rZ lastTableZ fosterParentr)Zelmrrrrkls   z)TreeBuilder.getTableMisnestedNodePositioncCs8|jdj}|tdkr4||kr4|j||dS)Nr4)ZddZdtZlirr pZrpZrt)r@r frozensetrVgenerateImpliedEndTags)rexcluderrrrros    z"TreeBuilder.generateImpliedEndTagscCs|jS)zReturn the final tree)rDr!rrr getDocumentszTreeBuilder.getDocumentcCs|}|jd||S)zReturn the final fragmentr) fragmentClassr@r,)rZfragmentrrr 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)r/r0r1r2rCrdrar_rrrr?rMrTrWrYr\r`rbrZrgrjpropertyrBrirhr*rkrorqrsrtrrrrr=s6   .     r=)Z __future__rrrZpip._vendor.sixrZ constantsrrr r7rnsetrIobjectrrr3r=rrrrs0        c