U o a@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 sHt|tr2|\}}}}|dkr.tjt||fS|}t|dsD|}|jdkrVtjfS|jdkr|tj |j | d| dfS|jkrtj |j fSt|jt stt|jt|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 publicIdsystemIdrr ) isinstancetuplerZTEXTgetattrhasattrgetrootrZDOCUMENTZDOCTYPEr getCOMMENTrAssertionErrortype tag_regexpmatchgroupsrlistattribitemsgroupZELEMENTlen) selfnodeelt_flagr namespacerattrsnamevalueZElementTreeCommentTypegC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-6mt8ur68\pip\_vendor\html5lib\treewalkers\etree.pygetNodeDetails s@         z2getETreeBuilder..TreeWalker.getNodeDetailscSstt|tr|\}}}}n|dgdf\}}}}|dkr8dS|jrJ|||dfSt|rl|||dd|dfSdSdS)Nr r r)rrr r!appendr"r#elementkeyparentsr&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)rrr!r/r r0r,r,r-getNextSiblingYs   z2getETreeBuilder..TreeWalker.getNextSiblingcSst|tr|\}}}}ndS|dkr:|s,|S|||dfSnD|}|sJ|St|d|dksdt|t|d||dfSdS)Nr r5r)rrpoprcountrindex)r"r#r1r2r3r&parentr,r,r- getParentNodems z1getETreeBuilder..TreeWalker.getParentNodeN)__name__ __module__ __qualname____doc__r.r4r6r;r,r+r,r- TreeWalkers  (r@)CommentrrZNonRecursiveTreeWalkerlocals)ZElementTreeImplementation ElementTreer@r,r+r-getETreeBuilders nrD) __future__rrr collectionsrreZpip._vendor.sixrr_utilsr compilerrDgetETreeModuler,r,r,r-s     t