Skip to content

Commit

Permalink
Allow partial dates to be written to non-4.0 vCards for round-tripping
Browse files Browse the repository at this point in the history
  • Loading branch information
mangstadt committed Feb 2, 2025
1 parent 0c7431a commit 3de4d56
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 12 deletions.
16 changes: 10 additions & 6 deletions src/main/java/ezvcard/io/scribe/DateOrTimePropertyScribe.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,22 +88,24 @@ protected VCardDataType _dataType(T property, VCardVersion version) {
@Override
protected String _writeText(T property, WriteContext context) {
VCardVersion version = context.getVersion();
boolean extended = (version == VCardVersion.V3_0);

Temporal date = property.getDate();
if (date != null) {
boolean extended = (version == VCardVersion.V3_0);
return date(date).extended(extended).write();
}

//allow partial dates to be written to non-4.0 vCards for leniency and round-tripping
PartialDate partialDate = property.getPartialDate();
if (partialDate != null) {
return partialDate.toISO8601(extended);
}

if (version == VCardVersion.V4_0) {
String text = property.getText();
if (text != null) {
return VObjectPropertyValues.escape(text);
}

PartialDate partialDate = property.getPartialDate();
if (partialDate != null) {
return partialDate.toISO8601(false);
}
}

return "";
Expand Down Expand Up @@ -222,6 +224,8 @@ private T parse(String value, ParseContext context) {
return newInstance(date(value));
} catch (IllegalArgumentException e) {
try {
//allow partial dates to be parsed from non-4.0 vCards
//https://github.com/mangstadt/ez-vcard/issues/155
return newInstance(PartialDate.parse(value));
} catch (IllegalArgumentException e2) {
if (context.getVersion() == VCardVersion.V2_1 || context.getVersion() == VCardVersion.V3_0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,12 @@ public void writeText() {
sensei.assertWriteText(withDate).versions(V3_0).run(dateExtendedStr);
sensei.assertWriteText(withDateTime).versions(V2_1, V4_0).run(dateTimeStr);
sensei.assertWriteText(withDateTime).versions(V3_0).run(dateTimeExtendedStr);
sensei.assertWriteText(withPartialDate).versions(V2_1, V3_0).run("");
sensei.assertWriteText(withPartialDate).versions(V4_0).run(partialDate.toISO8601(false));
sensei.assertWriteText(withPartialTime).versions(V2_1, V3_0).run("");
sensei.assertWriteText(withPartialTime).versions(V4_0).run(partialTime.toISO8601(false));
sensei.assertWriteText(withPartialDateTime).versions(V2_1, V3_0).run("");
sensei.assertWriteText(withPartialDateTime).versions(V4_0).run(partialDateTime.toISO8601(false));
sensei.assertWriteText(withPartialDate).versions(V2_1, V4_0).run(partialDate.toISO8601(false));
sensei.assertWriteText(withPartialDate).versions(V3_0).run(partialDate.toISO8601(true));
sensei.assertWriteText(withPartialTime).versions(V2_1, V4_0).run(partialTime.toISO8601(false));
sensei.assertWriteText(withPartialTime).versions(V3_0).run(partialTime.toISO8601(true));
sensei.assertWriteText(withPartialDateTime).versions(V2_1, V4_0).run(partialDateTime.toISO8601(false));
sensei.assertWriteText(withPartialDateTime).versions(V3_0).run(partialDateTime.toISO8601(true));
sensei.assertWriteText(withText).versions(V2_1, V3_0).run("");
sensei.assertWriteText(withText).versions(V4_0).run(textEscaped);
sensei.assertWriteText(empty).run("");
Expand Down

0 comments on commit 3de4d56

Please sign in to comment.