Compare commits

..

2 Commits

Author SHA1 Message Date
Sergio Martínez Portela
55fc87cfdc Add absence of dependencies as principle.
All checks were successful
Testing / pytest (push) Successful in 20s
Testing / mypy (push) Successful in 29s
Testing / style-formatting (push) Successful in 19s
Testing / style-sorted-imports (push) Successful in 16s
Testing / stability-extra-test (push) Successful in 22s
2025-04-16 01:00:09 +02:00
Sergio Martínez Portela
f936bccf7f doc: Add a small "Principles" section to README.
All checks were successful
Testing / pytest (push) Successful in 17s
Testing / mypy (push) Successful in 22s
Testing / style-formatting (push) Successful in 20s
Testing / style-sorted-imports (push) Successful in 19s
Testing / stability-extra-test (push) Successful in 21s
2025-04-16 00:46:52 +02:00
3 changed files with 16 additions and 10 deletions

View File

@ -7,6 +7,12 @@ A python library to parse, modify and save Org-mode files.
- Modify these data and write it back to disk. - Modify these data and write it back to disk.
- Keep the original structure intact (indentation, spaces, format, ...). - Keep the original structure intact (indentation, spaces, format, ...).
** Principles
- Avoid any dependency outside of Python's standard library.
- Don't do anything outside of the scope of parsing/re-serializing Org-mode files.
- *Modification of the original text if there's no change is considered a bug (see [[id:7363ba38-1662-4d3c-9e83-0999824975b7][Known issues]]).*
- Data structures should be exposed as it's read on Emacs's org-mode or when in doubt as raw as possible.
- Data in the objects should be modificable as a way to update the document itself. *Consider this a Object-oriented design.*
** Safety mechanism ** Safety mechanism
As this library is still in early development. Running it over files might As this library is still in early development. Running it over files might
produce unexpected changes on them. For this reason it's heavily recommended to produce unexpected changes on them. For this reason it's heavily recommended to
@ -21,6 +27,9 @@ Also, see [[id:76e77f7f-c9e0-4c83-ad2f-39a5a8894a83][Known issues:Structure modi
not properly stored and can trigger this safety mechanism on a false-positive. not properly stored and can trigger this safety mechanism on a false-positive.
* Known issues * Known issues
:PROPERTIES:
:ID: 7363ba38-1662-4d3c-9e83-0999824975b7
:END:
** Structure modifications ** Structure modifications
:PROPERTIES: :PROPERTIES:
:ID: 76e77f7f-c9e0-4c83-ad2f-39a5a8894a83 :ID: 76e77f7f-c9e0-4c83-ad2f-39a5a8894a83

View File

@ -417,6 +417,7 @@ class Headline:
and line.delimiter_type == DelimiterLineType.END_BLOCK and line.delimiter_type == DelimiterLineType.END_BLOCK
and line.type_data.subtype == current_node.header.type_data.subtype and line.type_data.subtype == current_node.header.type_data.subtype
): ):
start = current_node.header.linenum start = current_node.header.linenum
end = line.linenum end = line.linenum
@ -823,6 +824,7 @@ class Headline:
def set_property(self, name: str, value: str): def set_property(self, name: str, value: str):
for prop in self.properties: for prop in self.properties:
# A matching property is found, update it # A matching property is found, update it
if prop.key == name: if prop.key == name:
prop.value = value prop.value = value
@ -1022,6 +1024,7 @@ class Headline:
and result_first[0] == "structural" and result_first[0] == "structural"
and result_first[1].strip().upper() == ":RESULTS:" and result_first[1].strip().upper() == ":RESULTS:"
): ):
(end_line, _) = self.get_structural_end_after( (end_line, _) = self.get_structural_end_after(
kword.linenum + 1 kword.linenum + 1
) )
@ -1816,7 +1819,7 @@ def token_list_to_plaintext(tok_list) -> str:
else: else:
assert isinstance(chunk, MarkerToken) assert isinstance(chunk, MarkerToken)
return "".join(contents).strip() return "".join(contents)
def token_list_to_raw(tok_list): def token_list_to_raw(tok_list):
@ -2038,6 +2041,7 @@ def tokenize_contents(contents: str) -> List[TokenItems]:
and is_pre(last_char) and is_pre(last_char)
and ((i + 1 < len(contents)) and is_border(contents[i + 1])) and ((i + 1 < len(contents)) and is_border(contents[i + 1]))
): ):
is_valid_mark = False is_valid_mark = False
# Check that is closed later # Check that is closed later
text_in_line = True text_in_line = True
@ -2430,6 +2434,7 @@ class OrgDoc:
# Writing # Writing
def dump_headline(self, headline, recursive=True): def dump_headline(self, headline, recursive=True):
tags = "" tags = ""
if len(headline.shallow_tags) > 0: if len(headline.shallow_tags) > 0:
tags = ":" + ":".join(headline.shallow_tags) + ":" tags = ":" + ":".join(headline.shallow_tags) + ":"
@ -2443,14 +2448,7 @@ class OrgDoc:
if not (raw_title.endswith(" ") or raw_title.endswith("\t")) and tags: if not (raw_title.endswith(" ") or raw_title.endswith("\t")) and tags:
tags_padding = " " tags_padding = " "
yield ( yield "*" * headline.depth + headline.spacing + state + raw_title + tags_padding + tags
"*" * headline.depth
+ headline.spacing
+ state
+ raw_title
+ tags_padding
+ tags
)
planning = headline.get_planning_line() planning = headline.get_planning_line()
if planning is not None: if planning is not None:

View File

@ -1 +0,0 @@
# No external requirements at this point