Compare commits

...

2 Commits

Author SHA1 Message Date
Sergio Martínez Portela
63bb1e67e0 Handle :RESULTS: drawer, and data inside :LOGBOOK: 2022-05-16 23:17:28 +02:00
Sergio Martínez Portela
c87a50f365 Fix handling of Headline hierarchy. 2022-05-16 23:16:20 +02:00
2 changed files with 46 additions and 11 deletions

View File

@ -17,7 +17,18 @@ class LogbookDrawerNode:
self.children.append(child) self.children.append(child)
def __repr__(self): def __repr__(self):
return "<Properties: {}>".format(len(self.children)) return "<LogBook: {}>".format(len(self.children))
class ResultsDrawerNode:
def __init__(self):
self.children = []
def append(self, child):
self.children.append(child)
def __repr__(self):
return "<Results: {}>".format(len(self.children))
class PropertyNode: class PropertyNode:

View File

@ -98,7 +98,7 @@ RESULTS_DRAWER_RE = re.compile(r"^\s*:results:\s*$", re.I)
CodeSnippet = collections.namedtuple("CodeSnippet", ("name", "content", "result")) CodeSnippet = collections.namedtuple("CodeSnippet", ("name", "content", "result"))
# Groupings # Groupings
NON_FINISHED_GROUPS = (type(None), dom.ListGroupNode) NON_FINISHED_GROUPS = (type(None), dom.ListGroupNode, dom.ResultsDrawerNode, dom.PropertyDrawerNode)
FREE_GROUPS = (dom.CodeBlock,) FREE_GROUPS = (dom.CodeBlock,)
@ -362,7 +362,7 @@ class Headline:
current_node.append(dom.Text(line)) current_node.append(dom.Text(line))
else: else:
if type(current_node) not in NON_FINISHED_GROUPS: if type(current_node) not in NON_FINISHED_GROUPS:
assert type(current_node) in NON_FINISHED_GROUPS raise NotImplementedError('Not implemented node type: {}'.format(current_node))
current_node = None current_node = None
contents = [] contents = []
tree.append(dom.Text(text_to_dom(line.contents, line))) tree.append(dom.Text(text_to_dom(line.contents, line)))
@ -373,7 +373,9 @@ class Headline:
tree.append(current_node) tree.append(current_node)
indentation_tree = [current_node] indentation_tree = [current_node]
if not isinstance(current_node, dom.ListGroupNode): if not isinstance(current_node, dom.ListGroupNode):
assert isinstance(current_node, dom.ListGroupNode) if not isinstance(current_node, dom.ListGroupNode):
logging.warning("Expected a {}, found: {} on line {}".format(dom.ListGroupNode, current_node, line.linenum))
# This can happen. Frequently inside a LogDrawer
if len(indentation_tree) > 0 and ( if len(indentation_tree) > 0 and (
(len(indentation_tree[-1].children) > 0) (len(indentation_tree[-1].children) > 0)
@ -447,10 +449,21 @@ class Headline:
current_node = dom.LogbookDrawerNode() current_node = dom.LogbookDrawerNode()
tree.append(current_node) tree.append(current_node)
elif content.strip().upper() == ":END:": elif content.strip().upper() == ":END:":
assert isinstance( if current_node is None:
logging.warning('Finished node (:END:) with no known starter')
elif not (isinstance(
current_node, dom.PropertyDrawerNode current_node, dom.PropertyDrawerNode
) or isinstance(current_node, dom.LogbookDrawerNode) ) or isinstance(
current_node, dom.LogbookDrawerNode
) or isinstance(
current_node, dom.ResultsDrawerNode
)):
raise Exception('Unexpected node: {}'.format(current_node))
current_node = None current_node = None
elif content.strip().upper() == ":RESULTS:":
assert current_node is None
current_node = dom.ResultsDrawerNode()
tree.append(current_node)
else: else:
raise Exception("Unknown structural line: {}".format(line)) raise Exception("Unknown structural line: {}".format(line))
else: else:
@ -1476,6 +1489,9 @@ def parse_headline(hl, doc, parent) -> Headline:
contents = parse_contents(hl["contents"]) contents = parse_contents(hl["contents"])
if not (isinstance(parent, OrgDoc) or depth > parent.depth):
raise AssertionError("Incorrectly parsed parent on `{}' > `{}'".format(parent.title, title))
headline = Headline( headline = Headline(
start_line=hl["linenum"], start_line=hl["linenum"],
depth=depth, depth=depth,
@ -1781,18 +1797,26 @@ class OrgDocReader:
"list_items": [], "list_items": [],
} }
while (depth - 2) > len(self.headline_hierarchy): while (depth - 1) > len(self.headline_hierarchy):
# Introduce structural headlines # Introduce structural headlines
self.headline_hierarchy.append(None) self.headline_hierarchy.append(None)
while depth < len(self.headline_hierarchy): while depth <= len(self.headline_hierarchy):
self.headline_hierarchy.pop() self.headline_hierarchy.pop()
if depth == 1: if depth == 1:
self.headlines.append(headline) self.headlines.append(headline)
else: else:
self.headline_hierarchy[-1]["children"].append(headline) parent_idx = len(self.headline_hierarchy) - 1
while self.headline_hierarchy[parent_idx] is None:
parent_idx -= 1
self.headline_hierarchy[parent_idx]["children"].append(headline)
self.headline_hierarchy.append(headline) self.headline_hierarchy.append(headline)
if all([hl is not None for hl in self.headline_hierarchy]):
if not ([ len(hl['orig'].group('stars')) for hl in self.headline_hierarchy ]
== list(range(1, len(self.headline_hierarchy) + 1))):
raise AssertionError('Error on Headline Hierarchy')
def add_list_item_line(self, linenum: int, match: re.Match) -> int: def add_list_item_line(self, linenum: int, match: re.Match) -> int:
li = ListItem( li = ListItem(
linenum, linenum,