3 PfL@sddlmZmZmZyddlmZWn>ek rbyddlmZWnek r\eZYnXYnXddl Z ddl m Z ddl m Z ddlmZe jd Zd d ZeeZdS) )absolute_importdivisionunicode_literals) OrderedDictN) string_types)base)moduleFactoryFactoryz {([^}]*)}(.*)cs,|}|jdjGfdddtj}tS)NZasdcs4eZdZdZfddZddZddZdd Zd S) z#getETreeBuilder..TreeWalkeraGiven the particular ElementTree representation, this implementation, to avoid using recursion, returns "nodes" as tuples with the following content: 1. The current element 2. The index of the element relative to its parent 3. A stack of ancestor elements 4. A flag "text", "tail" or None to indicate if the current node is a text node; either the text or tail of the current element (1) c s2t|tr2|\}}}}|d kr.tjt||fS|}t|dsD|j}|jd krVtjfS|jdkr|tj |j |j d|j dfS|jkrtj |j fSt j|j}|r|j\}}n d}|j}t}xPt|jjD]>\} } t j| }|r| ||jd |jd f<q| |d| f<qWtj|||t|p*|j fSdS) Ntexttailtag DOCUMENT_ROOTDOCUMENT_FRAGMENTz ZpublicIdZsystemIdrr )r r )rr) isinstancetuplerZTEXTgetattrhasattrZgetrootr ZDOCUMENTZDOCTYPEr getCOMMENT tag_regexpmatchgroupsrlistZattribitemsgroupZELEMENTlen) selfnodeZelt_flagr namespacer Zattrsnamevalue)ElementTreeCommentType/usr/lib/python3.6/etree.pygetNodeDetails's6         z2getETreeBuilder..TreeWalker.getNodeDetailscSstt|tr|\}}}}n|dgdf\}}}}|dkr8dS|jrJ|||dfSt|rl|j||dd|dfSdSdS)Nr r r)r r )rrr rappend)rrelementkeyparentsr r%r%r& getFirstChildOs   z1getETreeBuilder..TreeWalker.getFirstChildcSst|tr|\}}}}ndS|dkrLt|rF|j||dd|dfSdSnN|jrf|dkrf|||dfS|t|ddkr|d|d|d|dfSdSdS)Nr rr rr-)rrrr(r )rrr)r*r+r r%r%r&getNextSibling`s   z2getETreeBuilder..TreeWalker.getNextSiblingcSsht|tr|\}}}}ndS|dkr:|s,|S|||dfSn*|j}|sJ|S|t|dj||dfSdS)Nr rr-)rrpoprindex)rrr)r*r+r parentr%r%r& getParentNodets z1getETreeBuilder..TreeWalker.getParentNodeN)__name__ __module__ __qualname____doc__r'r,r.r2r%)r$r%r& TreeWalkers   (r7)Commentr rZNonRecursiveTreeWalkerlocals)ZElementTreeImplementationZ ElementTreer7r%)r$r&getETreeBuilders nr:)Z __future__rrr collectionsr ImportErrorZ ordereddictdictreZpip._vendor.sixrrZ_utilsr compilerr:ZgetETreeModuler%r%r%r&s    t