def parse(self): """ Parse the forms list and return a list of VariantForm objects. """ # Build a list of all the elements of the vfsectLoose, in sequence, # including all tagged nodes (vd, variant_form, grammar, etc.) # and all text elements = [] # Handle any text preceding the very first tag pretag_nodes = _handle_tail(self.node.text) elements.extend(pretag_nodes) for node in self.node.xpath(SALIENT_NODES_XPATH): elements.append(VfsectLooseNode(node=node)) # Handle any significant text following the element (tail) tail_nodes = _handle_tail(node.tail) elements.extend(tail_nodes) # Add the previous and following tags to each element as 'previous' # and 'next' for i, element in enumerate(elements): try: element.previous = elements[i - 1].tag except IndexError: element.previous = None try: element.next = elements[i + 1].tag except IndexError: element.next = None vf_list = _build_vflist(elements) return utilities.unpack_parentheses(vf_list)