From 3be4475ddf1e49ed51f76b2325c4a35eff60f90f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Mart=C3=ADnez=20Portela?= Date: Thu, 3 Nov 2022 23:01:21 +0100 Subject: [PATCH 1/5] Support get_raw_contents of list groups. --- org_rw/dom.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/org_rw/dom.py b/org_rw/dom.py index bc24272..6b3e455 100644 --- a/org_rw/dom.py +++ b/org_rw/dom.py @@ -7,7 +7,6 @@ class DrawerNode: class PropertyDrawerNode(DrawerNode): - def __repr__(self): return "".format(len(self.children)) @@ -38,6 +37,9 @@ class ListGroupNode: def append(self, child): self.children.append(child) + def get_raw(self): + return '\n'.join([c.get_raw() for c in self.children]) + def __repr__(self): return "".format(len(self.children)) @@ -64,6 +66,9 @@ class Text: def __init__(self, content): self.content = content + def get_raw(self): + return ''.join(self.content.get_raw()) + class ListItem: def __init__(self, tag, content, orig=None): @@ -71,6 +76,9 @@ class ListItem: self.content = content self.orig = orig + def get_raw(self): + return get_raw_contents(self.orig) + class BlockNode: def __init__(self): @@ -92,3 +100,5 @@ class CodeBlock(BlockNode): def __repr__(self): return "".format(len(self.lines)) + +from .utils import get_raw_contents From dbafafcba55807af1af22797e5d233b517edc708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Mart=C3=ADnez=20Portela?= Date: Thu, 3 Nov 2022 23:35:56 +0100 Subject: [PATCH 2/5] Indent list-group inside current node if part of a block. --- org_rw/org_rw.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/org_rw/org_rw.py b/org_rw/org_rw.py index 6cbd04b..ffd6967 100644 --- a/org_rw/org_rw.py +++ b/org_rw/org_rw.py @@ -395,9 +395,12 @@ class Headline: or isinstance(current_node, dom.BlockNode) or isinstance(current_node, dom.DrawerNode) ): + was_node = current_node current_node = dom.ListGroupNode() - if current_node is None: + if was_node is None: tree.append(current_node) + else: + was_node.append(current_node) indentation_tree.append(current_node) if not isinstance(current_node, dom.ListGroupNode): if not isinstance(current_node, dom.ListGroupNode): From 28ddd3e44f80ae82f8e7ccde48d94cf96b18c366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Mart=C3=ADnez=20Portela?= Date: Thu, 3 Nov 2022 23:01:21 +0100 Subject: [PATCH 3/5] Support get_raw_contents of list groups. --- org_rw/dom.py | 12 +++++++++++- org_rw/utils.py | 6 +++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/org_rw/dom.py b/org_rw/dom.py index bc24272..6b3e455 100644 --- a/org_rw/dom.py +++ b/org_rw/dom.py @@ -7,7 +7,6 @@ class DrawerNode: class PropertyDrawerNode(DrawerNode): - def __repr__(self): return "".format(len(self.children)) @@ -38,6 +37,9 @@ class ListGroupNode: def append(self, child): self.children.append(child) + def get_raw(self): + return '\n'.join([c.get_raw() for c in self.children]) + def __repr__(self): return "".format(len(self.children)) @@ -64,6 +66,9 @@ class Text: def __init__(self, content): self.content = content + def get_raw(self): + return ''.join(self.content.get_raw()) + class ListItem: def __init__(self, tag, content, orig=None): @@ -71,6 +76,9 @@ class ListItem: self.content = content self.orig = orig + def get_raw(self): + return get_raw_contents(self.orig) + class BlockNode: def __init__(self): @@ -92,3 +100,5 @@ class CodeBlock(BlockNode): def __repr__(self): return "".format(len(self.lines)) + +from .utils import get_raw_contents diff --git a/org_rw/utils.py b/org_rw/utils.py index 555671a..0e6f559 100644 --- a/org_rw/utils.py +++ b/org_rw/utils.py @@ -1,8 +1,10 @@ import uuid -from .org_rw import (Bold, Code, Headline, Italic, Line, RawLine, Strike, Text, +from .org_rw import (Bold, Code, Headline, Italic, Line, RawLine, ListItem, Strike, Text, Underlined, Verbatim) +from .org_rw import dump_contents + def get_hl_raw_contents(doc: Headline) -> str: lines = [] @@ -36,6 +38,8 @@ def get_raw_contents(doc) -> str: return "".join([get_raw_contents(chunk) for chunk in doc]) if isinstance(doc, (Text, Bold, Code, Italic, Strike, Underlined, Verbatim)): return doc.get_raw() + if isinstance(doc, ListItem): + return dump_contents(doc)[1] print("Unhandled type: " + str(doc)) raise NotImplementedError("Unhandled type: " + str(doc)) From bf10c51e6194f61b2ec21ed683f768d04f0da2cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Mart=C3=ADnez=20Portela?= Date: Thu, 3 Nov 2022 23:35:56 +0100 Subject: [PATCH 4/5] Indent list-group inside current node if part of a block. --- org_rw/org_rw.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/org_rw/org_rw.py b/org_rw/org_rw.py index 6cbd04b..ffd6967 100644 --- a/org_rw/org_rw.py +++ b/org_rw/org_rw.py @@ -395,9 +395,12 @@ class Headline: or isinstance(current_node, dom.BlockNode) or isinstance(current_node, dom.DrawerNode) ): + was_node = current_node current_node = dom.ListGroupNode() - if current_node is None: + if was_node is None: tree.append(current_node) + else: + was_node.append(current_node) indentation_tree.append(current_node) if not isinstance(current_node, dom.ListGroupNode): if not isinstance(current_node, dom.ListGroupNode): From ccebe90ea84afa3847a9e3f409922146312344f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Mart=C3=ADnez=20Portela?= Date: Fri, 4 Nov 2022 00:14:13 +0100 Subject: [PATCH 5/5] Fix as_dom of Text found in a result after a list. --- org_rw/org_rw.py | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/org_rw/org_rw.py b/org_rw/org_rw.py index ffd6967..29f2998 100644 --- a/org_rw/org_rw.py +++ b/org_rw/org_rw.py @@ -376,18 +376,32 @@ class Headline: current_node.append(dom.PropertyNode(line.key, line.value)) elif isinstance(line, Text): - if isinstance(current_node, dom.BlockNode): - current_node.append(dom.Text(line)) - elif isinstance(current_node, dom.DrawerNode): - current_node.append(dom.Text(line)) + tree_up = list(indentation_tree) + while len(tree_up) > 0: + node = tree_up[-1] + if (isinstance(node, dom.BlockNode) + or isinstance(node, dom.DrawerNode) + ): + node.append(dom.Text(line)) + current_node = node + contents = [] + break + elif ((not isinstance(node, dom.TableNode)) and + (type(node) not in NON_FINISHED_GROUPS) + ): + raise NotImplementedError('Not implemented node type: {} (headline_id={}, line={}, doc={})'.format( + node, + self.id, + line.linenum, + self.doc.path, + )) + else: + tree_up.pop(-1) else: - if isinstance(current_node, dom.TableNode): - pass # No problem here - elif type(current_node) not in NON_FINISHED_GROUPS: - raise NotImplementedError('Not implemented node type: {}'.format(current_node)) current_node = None contents = [] tree.append(dom.Text(text_to_dom(line.contents, line))) + indentation_tree = tree_up elif isinstance(line, ListItem): if (current_node is None @@ -434,7 +448,7 @@ class Headline: ) > len(line.indentation) ): - rem = indentation_tree.pop() + rem = indentation_tree.pop(-1) if len(indentation_tree) == 0: indentation_tree.append(rem) current_node = rem @@ -515,8 +529,6 @@ class Headline: 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