From 440f0bd4b79b02b9b3706df13d79f7dd4d3b52e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Mart=C3=ADnez=20Portela?= Date: Tue, 1 Nov 2022 19:58:17 +0100 Subject: [PATCH] Properly fix parsing of lists inside drawers. --- org_rw/org_rw.py | 50 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/org_rw/org_rw.py b/org_rw/org_rw.py index c6713b9..6cbd04b 100644 --- a/org_rw/org_rw.py +++ b/org_rw/org_rw.py @@ -390,13 +390,18 @@ class Headline: tree.append(dom.Text(text_to_dom(line.contents, line))) elif isinstance(line, ListItem): - if current_node is None or isinstance(current_node, dom.TableNode): + if (current_node is None + or isinstance(current_node, dom.TableNode) + or isinstance(current_node, dom.BlockNode) + or isinstance(current_node, dom.DrawerNode) + ): current_node = dom.ListGroupNode() - tree.append(current_node) - indentation_tree = [current_node] + if current_node is None: + tree.append(current_node) + indentation_tree.append(current_node) if not isinstance(current_node, dom.ListGroupNode): if not isinstance(current_node, dom.ListGroupNode): - logging.warning("Expected a {}, found: {} on line {} on {}".format(dom.ListGroupNode, current_node, line.linenum, self.doc.path)) + raise Exception("Expected a {}, found: {} on line {} on {}".format(dom.ListGroupNode, current_node, line.linenum, self.doc.path)) # This can happen. Frequently inside a LogDrawer if len(indentation_tree) > 0 and ( @@ -441,6 +446,7 @@ class Headline: if current_node is None: current_node = dom.TableNode() tree.append(current_node) + # TODO: Allow indentation of this element inside others indentation_tree = [current_node] if not isinstance(current_node, dom.TableNode): if not isinstance(current_node, dom.TableNode): @@ -482,25 +488,39 @@ class Headline: assert current_node is None current_node = dom.PropertyDrawerNode() tree.append(current_node) + # TODO: Check if this can be nested + indentation_tree = [current_node] elif content.strip().upper() == ":LOGBOOK:": assert current_node is None current_node = dom.LogbookDrawerNode() tree.append(current_node) + # TODO: Check if this can be nested + indentation_tree = [current_node] elif content.strip().upper() == ":END:": - if current_node is None: - logging.warning('Finished node (:END:) with no known starter') - elif not (isinstance( - current_node, dom.PropertyDrawerNode - ) or isinstance( - current_node, dom.LogbookDrawerNode - ) or isinstance( - current_node, dom.ResultsDrawerNode - )): - raise Exception('Unexpected node: {}'.format(current_node)) - current_node = None + if current_node is None and len(indentation_tree) == 0: + logging.error('Finished node (:END:) with no known starter') + else: + tree_up = list(indentation_tree) + while len(tree_up) > 0: + node = tree_up[-1] + if isinstance(node, dom.DrawerNode): + indentation_tree = tree_up + current_node = node + tree_up.pop(-1) + break + else: + tree_up.pop(-1) + else: + raise Exception('Unexpected node ({}) on headline (id={}), line {}'.format(current_node, self.id, linenum)) + if self.id == 'd07fcf27-d6fc-41e3-a9d0-b2e2902aec23': + print("Found node:", current_node) + current_node = None elif content.strip().upper() == ":RESULTS:": assert current_node is None current_node = dom.ResultsDrawerNode() + + # TODO: Allow indentation of these blocks inside others + indentation_tree = [current_node] tree.append(current_node) else: raise Exception("Unknown structural line: {}".format(line))