The patch derives the item type (appointment or event) from the DTSTART
value type. It is then used to perform an extended check of date/time
values and reject non-conformant import files (like those reported in
Github issues #81, (calcurse) events.
The patch includes parsing and code corrections and minor refactoring.
Background:
Ical events are of two types, in calcurse called appointments and
events. RFC 5545 has no distinguishing names for them, but describes
them in section 3.6.1. The event type is derived from the value type of
the DTSTART property. The value type may be either DATE-TIME
(appointment) or DATE (event). If not specified by a VALUE property
parameter in DTSTART, the default value type is DATE-TIME. The value
type must be set explicitly to DATE to get an event. Other properties
and rrule parts must agree with the DTSTART value type (DTEND, DURATION,
EXDATE and UNTIL).
Previously the type of an imported event was derived from the format of
the DTSTART value. The DTSTART value type was not taken into account
when importing, and not specified for recurring events when exporting
(commit 0114289 solved it for events, see GitHub PR #97).
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
117 lines
2.3 KiB
Plaintext
117 lines
2.3 KiB
Plaintext
BEGIN:VCALENDAR
|
|
VERSION:2.0
|
|
BEGIN:VEVENT
|
|
DTSTART:20200318T084100
|
|
DURATION:PT1H30M0S
|
|
SUMMARY:A simple appointment
|
|
END:VEVENT
|
|
BEGIN:VTODO
|
|
PRIORITY:1
|
|
SUMMARY:A simple todo
|
|
END:VTODO
|
|
BEGIN:VEVENT
|
|
DTSTART:
|
|
DURATION:PT1H30M0S
|
|
SUMMARY:missing start time
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART:20200318T084100
|
|
DURATION:PT1H30M0S
|
|
RRULE:FREQ=HOURLY;INTERVAL=2;UNTIL=20200401T000000
|
|
SUMMARY:unsupported frequency
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART:20200318T084100
|
|
DURATION:PT1H30M0S
|
|
SUMMARY malformed summary line
|
|
END:VEVENT
|
|
BEGIN:VTODO
|
|
PRIORITY:10
|
|
SUMMARY:invalid priority
|
|
END:VTODO
|
|
BEGIN:VEVENT
|
|
DTSTART:20200318T084100
|
|
DURATION:PT1H30M0S
|
|
RRULE:FREQ=DAILY;INTERVAL=2;UNTIL=20200401T000000
|
|
EXDATE 20200324T084100
|
|
SUMMARY:malformed exceptions line
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART:20200318T084100
|
|
DURATION:PT1H30M0S
|
|
SUMMARY:Summary with more than\none line
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART:20200318T084100
|
|
DURATION:PT1H30M0S
|
|
SUMMARY:malformed description line
|
|
DESCRIPTION something is missing
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART:20200318T084100
|
|
DURATION:PT1H30M0S
|
|
SUMMARY:malformed description
|
|
DESCRIPTION:description with an unescaped semicolon (;)
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART:20200318T084100
|
|
DURATION:PT1H30M0S
|
|
SUMMARY:empty DESCRIPTION
|
|
DESCRIPTION:
|
|
END:VEVENT
|
|
BEGIN:VTODO
|
|
PRIORITY:1
|
|
SUMMARY:an unescaped comma: ,
|
|
END:VTODO
|
|
BEGIN:VEVENT
|
|
DTSTART:20200406T221300
|
|
DURATION:PT0H15M0S
|
|
SUMMARY:Invalid STATUS
|
|
STATUS:confirmed
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART:20200406T221300
|
|
DURATION:PT0H15M0S
|
|
SUMMARY:LOCATION twice
|
|
LOCATION:first
|
|
LOCATION:second
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART;VALUE=DATE:20200406
|
|
DURATION:PT0H15M0S
|
|
SUMMARY:Invalid duration (must be days or weeks)
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART:20200406
|
|
DURATION:P1D
|
|
SUMMARY:Invalid DTSTART value type
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART;VALUE=DATE:20200406
|
|
SUMMARY:Invalid DTEND value type
|
|
DTEND:20200407
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART;VALUE=DATE:20200406
|
|
DURATION:P1D
|
|
RRULE:FREQ=MONTHLY;UNTIL=20201030T120000Z
|
|
SUMMARY:Invalid UNTIL value
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART;VALUE=DATE:20200406
|
|
DURATION:P1D
|
|
RRULE:FREQ=MONTHLY;UNTIL=20201030
|
|
EXDATE:20200606
|
|
SUMMARY:Invalid EXDATE value type
|
|
END:VEVENT
|
|
BEGIN:VEVENT
|
|
DTSTART;VALUE=DATE:20200406
|
|
DURATION:P1D
|
|
RRULE:FREQ=MONTHLY;UNTIL=20201030
|
|
EXDATE;VALUE=DATE:20200606T120000Z
|
|
SUMMARY:Invalid EXDATE value
|
|
END:VEVENT
|
|
BEGIN:VTODO
|
|
SUMMARY:finally\, missing end of item
|
|
END:VCALENDAR
|