a lj@sjddlmZmZmZddlmZddlZddlmZddl m Z ddl m Z e d Zd d Ze eZdS) )absolute_importdivisionunicode_literals) OrderedDictN) string_types)base)moduleFactoryFactoryz {([^}]*)}(.*)cs,|}|djGfdddtj}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 s.t|tr2|\}}}}|dvr.tjt||fS|}t|dsD|}|jdvrVtjfS|jdkr|tj |j | d| dfS|jkrtj |j fSt |j}|r|\}}n d}|j}t}t|jD]>\} } t | }|r| ||d|df<q| |d| f<qtj|||t|p&|j fSdS) Ntexttailtag)Z DOCUMENT_ROOTZDOCUMENT_FRAGMENTz ZpublicIdZsystemIdrr ) isinstancetuplerZTEXTgetattrhasattrZgetrootrZDOCUMENTZDOCTYPEr getCOMMENT tag_regexpmatchgroupsrlistZattribitemsgroupZELEMENTlen) selfnodeelt_flagr namespacerattrsnamevalueZElementTreeCommentTypeJ/usr/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/etree.pygetNodeDetails s:         z2getETreeBuilder..TreeWalker.getNodeDetailscSstt|tr|\}}}}n|dgdf\}}}}|dvr8dS|jrJ|||dfSt|rl|||dd|dfSdSdS)Nr r r)rrr rappendrrelementkeyparentsr r&r&r' getFirstChildHs   z1getETreeBuilder..TreeWalker.getFirstChildcSst|tr|\}}}}ndS|dkrLt|rF|||dd|dfSdSnN|jrf|dkrf|||dfS|t|ddkr|d|d|d|dfSdSdS)Nr rr r)rrrr)r r*r&r&r'getNextSiblingYs   z2getETreeBuilder..TreeWalker.getNextSiblingcSsht|tr|\}}}}ndS|dkr:|s,|S|||dfSn*|}|sJ|S|t|d||dfSdS)Nr r/)rrpoprindex)rrr+r,r-r parentr&r&r' getParentNodems z1getETreeBuilder..TreeWalker.getParentNodeN)__name__ __module__ __qualname____doc__r(r.r0r4r&r%r&r' TreeWalkers  (r9)CommentrrZNonRecursiveTreeWalkerlocals)ZElementTreeImplementationZ ElementTreer9r&r%r'getETreeBuilders nr<)Z __future__rrr collectionsrreZpip._vendor.sixrrZ_utilsr compilerr<ZgetETreeModuler&r&r&r's     u