%s: %s

'; /** * https://www.kanzaki.com/docs/ical/summary.html * * @var string */ public $summary; /** * https://www.kanzaki.com/docs/ical/dtstart.html * * @var string */ public $dtstart; /** * https://www.kanzaki.com/docs/ical/dtend.html * * @var string */ public $dtend; /** * https://www.kanzaki.com/docs/ical/duration.html * * @var string */ public $duration; /** * https://www.kanzaki.com/docs/ical/dtstamp.html * * @var string */ public $dtstamp; /** * When the event starts, represented as a timezone-adjusted string * * @var string */ public $dtstart_tz; /** * When the event ends, represented as a timezone-adjusted string * * @var string */ public $dtend_tz; /** * https://www.kanzaki.com/docs/ical/uid.html * * @var string */ public $uid; /** * https://www.kanzaki.com/docs/ical/created.html * * @var string */ public $created; /** * https://www.kanzaki.com/docs/ical/lastModified.html * * @var string */ public $last_modified; /** * https://www.kanzaki.com/docs/ical/description.html * * @var string */ public $description; /** * https://www.kanzaki.com/docs/ical/location.html * * @var string */ public $location; /** * https://www.kanzaki.com/docs/ical/sequence.html * * @var string */ public $sequence; /** * https://www.kanzaki.com/docs/ical/status.html * * @var string */ public $status; /** * https://www.kanzaki.com/docs/ical/transp.html * * @var string */ public $transp; /** * https://www.kanzaki.com/docs/ical/organizer.html * * @var string */ public $organizer; /** * https://www.kanzaki.com/docs/ical/attendee.html * * @var string */ public $attendee; /** * Manage additional properties * * @var array */ private $additionalProperties = array(); /** * Creates the Event object * * @param array $data * @return void */ public function __construct(array $data = array()) { foreach ($data as $key => $value) { $variable = self::snakeCase($key); if (property_exists($this, $variable)) { $this->{$variable} = $this->prepareData($value); } else { $this->additionalProperties[$variable] = $this->prepareData($value); } } } /** * Magic getter method * * @param string $additionalPropertyName * @return mixed */ public function __get(string $additionalPropertyName) { if (array_key_exists($additionalPropertyName, $this->additionalProperties)) { return $this->additionalProperties[$additionalPropertyName]; } return null; } /** * Magic isset method */ public function __isset(string $name): bool { return is_null($this->$name) === false; } /** * Prepares the data for output * * @param mixed $value * @return mixed */ protected function prepareData($value) { if (is_string($value)) { return stripslashes(trim(str_replace('\n', "\n", $value))); } if (is_array($value)) { return array_map(function ($value) { return $this->prepareData($value); }, $value); } return $value; } /** * Returns Event data excluding anything blank * within an HTML template * * @param string $html HTML template to use * @return string */ public function printData($html = self::HTML_TEMPLATE) { $data = array( 'SUMMARY' => $this->summary, 'DTSTART' => $this->dtstart, 'DTEND' => $this->dtend, 'DTSTART_TZ' => $this->dtstart_tz, 'DTEND_TZ' => $this->dtend_tz, 'DURATION' => $this->duration, 'DTSTAMP' => $this->dtstamp, 'UID' => $this->uid, 'CREATED' => $this->created, 'LAST-MODIFIED' => $this->last_modified, 'DESCRIPTION' => $this->description, 'LOCATION' => $this->location, 'SEQUENCE' => $this->sequence, 'STATUS' => $this->status, 'TRANSP' => $this->transp, 'ORGANISER' => $this->organizer, 'ATTENDEE(S)' => $this->attendee, ); // Remove any blank values $data = array_filter($data); $output = ''; foreach ($data as $key => $value) { $output .= sprintf($html, $key, $value); } return $output; } /** * Converts the given input to snake_case * * @param string $input * @param string $glue * @param string $separator * @return string */ protected static function snakeCase($input, $glue = '_', $separator = '-') { $input = preg_split('/(?<=[a-z])(?=[A-Z])/x', $input); $input = implode($glue, $input); $input = str_replace($separator, $glue, $input); return strtolower($input); } }