Improve Timestamp and TimeRange handling.

This commit is contained in:
Sergio Martínez Portela 2020-12-10 00:12:13 +01:00
parent 7f67c768c6
commit b2779dbc41
3 changed files with 37 additions and 4 deletions

View File

@ -313,6 +313,10 @@ def token_from_type(tok_type):
return ModeToMarker[tok_type] return ModeToMarker[tok_type]
def parse_org_time_range(start, end):
return TimeRange(parse_org_time(start), parse_org_time(end))
def parse_org_time(value): def parse_org_time(value):
if m := ACTIVE_TIME_STAMP_RE.match(value): if m := ACTIVE_TIME_STAMP_RE.match(value):
active = True active = True
@ -348,11 +352,15 @@ def parse_org_time(value):
int(m.group("month")), int(m.group("month")),
int(m.group("day")), int(m.group("day")),
m.group("dow"), m.group("dow"),
int(m.group("start_hour")), int(m.group("start_hour")) if m.group("start_hour") else None,
int(m.group("start_minute")), int(m.group("start_minute")) if m.group("start_minute") else None,
) )
def timerange_to_string(tr: TimeRange):
return timestamp_to_string(tr.start_time) + "--" + timestamp_to_string(tr.end_time)
def timestamp_to_string(ts): def timestamp_to_string(ts):
date = "{year}-{month:02d}-{day:02d}".format( date = "{year}-{month:02d}-{day:02d}".format(
year=ts.year, month=ts.month, day=ts.day year=ts.year, month=ts.month, day=ts.day
@ -803,6 +811,8 @@ class OrgDom:
if isinstance(prop.value, Timestamp): if isinstance(prop.value, Timestamp):
value = timestamp_to_string(prop.value) value = timestamp_to_string(prop.value)
elif isinstance(prop.value, TimeRange):
value = timerange_to_string(prop.value)
else: else:
value = prop.value value = prop.value
@ -1012,8 +1022,8 @@ class OrgDomReader:
if (value.count(">--<") == 1) or (value.count("]--[") == 1): if (value.count(">--<") == 1) or (value.count("]--[") == 1):
# Time ranges with two different dates # Time ranges with two different dates
# @TODO properly consider "=> DURATION" section # @TODO properly consider "=> DURATION" section
chunks = value.split("=").split("--") start, end = value.split("=")[0].split("--")
as_time_range = parse_org_time(chunks[0], chunks[1]) as_time_range = parse_org_time_range(start, end)
if (as_time_range[0] is not None) and (as_time_range[1] is not None): if (as_time_range[0] is not None) and (as_time_range[1] is not None):
value = TimeRange(as_time_range[0], as_time_range[1]) value = TimeRange(as_time_range[0], as_time_range[1])
elif as_time := parse_org_time(value): elif as_time := parse_org_time(value):

16
tests/05-dates.org Normal file
View File

@ -0,0 +1,16 @@
#+TITLE: 05-Dates
#+DESCRIPTION: Simple org file
#+TODO: TODO(t) PAUSED(p) | DONE(d)
* Headline properties
:PROPERTIES:
:JUST_DAY: [2020-12-10]
:DAY_AND_WEEKDAY: [2020-12-10 Xov]
:DAY_AND_HOUR: [2020-12-10 Xov 00:02]
:JUST_DAY_TIME_RANGE: [2020-12-10]--[2020-12-11]
:JUST_DAY_TIME_RANGE_NEGATIVE: [2020-12-11]--[2020-12-10]
:DAY_AND_WEEKDAY_TIME_RANGE: [2020-12-10 Xov]--[2020-12-11 Ven]
:DAY_AND_WEEKDAY_TIME_RANGE_NEGATIVE: [2020-12-11 Ven]--[2020-12-10 Xov]
:DAY_AND_HOUR_TIME_RANGE: [2020-12-10 00:02]--[2020-12-11 00:30]
:DAY_AND_HOUR_TIME_RANGE_NEGATIVE: [2020-12-10 00:30]--[2020-12-11 00:02]
:END:

View File

@ -278,3 +278,10 @@ class TestSerde(unittest.TestCase):
self.assertEqual( self.assertEqual(
snippets[1].result, "This is another test\n" + "with two lines too" snippets[1].result, "This is another test\n" + "with two lines too"
) )
def test_mimic_write_file_05(self):
with open(os.path.join(DIR, "05-dates.org")) as f:
orig = f.read()
doc = loads(orig)
self.assertEqual(dumps(doc), orig)