diff --git a/org_rw/dom.py b/org_rw/dom.py index bc24272..dd9c7d7 100644 --- a/org_rw/dom.py +++ b/org_rw/dom.py @@ -1,23 +1,32 @@ -class DrawerNode: +class PropertyDrawerNode: def __init__(self): self.children = [] def append(self, child): self.children.append(child) - -class PropertyDrawerNode(DrawerNode): - def __repr__(self): return "".format(len(self.children)) -class LogbookDrawerNode(DrawerNode): +class LogbookDrawerNode: + def __init__(self): + self.children = [] + + def append(self, child): + self.children.append(child) + def __repr__(self): return "".format(len(self.children)) -class ResultsDrawerNode(DrawerNode): +class ResultsDrawerNode: + def __init__(self): + self.children = [] + + def append(self, child): + self.children.append(child) + def __repr__(self): return "".format(len(self.children)) @@ -73,16 +82,12 @@ class ListItem: class BlockNode: - def __init__(self): - self.children = [] - def append(self, child): - self.children.append(child) + raise NotImplementedError() class CodeBlock(BlockNode): def __init__(self, header, subtype): - super().__init__() self.header = header self.lines = None self.subtype = subtype diff --git a/org_rw/org_rw.py b/org_rw/org_rw.py index 6cbd04b..c3d9f57 100644 --- a/org_rw/org_rw.py +++ b/org_rw/org_rw.py @@ -378,7 +378,7 @@ class Headline: elif isinstance(line, Text): if isinstance(current_node, dom.BlockNode): current_node.append(dom.Text(line)) - elif isinstance(current_node, dom.DrawerNode): + elif isinstance(current_node, dom.LogbookDrawerNode): current_node.append(dom.Text(line)) else: if isinstance(current_node, dom.TableNode): @@ -390,18 +390,13 @@ 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) - or isinstance(current_node, dom.BlockNode) - or isinstance(current_node, dom.DrawerNode) - ): + if current_node is None or isinstance(current_node, dom.TableNode): current_node = dom.ListGroupNode() - if current_node is None: - tree.append(current_node) - indentation_tree.append(current_node) + tree.append(current_node) + indentation_tree = [current_node] if not isinstance(current_node, dom.ListGroupNode): if not isinstance(current_node, dom.ListGroupNode): - raise Exception("Expected a {}, found: {} on line {} on {}".format(dom.ListGroupNode, current_node, line.linenum, self.doc.path)) + logging.warning("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 ( @@ -446,7 +441,6 @@ 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): @@ -488,39 +482,36 @@ 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 and len(indentation_tree) == 0: - logging.error('Finished node (:END:) with no known starter') + if current_node is None: + logging.warning('Finished node (:END:) with no known starter') else: - tree_up = list(indentation_tree) + tree_up = list(tree) while len(tree_up) > 0: node = tree_up[-1] - if isinstance(node, dom.DrawerNode): - indentation_tree = tree_up + if (isinstance( + node, dom.PropertyDrawerNode + ) or isinstance( + node, dom.LogbookDrawerNode + ) or isinstance( + node, dom.ResultsDrawerNode + )): + 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 + tree.pop() 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))