ž 7’ReÏ6c@s-dZddlmZmZmZddlZddlZddlZddlm Z ddl m Z ddlm Z dd lm Z dd lmZddlj Z dZejd ƒZe jd ƒjZGd d„deƒZGdd„deƒZdd„Zdd„ZGdd„de jƒZdS(uÃModule 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 i(uabsolute_importudivisionuunicode_literalsNi(u_basei(uDataLossWarning(u constants(uetree(uihatexmlu {([^}]*)}(.*)uasdcBs |EeZdZdd„ZdS(u DocumentTypecCs||_||_||_dS(N(unameupublicIdusystemId(uselfunameupublicIdusystemId((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__"s  uDocumentType.__init__N(u__name__u __module__u __qualname__u__init__(u __locals__((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu DocumentType!su DocumentTypecBsD|EeZdZdd„Zdd„Zdd„ZeeƒZdS(uDocumentcCsd|_g|_dS(N(uNoneu _elementTreeu _childNodes(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__)s uDocument.__init__cCs|jjƒj|jƒdS(N(u _elementTreeugetrootuaddnextu_element(uselfuelement((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu appendChild-suDocument.appendChildcCs|jS(N(u _childNodes(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_getChildNodes0suDocument._getChildNodesN(u__name__u __module__u __qualname__u__init__u appendChildu_getChildNodesupropertyu childNodes(u __locals__((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuDocument(s   uDocumentcssg‰d}tjƒ‰d‡‡‡fdd†‰ˆ|dƒ|dk rfˆjdd|fƒndjˆƒS( Nic sLt|dƒs¢t|dƒr ˆjdƒ|jjr©|jjpL|jjsbd|jj}n%d|jj|jj|jjf}ˆjdd|d|fƒn|jƒ}x"|jƒdk rÙ|jƒ}q¸WxÂ|dk r ˆ||dƒ|j ƒ}qÝWqHt |t ƒs+t |t ƒrpt |t ƒsRtjjdksRt‚ˆjd d||fƒqHˆjd ƒxÈ|D]}ˆ||dƒq„Wn¦|jtkr ˆjd d||jfƒt|d ƒrH|jrHˆjd d||jfƒqHn=t |tjƒs#t‚tjj|jƒ}|dk r™|jd ƒ}|jdƒ}tj|}ˆjdd||ˆj|ƒfƒn'ˆjdd|ˆj|jƒfƒt|dƒrµg}x›|jj ƒD]Š\} } tj| ƒ}|dk rM|j!ƒ\}} ˆj| ƒ} tj|}d|| f} nˆj| ƒ} |j| | fƒqåWx?t"|ƒD].\} } ˆjdd|d| | fƒq€Wn|jrãˆjd d|d|jfƒn|d7}x|D]} ˆ| |ƒqôWt|d ƒrH|jrHˆjd d|d|jfƒndS(Nutagugetrootu #documentu uu|%s%su iu|%s"%s"u#document-fragmentu|%sutailiu |%s<%s %s>u|%s<%s>uattribu%s %su |%s%s="%s"(#uhasattruappendudocinfou internalDTDu public_idu system_urlu root_nameugetrootu getpreviousuNoneugetnextu isinstanceustrubytesusysu version_infoumajoruAssertionErrorutagu comment_typeutextutailuetreeu_Elementuetree_buildersu tag_regexpumatchugroupu constantsuprefixesu fromXmlNameuattribuitemsugroupsusorted( uelementuindentudtd_stru next_elementunsmatchunsutaguprefixu attributesunameuvalueu attr_stringuchild(u infosetFilterurvuserializeElement(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuserializeElement;st      " '  $    ) %  u(testSerializer..serializeElementu|%s"%s"u iu u (uNoneuihatexmlu InfosetFilteruappendujoin(uelementu finalText((u infosetFilterurvuserializeElementuE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyutestSerializer6s F  utestSerializercs^g‰d}‡‡fdd†‰ˆ|ƒ|dk rQˆjdd|fƒndjˆƒS( u4Serialize an element and its child nodes to a stringcsqt|dƒsi|jjrV|jjr6|jj}nd|jj}ˆj|ƒnˆ|jƒƒnÙ|jtkr’ˆjd|j fƒn°|j sµˆjd|jfƒn?dj dd„|j j ƒDƒƒ}ˆjd|j|fƒ|j rˆj|j ƒnx|D]}ˆ|ƒqWˆjd |jfƒt|d ƒrm|j rmˆj|j ƒndS( Nutagu u u<%s>u cSs&g|]\}}d||f‘qS(u%s="%s"((u.0unameuvalue((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu  s u6tostring..serializeElement..u<%s %s>uutail(uhasattrudocinfou internalDTDudoctypeu root_nameuappendugetrootutagu comment_typeutextuattribujoinuitemsutail(uelementudtd_struattruchild(urvuserializeElement(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuserializeElementŽs*     u"tostring..serializeElementu%s"u iuNu (uNoneuappendujoin(uelementu finalText((urvuserializeElementuE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyutostring‰s  utostringcs³|EeZdZeZeZdZdZ eZ e Z ddd„Zdd„Zdd„Zdd„Zd d „Zd d „Zdd d„Zd‡fdd†Zdd„Z‡S(u TreeBuildercsÀtjtd|ƒ‰tjƒ‰|_||_G‡fdd†dtƒ‰G‡‡‡fdd†dˆjƒ}G‡‡fdd†dˆj ƒ}||_ ˆj |_ t j j||ƒdS(NufullTreecs;|EeZdZi‡fdd†Z‡fdd†ZdS(u(TreeBuilder.__init__..Attributescs||_tj||ƒxo|jƒD]a\}}t|tƒred|dˆj|dƒf}nˆj|ƒ}||jjj|.Attributes.__init__csltj|||ƒt|tƒrFd|dˆj|dƒf}nˆj|ƒ}||jjj|.Attributes.__setitem__N(u__name__u __module__u __qualname__u__init__u __setitem__(u __locals__(u infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu AttributesÃs u Attributescs¶|EeZdZ‡‡‡fdd†Z‡fdd†Z‡fdd†ZeeeƒZdd„Z‡fd d †Z eee ƒZ d‡‡fd d †Z ‡fd d†Z dS(u%TreeBuilder.__init__..Elementcs;ˆj|ƒ}ˆjj||d|ƒˆ|ƒ|_dS(Nu namespace(u coerceElementuElementu__init__u _attributes(uselfunameu namespace(u Attributesubuilderu infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__×su.TreeBuilder.__init__..Element.__init__cs4ˆj|ƒ|_|j|j|jƒ|j_dS(N(u coerceElementu_nameu _getETreeTagu _namespaceu_elementutag(uselfuname(u infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_setNameÜsu.TreeBuilder.__init__..Element._setNamecsˆj|jƒS(N(u fromXmlNameu_name(uself(u infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_getNameásu.TreeBuilder.__init__..Element._getNamecSs|jS(N(u _attributes(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_getAttributesæsu4TreeBuilder.__init__..Element._getAttributescsˆ||ƒ|_dS(N(u _attributes(uselfu attributes(u Attributes(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_setAttributesésu4TreeBuilder.__init__..Element._setAttributescs)ˆj|ƒ}ˆjj|||ƒdS(N(ucoerceCharactersuElementu insertText(uselfudatau insertBefore(ubuilderu infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu insertTextîsu0TreeBuilder.__init__..Element.insertTextcsˆjj||ƒdS(N(uElementu appendChild(uselfuchild(ubuilder(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu appendChildòsu1TreeBuilder.__init__..Element.appendChildN(u__name__u __module__u __qualname__u__init__u_setNameu_getNameupropertyunameu_getAttributesu_setAttributesu attributesuNoneu insertTextu appendChild(u __locals__(u Attributesubuilderu infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuElementÖs uElementcsV|EeZdZ‡‡fdd†Z‡fdd†Zdd„ZeeeƒZdS(u%TreeBuilder.__init__..Commentcs&ˆj|ƒ}ˆjj||ƒdS(N(u coerceCommentuCommentu__init__(uselfudata(ubuilderu infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__ösu.TreeBuilder.__init__..Comment.__init__csˆj|ƒ}||j_dS(N(u coerceCommentu_elementutext(uselfudata(u infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_setDataúsu.TreeBuilder.__init__..Comment._setDatacSs |jjS(N(u_elementutext(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_getDataþsu.TreeBuilder.__init__..Comment._getDataN(u__name__u __module__u __qualname__u__init__u_setDatau_getDataupropertyudata(u __locals__(ubuilderu infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuCommentõs uComment(uetree_buildersugetETreeModuleuetreeuihatexmlu InfosetFilteru infosetFilterunamespaceHTMLElementsudictuElementuCommentu elementClassu commentClassu_baseu TreeBuilderu__init__(uselfunamespaceHTMLElementsufullTreeuElementuComment((u Attributesubuilderu infosetFilteruE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__¾s %"  uTreeBuilder.__init__cCs2tjj|ƒ|j|_g|_d|_dS(N(u_baseu TreeBuilderuresetuinsertCommentInitialu insertCommentuinitial_commentsuNoneudoctype(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuresets  uTreeBuilder.resetcCs t|ƒS(N(utestSerializer(uselfuelement((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyutestSerializersuTreeBuilder.testSerializercCs$tr|jjS|jjjƒSdS(N(ufullTreeudocumentu _elementTreeugetroot(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu getDocuments uTreeBuilder.getDocumentcCseg}|jdj}|jr2|j|jƒn|jt|ƒƒ|jra|j|jƒn|S(Ni(u openElementsu_elementutextuappenduextendulistutail(uselfufragmentuelement((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu getFragments  uTreeBuilder.getFragmentcCs“|d}|d}|d}|s@tjdtƒd|_nO|jj|ƒ}||krqtjdtƒn|j|||ƒ}||_dS(NunameupublicIdusystemIdu#lxml cannot represent empty doctypeu%lxml cannot represent non-xml doctype(uwarningsuwarnuDataLossWarninguNoneudoctypeu infosetFilteru coerceElementu doctypeClass(uselfutokenunameupublicIdusystemIdu coercedNameudoctype((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu insertDoctype!s     uTreeBuilder.insertDoctypecCs|jj|ƒdS(N(uinitial_commentsuappend(uselfudatauparent((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuinsertCommentInitial1su TreeBuilder.insertCommentInitialcs^||jkrA|jjjƒdjtkrAtjdtƒntt |ƒj ||ƒdS(Niu@lxml cannot represent adjacent comments beyond the root elementsiÿÿÿÿ( udocumentu _elementTreeugetrootutagu comment_typeuwarningsuwarnuDataLossWarningusuperu TreeBuilderu insertComment(uselfudatauparent(u __class__(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuinsertCommentMain4suTreeBuilder.insertCommentMainc Cscd}|jr`|jjs!t‚|d|jj7}|jjdk sY|jjdk r*|d|jj|jjpwdƒ7}|jjr|jj}|jdƒdkræ|jdƒdkræt j dt ƒ|j ddƒ}n|jdƒdkr |d |7}q'|d |7}q*|d 7}n|d 7}|jj|d kr`t j dt ƒq`n|d7}t j|ƒ}x+|jD] }|jt j|dƒƒqƒW|jƒ|_|jƒ|j_|d }|jd|jƒ}|dkrü|}nd||f}||_|j||ƒ} || _|jjj| ƒ|jj| ƒ|j|_dS(uCreate the document rootuu unameuGlxml cannot represent doctype with a different name to the root elementu$udatau namespaceu{%s}%sN( udoctypeunameuAssertionErrorupublicIduNoneusystemIdu infosetFilteru coercePubidufinduwarningsuwarnuDataLossWarningureplaceuetreeu fromstringuinitial_commentsu addpreviousuCommentu documentClassudocumentu getroottreeu _elementTreeugetudefaultNamespaceutagu elementClassu_elementu _childNodesuappendu openElementsuinsertCommentMainu insertComment( uselfutokenudocStrusysidurootu comment_tokenunameu namespaceu etree_tagu root_element((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu insertRoot:sJ    *        uTreeBuilder.insertRootNF(u__name__u __module__u __qualname__uDocumentu documentClassu DocumentTypeu doctypeClassuNoneu elementClassu commentClassu fragmentClassuetreeuimplementationuFalseu__init__uresetutestSerializeru getDocumentu getFragmentu insertDoctypeuinsertCommentInitialuinsertCommentMainu insertRoot(u __locals__((u __class__uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu TreeBuilder¶sJ    u TreeBuilderT(u__doc__u __future__uabsolute_importudivisionuunicode_literalsuwarningsureusysuu_baseu constantsuDataLossWarninguetreeuetree_buildersuihatexmlu lxml.etreeuTrueufullTreeucompileu tag_regexpuCommentutagu comment_typeuobjectu DocumentTypeuDocumentutestSerializerutostringu TreeBuilder(((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu s$    S -