Compare commits

..

3 Commits

Author SHA1 Message Date
Sergio Martínez Portela
440f0bd4b7 Properly fix parsing of lists inside drawers. 2022-11-01 19:58:17 +01:00
Sergio Martínez Portela
fc9ce664ae Unify drawer node classes under a common parent. 2022-11-01 19:58:03 +01:00
Sergio Martínez Portela
d1d5de89b7 Revert "Fix parsing of lists inside drawers."
This reverts commit 5e4a9f8ff2.

The tree should not be modified, as it's the returned value. We need an
     additional tree for parent-child element connections.
2022-11-01 19:14:14 +01:00
2 changed files with 37 additions and 33 deletions

View File

@ -1,32 +1,23 @@
class PropertyDrawerNode: class DrawerNode:
def __init__(self): def __init__(self):
self.children = [] self.children = []
def append(self, child): def append(self, child):
self.children.append(child) self.children.append(child)
class PropertyDrawerNode(DrawerNode):
def __repr__(self): def __repr__(self):
return "<Properties: {}>".format(len(self.children)) return "<Properties: {}>".format(len(self.children))
class LogbookDrawerNode: class LogbookDrawerNode(DrawerNode):
def __init__(self):
self.children = []
def append(self, child):
self.children.append(child)
def __repr__(self): def __repr__(self):
return "<LogBook: {}>".format(len(self.children)) return "<LogBook: {}>".format(len(self.children))
class ResultsDrawerNode: class ResultsDrawerNode(DrawerNode):
def __init__(self):
self.children = []
def append(self, child):
self.children.append(child)
def __repr__(self): def __repr__(self):
return "<Results: {}>".format(len(self.children)) return "<Results: {}>".format(len(self.children))
@ -82,12 +73,16 @@ class ListItem:
class BlockNode: class BlockNode:
def __init__(self):
self.children = []
def append(self, child): def append(self, child):
raise NotImplementedError() self.children.append(child)
class CodeBlock(BlockNode): class CodeBlock(BlockNode):
def __init__(self, header, subtype): def __init__(self, header, subtype):
super().__init__()
self.header = header self.header = header
self.lines = None self.lines = None
self.subtype = subtype self.subtype = subtype

View File

@ -378,7 +378,7 @@ class Headline:
elif isinstance(line, Text): elif isinstance(line, Text):
if isinstance(current_node, dom.BlockNode): if isinstance(current_node, dom.BlockNode):
current_node.append(dom.Text(line)) current_node.append(dom.Text(line))
elif isinstance(current_node, dom.LogbookDrawerNode): elif isinstance(current_node, dom.DrawerNode):
current_node.append(dom.Text(line)) current_node.append(dom.Text(line))
else: else:
if isinstance(current_node, dom.TableNode): if isinstance(current_node, dom.TableNode):
@ -390,13 +390,18 @@ class Headline:
tree.append(dom.Text(text_to_dom(line.contents, line))) tree.append(dom.Text(text_to_dom(line.contents, line)))
elif isinstance(line, ListItem): 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() current_node = dom.ListGroupNode()
if current_node is None:
tree.append(current_node) tree.append(current_node)
indentation_tree = [current_node] indentation_tree.append(current_node)
if not isinstance(current_node, dom.ListGroupNode): if not isinstance(current_node, dom.ListGroupNode):
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 # This can happen. Frequently inside a LogDrawer
if len(indentation_tree) > 0 and ( if len(indentation_tree) > 0 and (
@ -441,6 +446,7 @@ class Headline:
if current_node is None: if current_node is None:
current_node = dom.TableNode() current_node = dom.TableNode()
tree.append(current_node) tree.append(current_node)
# TODO: Allow indentation of this element inside others
indentation_tree = [current_node] indentation_tree = [current_node]
if not isinstance(current_node, dom.TableNode): if not isinstance(current_node, dom.TableNode):
if not isinstance(current_node, dom.TableNode): if not isinstance(current_node, dom.TableNode):
@ -482,36 +488,39 @@ class Headline:
assert current_node is None assert current_node is None
current_node = dom.PropertyDrawerNode() current_node = dom.PropertyDrawerNode()
tree.append(current_node) tree.append(current_node)
# TODO: Check if this can be nested
indentation_tree = [current_node]
elif content.strip().upper() == ":LOGBOOK:": elif content.strip().upper() == ":LOGBOOK:":
assert current_node is None assert current_node is None
current_node = dom.LogbookDrawerNode() current_node = dom.LogbookDrawerNode()
tree.append(current_node) tree.append(current_node)
# TODO: Check if this can be nested
indentation_tree = [current_node]
elif content.strip().upper() == ":END:": elif content.strip().upper() == ":END:":
if current_node is None: if current_node is None and len(indentation_tree) == 0:
logging.warning('Finished node (:END:) with no known starter') logging.error('Finished node (:END:) with no known starter')
else: else:
tree_up = list(tree) tree_up = list(indentation_tree)
while len(tree_up) > 0: while len(tree_up) > 0:
node = tree_up[-1] node = tree_up[-1]
if (isinstance( if isinstance(node, dom.DrawerNode):
node, dom.PropertyDrawerNode indentation_tree = tree_up
) or isinstance(
node, dom.LogbookDrawerNode
) or isinstance(
node, dom.ResultsDrawerNode
)):
tree = tree_up
current_node = node current_node = node
tree_up.pop(-1)
break break
else: else:
tree_up.pop(-1) tree_up.pop(-1)
else: else:
raise Exception('Unexpected node ({}) on headline (id={}), line {}'.format(current_node, self.id, linenum)) 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 current_node = None
tree.pop()
elif content.strip().upper() == ":RESULTS:": elif content.strip().upper() == ":RESULTS:":
assert current_node is None assert current_node is None
current_node = dom.ResultsDrawerNode() current_node = dom.ResultsDrawerNode()
# TODO: Allow indentation of these blocks inside others
indentation_tree = [current_node]
tree.append(current_node) tree.append(current_node)
else: else:
raise Exception("Unknown structural line: {}".format(line)) raise Exception("Unknown structural line: {}".format(line))