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

View File

@ -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.LogbookDrawerNode):
elif isinstance(current_node, dom.DrawerNode):
current_node.append(dom.Text(line))
else:
if isinstance(current_node, dom.TableNode):
@ -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()
if current_node is None:
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):
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,36 +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')
if current_node is None and len(indentation_tree) == 0:
logging.error('Finished node (:END:) with no known starter')
else:
tree_up = list(tree)
tree_up = list(indentation_tree)
while len(tree_up) > 0:
node = tree_up[-1]
if (isinstance(
node, dom.PropertyDrawerNode
) or isinstance(
node, dom.LogbookDrawerNode
) or isinstance(
node, dom.ResultsDrawerNode
)):
tree = tree_up
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
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))