From 3de4d56527f7160de1b1e05fba2f4dce2466c243 Mon Sep 17 00:00:00 2001 From: Mike Angstadt Date: Sun, 2 Feb 2025 09:02:24 -0500 Subject: [PATCH] Allow partial dates to be written to non-4.0 vCards for round-tripping https://github.com/mangstadt/ez-vcard/issues/155 --- .../io/scribe/DateOrTimePropertyScribe.java | 16 ++++++++++------ .../io/scribe/DateOrTimePropertyScribeTest.java | 12 ++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/ezvcard/io/scribe/DateOrTimePropertyScribe.java b/src/main/java/ezvcard/io/scribe/DateOrTimePropertyScribe.java index 6a71ad3c..40aa3206 100644 --- a/src/main/java/ezvcard/io/scribe/DateOrTimePropertyScribe.java +++ b/src/main/java/ezvcard/io/scribe/DateOrTimePropertyScribe.java @@ -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 ""; @@ -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) { diff --git a/src/test/java/ezvcard/io/scribe/DateOrTimePropertyScribeTest.java b/src/test/java/ezvcard/io/scribe/DateOrTimePropertyScribeTest.java index b03726ac..ad259a3d 100644 --- a/src/test/java/ezvcard/io/scribe/DateOrTimePropertyScribeTest.java +++ b/src/test/java/ezvcard/io/scribe/DateOrTimePropertyScribeTest.java @@ -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("");