Changeset View
Changeset View
Standalone View
Standalone View
src/applications/calendar/parser/data/PhutilCalendarDuration.php
- This file was added.
| <?php | |||||
| final class PhutilCalendarDuration extends Phobject { | |||||
| private $isNegative = false; | |||||
| private $weeks = 0; | |||||
| private $days = 0; | |||||
| private $hours = 0; | |||||
| private $minutes = 0; | |||||
| private $seconds = 0; | |||||
| public static function newFromDictionary(array $dict) { | |||||
| static $keys; | |||||
| if ($keys === null) { | |||||
| $keys = array_fuse( | |||||
| array( | |||||
| 'isNegative', | |||||
| 'weeks', | |||||
| 'days', | |||||
| 'hours', | |||||
| 'minutes', | |||||
| 'seconds', | |||||
| )); | |||||
| } | |||||
| foreach ($dict as $key => $value) { | |||||
| if (!isset($keys[$key])) { | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'Unexpected key "%s" in duration dictionary, expected keys: %s.', | |||||
| $key, | |||||
| implode(', ', array_keys($keys)))); | |||||
| } | |||||
| } | |||||
| $duration = id(new self()) | |||||
| ->setIsNegative(idx($dict, 'isNegative', false)) | |||||
| ->setWeeks(idx($dict, 'weeks', 0)) | |||||
| ->setDays(idx($dict, 'days', 0)) | |||||
| ->setHours(idx($dict, 'hours', 0)) | |||||
| ->setMinutes(idx($dict, 'minutes', 0)) | |||||
| ->setSeconds(idx($dict, 'seconds', 0)); | |||||
| return $duration; | |||||
| } | |||||
| public function toDictionary() { | |||||
| return array( | |||||
| 'isNegative' => $this->getIsNegative(), | |||||
| 'weeks' => $this->getWeeks(), | |||||
| 'days' => $this->getDays(), | |||||
| 'hours' => $this->getHours(), | |||||
| 'minutes' => $this->getMinutes(), | |||||
| 'seconds' => $this->getSeconds(), | |||||
| ); | |||||
| } | |||||
| public static function newFromISO8601($value) { | |||||
| $pattern = | |||||
| '/^'. | |||||
| '(?P<sign>[+-])?'. | |||||
| 'P'. | |||||
| '(?:'. | |||||
| '(?P<W>\d+)W'. | |||||
| '|'. | |||||
| '(?:(?:(?P<D>\d+)D)?'. | |||||
| '(?:T(?:(?P<H>\d+)H)?(?:(?P<M>\d+)M)?(?:(?P<S>\d+)S)?)?'. | |||||
| ')'. | |||||
| ')'. | |||||
| '\z/'; | |||||
| $matches = null; | |||||
| $ok = preg_match($pattern, $value, $matches); | |||||
| if (!$ok) { | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'Expected ISO8601 duration in the format "P12DT3H4M5S", found '. | |||||
| '"%s".', | |||||
| $value)); | |||||
| } | |||||
| $is_negative = (idx($matches, 'sign') == '-'); | |||||
| return id(new self()) | |||||
| ->setIsNegative($is_negative) | |||||
| ->setWeeks((int)idx($matches, 'W', 0)) | |||||
| ->setDays((int)idx($matches, 'D', 0)) | |||||
| ->setHours((int)idx($matches, 'H', 0)) | |||||
| ->setMinutes((int)idx($matches, 'M', 0)) | |||||
| ->setSeconds((int)idx($matches, 'S', 0)); | |||||
| } | |||||
| public function toISO8601() { | |||||
| $parts = array(); | |||||
| $parts[] = 'P'; | |||||
| $weeks = $this->getWeeks(); | |||||
| if ($weeks) { | |||||
| $parts[] = $weeks.'W'; | |||||
| } else { | |||||
| $days = $this->getDays(); | |||||
| if ($days) { | |||||
| $parts[] = $days.'D'; | |||||
| } | |||||
| $parts[] = 'T'; | |||||
| $hours = $this->getHours(); | |||||
| if ($hours) { | |||||
| $parts[] = $hours.'H'; | |||||
| } | |||||
| $minutes = $this->getMinutes(); | |||||
| if ($minutes) { | |||||
| $parts[] = $minutes.'M'; | |||||
| } | |||||
| $seconds = $this->getSeconds(); | |||||
| if ($seconds) { | |||||
| $parts[] = $seconds.'S'; | |||||
| } | |||||
| } | |||||
| return implode('', $parts); | |||||
| } | |||||
| public function setIsNegative($is_negative) { | |||||
| $this->isNegative = $is_negative; | |||||
| return $this; | |||||
| } | |||||
| public function getIsNegative() { | |||||
| return $this->isNegative; | |||||
| } | |||||
| public function setWeeks($weeks) { | |||||
| $this->weeks = $weeks; | |||||
| return $this; | |||||
| } | |||||
| public function getWeeks() { | |||||
| return $this->weeks; | |||||
| } | |||||
| public function setDays($days) { | |||||
| $this->days = $days; | |||||
| return $this; | |||||
| } | |||||
| public function getDays() { | |||||
| return $this->days; | |||||
| } | |||||
| public function setHours($hours) { | |||||
| $this->hours = $hours; | |||||
| return $this; | |||||
| } | |||||
| public function getHours() { | |||||
| return $this->hours; | |||||
| } | |||||
| public function setMinutes($minutes) { | |||||
| $this->minutes = $minutes; | |||||
| return $this; | |||||
| } | |||||
| public function getMinutes() { | |||||
| return $this->minutes; | |||||
| } | |||||
| public function setSeconds($seconds) { | |||||
| $this->seconds = $seconds; | |||||
| return $this; | |||||
| } | |||||
| public function getSeconds() { | |||||
| return $this->seconds; | |||||
| } | |||||
| } | |||||