7Re5c@shddlmZmZmZddlmZddlmZmZm Z dZ ie edfd6e eee ddfgBdfd6e eee ddfe ddfgBdfd 6e e ddfe dd fgdfd 6e e dd fe dd fgdfd 6ZGdddeZGdddeZGdddeZdS(i(uabsolute_importudivisionuunicode_literals(u text_typei(uscopingElementsutableInsertModeElementsu namespacesuhtmlubuttonuoluululistutableuoptgroupuoptionuselectcBs|EeZdZddZddZddZddZdd d Zd d Z d dZ ddZ ddZ ddZ dS(uNodecCs:||_d|_d|_i|_g|_g|_dS(u6Node representing an item in the tree. name - The tag name associated with the node parent - The parent of the current node (or None for the document node) value - The value of the current node (applies to text nodes and comments attributes - a dict holding name, value pairs for attributes of the node childNodes - a list of child nodes of the current node. This must include all elements but not necessarily other node types _flags - A list of miscellaneous flags that can be set on the node N(unameuNoneuparentuvalueu attributesu childNodesu_flags(uselfuname((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu__init__s     u Node.__init__cCsKdjdd|jjD}|r<d|j|fSd|jSdS(Nu cSs&g|]\}}d||fqS(u%s="%s"((u.0unameuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu +s u Node.__str__..u<%s %s>u<%s>(ujoinu attributesuitemsuname(uselfu attributesStr((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu__str__*s u Node.__str__cCs d|jS(Nu<%s>(uname(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu__repr__3su Node.__repr__cCs tdS(u3Insert node as a child of the current node N(uNotImplementedError(uselfunode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu appendChild6suNode.appendChildcCs tdS(uInsert data as text in the current node, positioned before the start of node insertBefore or to the end of the node's text. N(uNotImplementedError(uselfudatau insertBefore((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu insertText;suNode.insertTextcCs tdS(uInsert 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 nodeN(uNotImplementedError(uselfunodeurefNode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu insertBeforeAsuNode.insertBeforecCs tdS(u:Remove node from the children of the current node N(uNotImplementedError(uselfunode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu removeChildGsuNode.removeChildcCs.x|jD]}|j|q Wg|_dS(uMove 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 N(u childNodesu appendChild(uselfu newParentuchild((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyureparentChildrenLsuNode.reparentChildrencCs tdS(uReturn a shallow copy of the current node i.e. a node with the same name and attributes but with no parent or child nodes N(uNotImplementedError(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu cloneNodeVsuNode.cloneNodecCs tdS(uFReturn true if the node has children or text, false otherwise N(uNotImplementedError(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu hasContent\suNode.hasContentN(u__name__u __module__u __qualname__u__init__u__str__u__repr__u appendChilduNoneu insertTextu insertBeforeu removeChildureparentChildrenu cloneNodeu hasContent(u __locals__((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuNodes      uNodecBs,|EeZdZddZddZdS(uActiveFormattingElementscCsd}|tkrxj|dddD]R}|tkr<Pn|j||r[|d7}n|dkr&|j|Pq&q&Wntj||dS(Niiii(uMarkeru nodesEqualuremoveulistuappend(uselfunodeu equalCountuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuappendcs      uActiveFormattingElements.appendcCs0|j|jksdS|j|jks,dSdS(NFT(u nameTupleuFalseu attributesuTrue(uselfunode1unode2((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu nodesEqualps u#ActiveFormattingElements.nodesEqualN(u__name__u __module__u __qualname__uappendu nodesEqual(u __locals__((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuActiveFormattingElementsbs uActiveFormattingElementscBsC|EeZdZdZd*Zd*Zd*Zd*Zd*Z ddZ ddZ d*ddZ dd Z d d Zd d ZddZddZd*ddZddZddZddZeeeZddZddZd*ddZd d!Zd*d"d#Zd$d%Zd&d'Zd(d)Zd*S(+u TreeBuilderuBase 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 cCs)|rd|_n d|_|jdS(Nuhttp://www.w3.org/1999/xhtml(udefaultNamespaceuNoneureset(uselfunamespaceHTMLElements((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu__init__s  uTreeBuilder.__init__cCsCg|_t|_d|_d|_d|_|j|_ dS(NF( u openElementsuActiveFormattingElementsuactiveFormattingElementsuNoneu headPointeru formPointeruFalseuinsertFromTableu documentClassudocument(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuresets      uTreeBuilder.resetcCst|d}t|\}}xZt|jD]I}|j|krK| s]||kra|radS||j|kAr/dSq/WdstdS(Nu nameTupleTF( uhasattrulistElementsMapureversedu openElementsunameuTrueu nameTupleuFalseuAssertionError(uselfutargetuvariantu exactNodeu listElementsuinvertunode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuelementInScopesuTreeBuilder.elementInScopecCs |js dSt|jd}|j|}|tksH||jkrLdSxL|tkr||jkr|dkrd}Pn|d8}|j|}qOWx~|d7}|j|}|j}|jidd6|jd6|jd6|jd6}||j|<||jd krPqqdS( NiiuStartTagutypeunameu namespaceudataii( uactiveFormattingElementsulenuMarkeru openElementsu cloneNodeu insertElementunameu namespaceu attributes(uselfuiuentryucloneuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu#reconstructActiveFormattingElementss.          u/TreeBuilder.reconstructActiveFormattingElementscCs>|jj}x(|jr9|tkr9|jj}qWdS(N(uactiveFormattingElementsupopuMarker(uselfuentry((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuclearActiveFormattingElementssu)TreeBuilder.clearActiveFormattingElementscCsHxA|jdddD])}|tkr-Pq|j|kr|SqWdS(uCheck if an element exists between the end of the active formatting elements and the last marker. If it does, return it, else return falseNiiF(uactiveFormattingElementsuMarkerunameuFalse(uselfunameuitem((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu!elementInActiveFormattingElementss  u-TreeBuilder.elementInActiveFormattingElementscCs3|j|}|jj||jj|dS(N(u createElementu openElementsuappendudocumentu appendChild(uselfutokenuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu insertRootsuTreeBuilder.insertRootcCsG|d}|d}|d}|j|||}|jj|dS(NunameupublicIdusystemId(u doctypeClassudocumentu appendChild(uselfutokenunameupublicIdusystemIdudoctype((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu insertDoctypes    uTreeBuilder.insertDoctypecCs:|dkr|jd}n|j|j|ddS(Niudatai(uNoneu openElementsu appendChildu commentClass(uselfutokenuparent((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu insertComments uTreeBuilder.insertCommentcCsB|d}|jd|j}|j||}|d|_|S(u.Create an element but don't insert it anywhereunameu namespaceudata(ugetudefaultNamespaceu elementClassu attributes(uselfutokenunameu namespaceuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu createElements   uTreeBuilder.createElementcCs|jS(N(u_insertFromTable(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu_getInsertFromTablesuTreeBuilder._getInsertFromTablecCs.||_|r|j|_n |j|_dS(usSwitch the function used to insert an element from the normal one to the misnested table one and back againN(u_insertFromTableuinsertElementTableu insertElementuinsertElementNormal(uselfuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu_setInsertFromTables uTreeBuilder._setInsertFromTablecCs|d}t|ts)td||jd|j}|j||}|d|_|jdj||jj ||S(NunameuElement %s not unicodeu namespaceudataii( u isinstanceu text_typeuAssertionErrorugetudefaultNamespaceu elementClassu attributesu openElementsu appendChilduappend(uselfutokenunameu namespaceuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuinsertElementNormals  uTreeBuilder.insertElementNormalcCs|j|}|jdjtkr2|j|S|j\}}|dkr`|j|n|j|||jj ||S(u-Create an element and insert it into the treeiiN( u createElementu openElementsunameutableInsertModeElementsuinsertElementNormalugetTableMisnestedNodePositionuNoneu appendChildu insertBeforeuappend(uselfutokenuelementuparentu insertBefore((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuinsertElementTable(s  uTreeBuilder.insertElementTablecCs{|dkr|jd}n|j sE|jrU|jdjtkrU|j|n"|j\}}|j||dS(uInsert text data.iNii(uNoneu openElementsuinsertFromTableunameutableInsertModeElementsu insertTextugetTableMisnestedNodePosition(uselfudatauparentu insertBefore((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu insertText8s   uTreeBuilder.insertTextcCsd}d}d}x7|jdddD]}|jdkr)|}Pq)q)W|r|jrm|j}|}q|j|jj|d}n |jd}||fS(usGet the foster parent element, and sibling to insert before (or None) when inserting a misnested table nodeNiutableii(uNoneu openElementsunameuparentuindex(uselfu lastTableu fosterParentu insertBeforeuelm((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyugetTableMisnestedNodePositionGs    u)TreeBuilder.getTableMisnestedNodePositionc CsO|jd j}|td krK||krK|jj|j|ndS( Niuddudtuliuoptionuoptgroupupurpurti(uddudtuliuoptionuoptgroupupurpurt(u openElementsunameu frozensetupopugenerateImpliedEndTags(uselfuexcludeuname((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyugenerateImpliedEndTagsas   u"TreeBuilder.generateImpliedEndTagscCs|jS(uReturn the final tree(udocument(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu getDocumentksuTreeBuilder.getDocumentcCs$|j}|jdj||S(uReturn the final fragmenti(u fragmentClassu openElementsureparentChildren(uselfufragment((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu getFragmentos uTreeBuilder.getFragmentcCs tdS(uzSerialize the subtree of node in the format required by unit tests node - the node from which to start serializingN(uNotImplementedError(uselfunode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyutestSerializervsuTreeBuilder.testSerializerN( u__name__u __module__u __qualname__u__doc__uNoneu documentClassu elementClassu commentClassu doctypeClassu fragmentClassu__init__uresetuelementInScopeu#reconstructActiveFormattingElementsuclearActiveFormattingElementsu!elementInActiveFormattingElementsu insertRootu insertDoctypeu insertCommentu createElementu_getInsertFromTableu_setInsertFromTableupropertyuinsertFromTableuinsertElementNormaluinsertElementTableu insertTextugetTableMisnestedNodePositionugenerateImpliedEndTagsu getDocumentu getFragmentutestSerializer(u __locals__((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu TreeBuilderzs6   .           u TreeBuilderNFT(u __future__uabsolute_importudivisionuunicode_literalsupip._vendor.sixu text_typeu constantsuscopingElementsutableInsertModeElementsu namespacesuNoneuMarkeru frozensetuFalseusetuTrueulistElementsMapuobjectuNodeulistuActiveFormattingElementsu TreeBuilder(((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyus*! K