3 υ_Q7@sdZddlmZmZmZddlZddlZddlZddlm Z ddl m Z ddlm Z dd lm Z dd lmZddlj Z d Zejd Ze jd 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||_||_||_dS)N)namepublicIdsystemId)selfr rrr /usr/lib/python3.6/etree_lxml.py__init__#szDocumentType.__init__N)__name__ __module__ __qualname__rrrrrr "sr c@s,eZdZddZddZddZeeZdS)DocumentcCsd|_g|_dS)N) _elementTree _childNodes)rrrrr*szDocument.__init__cCs|jjj|jdS)N)rgetrootZaddnext_element)relementrrr appendChild.szDocument.appendChildcCs|jS)N)r)rrrr_getChildNodes1szDocument._getChildNodesN)rrrrrrpropertyZ childNodesrrrrr)srcs6gtjdddfdd |ddjS)NT)preventDoubleDashCommentsrc st|dst|drˆjd|jjrz|jjp6|jjsFd|jj}nd|jj|jj|jjf}jdd|d|f|j}x|jdk r|j}qWxx|dk r||d|j }qWnTt |t st |t rjd d||fn(jd x|D]}||dqWn|j tkrnjd d||jft|d r|jrjd d||jfntjj|j }|dk r|jd }|jd}tj|}jdd||j|fnjdd|j|j ft|drg}xr|jjD]d\} } tj| }|dk rH|j\}} j| } tj|}d|| f} n j| } |j| | fqWx2t|D]&\} } jdd|d| | fqpW|jrjd d|d|jf|d7}x|D]} | |qWt|d r|jrjd d|d|jfdS)Ntagrz #documentz 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 attributesr valueZ attr_stringchild) infosetFilterrvserializeElementrrrA;sp                     " z(testSerializer..serializeElement )r)r InfosetFilterjoin)rr)r?r@rArtestSerializer7s  F rEcs$gfdd|djS)z4Serialize an element and its child nodes to a stringcs t|dsH|jjr:|jjr$|jj}n d|jj}j||jn|jtkrfjd|j fn|j sjd|jfn.dj dd|j j D}jd|j|f|j rj|j x|D] }|qWjd |jft|d o|j rj|j dS) Nr!z z z<%s>r"cSsg|]\}}d||fqS)z%s="%s"r).0r r=rrr sz6tostring..serializeElement..z<%s %s>zr#)r%r'r(doctyper)r&rr!r-r.r$rDr5r#)rr9attrr>)r@rArrrAs*         z"tostring..serializeElement)rD)rr)r@rArtostrings rKcszeZdZeZeZdZdZeZ e Z dddZ ddZ ddZd d Zd d Zd dZdddZdfdd ZddZZS) TreeBuilderNFcstjt|dtjdd|_||_GfdddtGfdddj}Gfdd d j }||_ ||_ t j j||dS) N)fullTreeT)r cs&eZdZdfdd ZfddZdS)z(TreeBuilder.__init__..AttributesNcsv|dkr i}||_tj||xR|jD]F\}}t|trVd|dj|df}n j|}||jjj|<q(WdS)Nz{%s}%srr)rdictrr5r*tuplecoerceAttributer$)rrr=keyr )r?rrrs   z1TreeBuilder.__init__..Attributes.__init__csPtj|||t|tr4d|dj|df}n j|}||jjj|<dS)Nz{%s}%srr)rN __setitem__r*rOrPrr$)rrQr=r )r?rrrRs   z4TreeBuilder.__init__..Attributes.__setitem__)N)rrrrrRr)r?rr Attributess rScsxeZdZfddZfddZfddZeeeZddZfd d Z eee Z dfd d Z fddZ d S)z%TreeBuilder.__init__..Elementcs*j|}jj|||d||_dS)N) namespace) coerceElementElementr _attributes)rr rT)rSbuilderr?rrrs z.TreeBuilder.__init__..Element.__init__cs$j||_|j|j|j|j_dS)N)rU_nameZ _getETreeTagZ _namespacerr!)rr )r?rr_setNames z.TreeBuilder.__init__..Element._setNamecs j|jS)N)r4rY)r)r?rr_getNamesz.TreeBuilder.__init__..Element._getNamecSs|jS)N)rW)rrrr_getAttributessz4TreeBuilder.__init__..Element._getAttributescs|||_dS)N)rW)rr<)rSrr_setAttributessz4TreeBuilder.__init__..Element._setAttributesNcsj|}jj|||dS)N)ZcoerceCharactersrV insertText)rdataZ insertBefore)rXr?rrr^s z0TreeBuilder.__init__..Element.insertTextcsjj||dS)N)rVr)rr>)rXrrrsz1TreeBuilder.__init__..Element.appendChild)N) rrrrrZr[rr r\r]r<r^rr)rSrXr?rrrVs     rVcs8eZdZfddZfddZddZeeeZdS)z%TreeBuilder.__init__..Commentcsj|}jj||dS)N) coerceCommentCommentr)rr_)rXr?rrrs z.TreeBuilder.__init__..Comment.__init__csj|}||j_dS)N)r`rr.)rr_)r?rr_setDatas z.TreeBuilder.__init__..Comment._setDatacSs|jjS)N)rr.)rrrr_getDatasz.TreeBuilder.__init__..Comment._getDataN)rrrrrbrcrr_r)rXr?rrras ra)r/ZgetETreeModuler r rCr?namespaceHTMLElementsrNrVra elementClass commentClassrrLr)rrdrMrVrar)rSrXr?rrszTreeBuilder.__init__cCs$tjj||j|_g|_d|_dS)N)rrLresetinsertCommentInitial insertCommentinitial_commentsrH)rrrrrgs zTreeBuilder.resetcCst|S)N)rE)rrrrrrE szTreeBuilder.testSerializercCstr |jjS|jjjSdS)N)rMdocumentrr)rrrr getDocument szTreeBuilder.getDocumentcCsFg}|jdj}|jr"|j|j|jt||jrB|j|j|S)Nr) openElementsrr.r&extendlistr#)rZfragmentrrrr getFragments   zTreeBuilder.getFragmentcCsh|d}|d}|d}|s0tjdtd|_n4|jj|}||krPtjdt|j|||}||_dS)Nr rrz#lxml cannot represent empty doctypez%lxml cannot represent non-xml doctype)warningswarnrrHr?rU doctypeClass)rtokenr rrZ coercedNamerHrrr insertDoctypes   zTreeBuilder.insertDoctypecCs|jj|dS)N)rjr&)rr_parentrrrrh,sz TreeBuilder.insertCommentInitialcsB||jkr,|jjjdjtkr,tjdttt |j ||dS)Nrz@lxml cannot represent adjacent comments beyond the root elements) rkrrr!r-rqrrrsuperrLri)rr_rv) __class__rrinsertCommentMain1s  zTreeBuilder.insertCommentMainc Csd}|jr|d|jj7}|jjdk s2|jjdk r|d|jj|jjpFd7}|jjr|jj}|jddkr|jddkrtjdt |j dd }|jddkr|d |7}q|d |7}n|d 7}|d 7}|jj|dkrtjdt |d7}t j |}x*|j D] }|j|d}|j|jqW|j|_|j|j_|d}|jd|j}|dkrb|} n d||f} | |_|j||} || _|jjj| |jj| |j|_dS)zCreate the document rootrJz r zGlxml cannot represent doctype with a different name to the root elementz$r_rTz{%s}%s)rHr rrr?Z coercePubidfindrqrrrreplacer Z fromstringrjrfZ addpreviousr documentClassrkZ getroottreergetZdefaultNamespacer!rerr&rmrzri) rrtZdocStrZsysidroot comment_tokenZcommentr rTZ etree_tagZ root_elementrrr insertRoot7sJ             zTreeBuilder.insertRoot)F)N)N)rrrrrr rsrerfZ fragmentClassr implementationrrgrErlrprurhrzr __classcell__rr)ryrrLs L  rL)__doc__Z __future__rrrrqresysrJrr rr r/r Z lxml.etreerMcompiler0rar!r-objectr rrErKrLrrrr s$        O)