3 PfQ7@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 sDt|ds8t|drˆjd|jjrz|jjp6|jjsFd|jj}nd|jj|jj|jjf}jdd|d|f|j}x|jdk r|j}qWx|dk r||d|j }qWnrt |t st |t r t |t st jd dkstjd d||fn(jd x|D]}||dqWn|jtkrjd d||jft|d r@|jr@jd d||jfnt |tjsttjj|j}|dk r|jd}|jd}tj|}jdd||j|fnjdd|j|jft|drg}xr|jjD]d\} } tj| }|dk rx|j\}} j| } tj|}d|| f} n j| } |j| | fq.Wx2t |D]&\} } jdd|d| | fqW|jrjd d|d|jf|d7}x|D]} | |qWt|d r@|jr@jd d|d|jfdS)Ntagrz #documentz zz|%s%s rrz|%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 isinstancestrbytessys version_infoAssertionErrorr! comment_typetextr#r Z_Elementetree_builders tag_regexpmatchgroupr prefixes fromXmlNamer$itemsgroupssorted) rindentdtd_strZ next_elementZnsmatchnsr!prefix attributesr valueZ attr_stringchild) infosetFilterrvserializeElementrrrD;st                     " z(testSerializer..serializeElement )r)r InfosetFilterjoin)rr)rBrCrDrtestSerializer7s  F rHcs$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!r0r1r$rGr8r#)rr<attrrA)rCrDrrrDs*         z"tostring..serializeElement)rG)rr)rCrDrtostrings rNcszeZdZeZeZdZdZeZ 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)rdictrr8r*tuplecoerceAttributer$)rrr@keyr )rBrrrs   z1TreeBuilder.__init__..Attributes.__init__csPtj|||t|tr4d|dj|df}n j|}||jjj|<dS)Nz{%s}%srr)rQ __setitem__r*rRrSrr$)rrTr@r )rBrrrUs   z4TreeBuilder.__init__..Attributes.__setitem__)N)rrrrrUr)rBrr Attributess rVcsxeZdZfddZfddZfddZeeeZddZfd d Z eee Z dfd d Z fddZ d S)z%TreeBuilder.__init__..Elementcs*j|}jj|||d||_dS)N) namespace) coerceElementElementr _attributes)rr rW)rVbuilderrBrrrs z.TreeBuilder.__init__..Element.__init__cs$j||_|j|j|j|j_dS)N)rX_nameZ _getETreeTagZ _namespacerr!)rr )rBrr_setNames z.TreeBuilder.__init__..Element._setNamecs j|jS)N)r7r\)r)rBrr_getNamesz.TreeBuilder.__init__..Element._getNamecSs|jS)N)rZ)rrrr_getAttributessz4TreeBuilder.__init__..Element._getAttributescs|||_dS)N)rZ)rr?)rVrr_setAttributessz4TreeBuilder.__init__..Element._setAttributesNcsj|}jj|||dS)N)ZcoerceCharactersrY insertText)rdataZ insertBefore)r[rBrrras z0TreeBuilder.__init__..Element.insertTextcsjj||dS)N)rYr)rrA)r[rrrsz1TreeBuilder.__init__..Element.appendChild)N) rrrrr]r^rr r_r`r?rarr)rVr[rBrrrYs     rYcs8eZdZfddZfddZddZeeeZdS)z%TreeBuilder.__init__..Commentcsj|}jj||dS)N) coerceCommentCommentr)rrb)r[rBrrrs z.TreeBuilder.__init__..Comment.__init__csj|}||j_dS)N)rcrr1)rrb)rBrr_setDatas z.TreeBuilder.__init__..Comment._setDatacSs|jjS)N)rr1)rrrr_getDatasz.TreeBuilder.__init__..Comment._getDataN)rrrrrerfrrbr)r[rBrrrds rd)r2ZgetETreeModuler r rFrBnamespaceHTMLElementsrQrYrd elementClass commentClassrrOr)rrgrPrYrdr)rVr[rBrrszTreeBuilder.__init__cCs$tjj||j|_g|_d|_dS)N)rrOresetinsertCommentInitial insertCommentinitial_commentsrK)rrrrrjs zTreeBuilder.resetcCst|S)N)rH)rrrrrrH szTreeBuilder.testSerializercCstr |jjS|jjjSdS)N)rPdocumentrr)rrrr getDocument szTreeBuilder.getDocumentcCsFg}|jdj}|jr"|j|j|jt||jrB|j|j|S)Nr) openElementsrr1r&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)warningswarnrrKrBrX doctypeClass)rtokenr rrZ coercedNamerKrrr insertDoctypes   zTreeBuilder.insertDoctypecCs6|dks||jkst|jjdks&t|jj|dS)N)rnr/rrmr&)rrbparentrrrrk,sz TreeBuilder.insertCommentInitialcsB||jkr,|jjjdjtkr,tjdttt |j ||dS)Nrz@lxml cannot represent adjacent comments beyond the root elements) rnrrr!r0rtrursuperrOrl)rrbry) __class__rrinsertCommentMain1s  zTreeBuilder.insertCommentMainc Csd}|jr|jjst|d|jj7}|jjdk s>|jjdk r|d|jj|jjpRd7}|jjr|jj}|jddkr|jddkrtj dt |j dd }|jddkr|d |7}q|d |7}n|d 7}|d 7}|jj|dkrtj dt |d7}t j |}x*|jD] }|j|d}|j|jqW|j|_|j|j_|d}|jd|j}|dkrn|} n d||f} | |_|j||} || _|jjj| |jj| |j|_dS)zCreate the document rootrMz r zGlxml cannot represent doctype with a different name to the root elementz$rbrWz{%s}%s)rKr r/rrrBZ coercePubidfindrtrurreplacer Z fromstringrmriZ addpreviousr documentClassrnZ getroottreergetZdefaultNamespacer!rhrr&rpr}rl) rrwZdocStrZsysidroot comment_tokenZcommentr rWZ etree_tagZ root_elementrrr insertRoot7sL              zTreeBuilder.insertRoot)F)N)N)rrrrrr rvrhriZ fragmentClassr implementationrrjrHrorsrxrkr}r __classcell__rr)r|rrOs L  rO)__doc__Z __future__rrrrtrer-rMrr rr r2r Z lxml.etreerPcompiler3rdr!r0objectr rrHrNrOrrrr s$        O)