diff --git a/lib/core/note_serializer.dart b/lib/core/note_serializer.dart index 96cbe7e2..e80aaf7d 100644 --- a/lib/core/note_serializer.dart +++ b/lib/core/note_serializer.dart @@ -33,6 +33,11 @@ abstract class NoteSerializerInterface { var emojiParser = EmojiParser(); +enum DateFormat { + Iso8601, + UnixTimeStamp, +} + class NoteSerializationSettings { String modifiedKey = "modified"; String createdKey = "created"; @@ -45,11 +50,16 @@ class NoteSerializationSettings { SettingsTitle titleSettings = SettingsTitle.Default; + var modifiedFormat = DateFormat.Iso8601; + var createdFormat = DateFormat.Iso8601; + NoteSerializationSettings.fromConfig(NotesFolderConfig config) { modifiedKey = config.yamlModifiedKey; createdKey = config.yamlCreatedKey; tagsKey = config.yamlTagsKey; titleSettings = config.titleSettings; + + // FIXME: modified / created format! } NoteSerializationSettings(); } @@ -65,13 +75,27 @@ class NoteSerializer implements NoteSerializerInterface { data.body = emojiParser.unemojify(note.body); if (note.created != null) { - data.props[settings.createdKey] = toIso8601WithTimezone(note.created!); + switch (settings.createdFormat) { + case DateFormat.Iso8601: + data.props[settings.createdKey] = + toIso8601WithTimezone(note.created!); + break; + case DateFormat.UnixTimeStamp: + data.props[settings.createdKey] = toUnixTimeStamp(note.created!); + } } else { data.props.remove(settings.createdKey); } if (note.modified != null) { - data.props[settings.modifiedKey] = toIso8601WithTimezone(note.modified!); + switch (settings.modifiedFormat) { + case DateFormat.Iso8601: + data.props[settings.modifiedKey] = + toIso8601WithTimezone(note.modified!); + break; + case DateFormat.UnixTimeStamp: + data.props[settings.modifiedKey] = toUnixTimeStamp(note.modified!); + } } else { data.props.remove(settings.modifiedKey); } @@ -135,7 +159,13 @@ class NoteSerializer implements NoteSerializerInterface { for (var possibleKey in modifiedKeyOptions) { var val = data.props[possibleKey]; if (val != null) { - note.modified = parseDateTime(val.toString()); + if (val is int) { + note.modified = parseUnixTimeStamp(val); + settings.modifiedFormat = DateFormat.UnixTimeStamp; + } else { + note.modified = parseDateTime(val.toString()); + settings.modifiedFormat = DateFormat.Iso8601; + } settings.modifiedKey = possibleKey; propsUsed.add(possibleKey); @@ -152,7 +182,13 @@ class NoteSerializer implements NoteSerializerInterface { for (var possibleKey in createdKeyOptions) { var val = data.props[possibleKey]; if (val != null) { - note.created = parseDateTime(val.toString()); + if (val is int) { + note.created = parseUnixTimeStamp(val); + settings.createdFormat = DateFormat.UnixTimeStamp; + } else { + note.created = parseDateTime(val.toString()); + settings.createdFormat = DateFormat.Iso8601; + } settings.createdKey = possibleKey; propsUsed.add(possibleKey); diff --git a/lib/utils/datetime.dart b/lib/utils/datetime.dart index d6505bb8..cce46a33 100644 --- a/lib/utils/datetime.dart +++ b/lib/utils/datetime.dart @@ -80,3 +80,11 @@ DateTime? parseDateTime(String str) { return dt; } + +DateTime parseUnixTimeStamp(int val) { + return DateTime.fromMillisecondsSinceEpoch(val * 1000, isUtc: true); +} + +int toUnixTimeStamp(DateTime dt) { + return dt.toUtc().millisecondsSinceEpoch ~/ 1000; +} diff --git a/test/note_test.dart b/test/note_test.dart index d525f312..305baf7b 100644 --- a/test/note_test.dart +++ b/test/note_test.dart @@ -253,12 +253,12 @@ Hello expect(note.created, DateTime.parse('2021-07-14T10:14:49Z')); note.modified = DateTime.parse('2020-07-14T10:14:49Z'); - note.created = DateTime.parse('2020-06-14T10:14:49Z'); + note.created = DateTime.parse('2020-06-13T10:14:49Z'); var expectedContent = """--- bar: Foo -updated: 1626257689 -created: 1626257689 +updated: 1594721689 +created: 1592043289 --- Hello @@ -268,6 +268,6 @@ Hello var actualContent = File(notePath).readAsStringSync(); expect(actualContent, equals(expectedContent)); - }, skip: true); + }); }); }