Release Notes: v2.1.0
TL;DR: no upgrade steps, the public API is unchanged. Headline additions are guests and separate start/end timezones. ICS files carrying a timezone now name it with a TZID and ship a VTIMEZONE. Subclassing a generator? Read the last section.
New Features
- Guests (attendees):
Link::guest()/Link::guests(), required and optional roles, rendered asadd(Google),inv_list(Yahoo),to/cc(Outlook),ATTENDEE(ICS) (#229, #237) - Separate start and end timezones, for flights (#233, #246, #249)
- ICS
TRANSP,CLASS,RRULE,X-MICROSOFT-CDO-BUSYSTATUS,DTSTAMPvia the options array (#230) (#244) - ICS extension points:
additionalCalendarProperties(),additionalEventProperties()(#242, #247)
Changed
- ICS files carry a
VTIMEZONEfor everyTZIDthey name, without which older Outlook desktop shifts the event (#249) - A recurring event in a zone that moves its clocks is written as a local time with a
TZID, not a UTC instant, which used to put every occurrence past a DST change an hour off (#254) - Zones naming no place (
+02:00,CEST, POSIX rule sets, all ofEtc/) are written in UTC (#248) - ICS
REMINDERandformatare validated instead of silently falling back, so['format' => 'FILE']no longer returns a link where a file was asked for (#254) - Generators are easier to extend: four escaping helpers are now
protected,Google/YahooreadBASE_URLlate statically (#242) - A
falseURL parameter renders as&key, not&key=
Bug Fixes
- ICS values could inject calendar properties through
UID,PRODID,URL,RRULE, the enumerated options, andATTENDEEaddresses assigned straight toLink::$guests(#245, #254) - RFC 5545 gaps: long lines are folded without splitting a multibyte character, the file ends with CRLF, the data URI declares
charset=utf-8, invalid control characters are dropped (#250) - ICS event properties landed after
VALARM(#247) VTIMEZONEstopped at the year it described. The last change of each kind now carries a yearly rule where the zone repeats predictably (#254)- All-day events across timezones gained or lost a day (#237)
- Yahoo deep link parameters: no more stale
view=d&type=20, wall clockST/ET,DUR=alldayfor single days, exclusiveETfor multi-day (#232) - Attendee escaping: a
CAL-ADDRESSis a URI, not TEXT. Unusable guest addresses are rejected (#229) - A description or address of
'0'is no longer dropped as empty
Notes for subclasses
The public API is unchanged, but three changes reach a subclass. The first two are fatal at load time:
Ics::$presentationOptionsis now typedarray. Redeclaring it untyped raisesType of Sub::$presentationOptions must be array. Drop the redeclaration or type it to match.Ics::generateAlertComponent(),Yahoo::sanitizeText(),Yahoo::sanitizeAddressList()andBaseOutlook::sanitizeString()wentprivatetoprotected. A same-namedprivatemethod raisesAccess level to Sub::sanitizeText() must be protected or weaker. Widen it.Yahoo::BASE_URLdroppedview=d&type=20, so a subclass building its own URL from the constant gets the shorter value.
Made by @alies-dev and the community.
Full Changelog: 2.0.1...2.1.0