From c5845d670ffe45689e5a48202cdb8697815006e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Mart=C3=ADnez=20Portela?= Date: Tue, 30 Jul 2024 17:35:28 +0200 Subject: [PATCH 1/2] Avoid line offset correction, as it's tricky to do it correctly. Note that we might want to restore the offset correction at some point to allow looking at the line positions after the load is completed. --- org_rw/org_rw.py | 50 ++++++++++++------------------------------------ 1 file changed, 12 insertions(+), 38 deletions(-) diff --git a/org_rw/org_rw.py b/org_rw/org_rw.py index acca21d..f074f8a 100644 --- a/org_rw/org_rw.py +++ b/org_rw/org_rw.py @@ -820,17 +820,6 @@ class Headline: raise NotImplementedError() def update_raw_contents(self, new_contents): - # Clear elements - self.keywords = [] - self.contents = [] - self.list_items = [] - self.table_rows = [] - self.properties = [] - self.structural = [] - self.delimiters = [] - self.scheduled = None - self.deadline = None - self.closed = None reader = OrgDocReader(environment=self.doc.environment) reader.read(new_contents) @@ -840,20 +829,19 @@ class Headline: # Probably can be done by just adding the headlines to this one's children raise NotImplementedError('new headlines on raw contents not supported yet. This probably should be simple, see comment on code.') - for kw in reader.keywords: - self.keywords.append(offset_linenum(self.start_line + 1, kw)) + # Clear elements + self.keywords = reader.keywords + self.contents = reader.contents + self.list_items = reader.list_items + self.table_rows = reader.table_rows + self.properties = reader.properties + self.structural = reader.structural + self.delimiters = reader.delimiters - for content in reader.contents: - self.contents.append(offset_linenum(self.start_line + 1, content)) - - for list_item in reader.list_items: - self.list_items.append(offset_linenum(self.start_line + 1, list_item)) - - for struct_item in reader.structural: - self.structural.append(offset_linenum(self.start_line + 1, struct_item)) - - for prop in reader.properties: - self.properties.append(offset_linenum(self.start_line + 1, prop)) + # TODO: Support update of scheduled/deadline/closed line + self.scheduled = None + self.deadline = None + self.closed = None # Environment is not used, as it's known @@ -1074,20 +1062,6 @@ TableRow = collections.namedtuple( ), ) -ItemWithLineNum = Union[Keyword, RawLine, Property, ListItem, tuple[int, Any]] -def offset_linenum(offset: int, item: ItemWithLineNum) -> ItemWithLineNum: - if isinstance(item, tuple) and len(item) == 2 and isinstance(item[0], int): - return item - - if isinstance(item, ListItem): - item.linenum += offset - return item - - assert isinstance(item, (Keyword, RawLine, Property)), \ - "Expected (Keyword|RawLine|Property), found {}".format(item) - return item._replace(linenum=item.linenum + offset) - - # @TODO How are [YYYY-MM-DD HH:mm--HH:mm] and ([... HH:mm]--[... HH:mm]) differentiated ? # @TODO Consider recurrence annotations class Timestamp: From 97db5686d80ad4fe9164560e6ab5ea255c19e83e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Mart=C3=ADnez=20Portela?= Date: Tue, 30 Jul 2024 17:43:46 +0200 Subject: [PATCH 2/2] Tag structural elements. --- org_rw/org_rw.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/org_rw/org_rw.py b/org_rw/org_rw.py index acca21d..c8836e1 100644 --- a/org_rw/org_rw.py +++ b/org_rw/org_rw.py @@ -1026,6 +1026,9 @@ Keyword = collections.namedtuple( Property = collections.namedtuple( "Property", ("linenum", "match", "key", "value", "options") ) +Structural = collections.namedtuple( + "Structural", ("linenum", "line") +) class ListItem: @@ -1074,17 +1077,14 @@ TableRow = collections.namedtuple( ), ) -ItemWithLineNum = Union[Keyword, RawLine, Property, ListItem, tuple[int, Any]] +ItemWithLineNum = Union[Keyword, RawLine, Property, ListItem, Structural] def offset_linenum(offset: int, item: ItemWithLineNum) -> ItemWithLineNum: - if isinstance(item, tuple) and len(item) == 2 and isinstance(item[0], int): - return item - if isinstance(item, ListItem): item.linenum += offset return item - assert isinstance(item, (Keyword, RawLine, Property)), \ - "Expected (Keyword|RawLine|Property), found {}".format(item) + assert isinstance(item, (Keyword, RawLine, Property, Structural)), \ + "Expected (Keyword|RawLine|Property|Structural), found {}".format(item) return item._replace(linenum=item.linenum + offset) @@ -2465,8 +2465,8 @@ class OrgDocReader: self.delimiters: List[DelimiterLine] = [] self.list_items: List[ListItem] = [] self.table_rows: List[TableRow] = [] - self.structural: List = [] - self.properties: List = [] + self.structural: List[Structural] = [] + self.properties: List[Property] = [] self.current_drawer: Optional[List] = None self.environment = environment @@ -2648,7 +2648,7 @@ class OrgDocReader: def add_property_drawer_line(self, linenum: int, line: str, match: re.Match): if len(self.headline_hierarchy) == 0: self.current_drawer = self.properties - self.structural.append((linenum, line)) + self.structural.append(Structural(linenum, line)) else: assert self.headline_hierarchy[-1] is not None self.current_drawer = self.headline_hierarchy[-1]["properties"] @@ -2667,7 +2667,7 @@ class OrgDocReader: def add_drawer_end_line(self, linenum: int, line: str, match: re.Match): self.current_drawer = None if len(self.headline_hierarchy) == 0: - self.structural.append((linenum, line)) + self.structural.append(Structural(linenum, line)) else: assert self.headline_hierarchy[-1] is not None self.headline_hierarchy[-1]["structural"].append((linenum, line))