diff options
Diffstat (limited to 'fusonic/opengraph/src/Objects/ObjectBase.php')
-rw-r--r-- | fusonic/opengraph/src/Objects/ObjectBase.php | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/fusonic/opengraph/src/Objects/ObjectBase.php b/fusonic/opengraph/src/Objects/ObjectBase.php new file mode 100644 index 00000000..33b9976d --- /dev/null +++ b/fusonic/opengraph/src/Objects/ObjectBase.php @@ -0,0 +1,358 @@ +<?php + +namespace Fusonic\OpenGraph\Objects; + +use DateTimeImmutable; +use Fusonic\OpenGraph\Elements\Audio; +use Fusonic\OpenGraph\Elements\Image; +use Fusonic\OpenGraph\Elements\Video; +use Fusonic\OpenGraph\Property; +use UnexpectedValueException; + +/** + * Abstract base class for all Open Graph objects (website, video, ...) + */ +abstract class ObjectBase +{ + /** + * An array of audio resources attached to the object. + * + * @var Audio[] + */ + public array $audios = []; + + /** + * A short description of the object. + */ + public ?string $description = null; + + /** + * The word that appears before the object's title in a sentence. This is an list of words from 'a', 'an', 'the', + * ' "" ', or 'auto'. If 'auto' is chosen, the consumer of the object will chose between 'a' or 'an'. The default is + * the blank, "". + */ + public ?string $determiner = null; + + /** + * An array of images attached to the object. + * + * @var Image[] + */ + public array $images = []; + + /** + * The locale that the object's tags are marked up in, in the format language_TERRITORY. + */ + public ?string $locale = null; + + /** + * An array of alternate locales in which the resource is available. + * + * @var string[] + */ + public array $localeAlternate = []; + + public ?bool $richAttachment = null; + + /** + * An array of URLs of related resources. + * + * @var string[] + */ + public array $seeAlso = []; + + /** + * The name of the web site upon which the object resides. + */ + public ?string $siteName = null; + + /** + * The title of the object as it should appear in the graph. + */ + public ?string $title = null; + + /** + * The type of the object, such as 'article'. + */ + public ?string $type = null; + + /** + * The time when the object was last updated. + */ + public ?DateTimeImmutable $updatedTime = null; + + /** + * The canonical URL of the object, used as its ID in the graph. + */ + public ?string $url = null; + + /** + * An array of videos attached to the object. + * + * @var Video[] + */ + public array $videos = []; + + public function __construct() + { + } + + /** + * Assigns all properties given to the this Object instance. + * + * @param array|Property[] $properties Array of all properties to assign. + * @param bool $debug Throw exceptions when parsing or not. + * + * @throws UnexpectedValueException + */ + public function assignProperties(array $properties, $debug = false): void + { + foreach ($properties as $property) { + $name = $property->key; + $value = $property->value; + + switch($name) { + case Property::AUDIO: + case Property::AUDIO_URL: + $this->audios[] = new Audio($value); + break; + case Property::AUDIO_SECURE_URL: + case Property::AUDIO_TYPE: + if (count($this->audios) > 0) { + $this->handleAudioAttribute($this->audios[count($this->audios) - 1], $name, $value); + } elseif ($debug) { + throw new UnexpectedValueException( + sprintf( + "Found '%s' property but no audio was found before.", + $name + ) + ); + } + break; + case Property::DESCRIPTION: + if ($this->description === null) { + $this->description = $value; + } + break; + case Property::DETERMINER: + if ($this->determiner === null) { + $this->determiner = $value; + } + break; + case Property::IMAGE: + case Property::IMAGE_URL: + $this->images[] = new Image($value); + break; + case Property::IMAGE_HEIGHT: + case Property::IMAGE_SECURE_URL: + case Property::IMAGE_TYPE: + case Property::IMAGE_WIDTH: + case Property::IMAGE_USER_GENERATED: + if (count($this->images) > 0) { + $this->handleImageAttribute($this->images[count($this->images) - 1], $name, $value); + } elseif ($debug) { + throw new UnexpectedValueException( + sprintf( + "Found '%s' property but no image was found before.", + $name + ) + ); + } + break; + case Property::LOCALE: + if ($this->locale === null) { + $this->locale = $value; + } + break; + case Property::LOCALE_ALTERNATE: + $this->localeAlternate[] = $value; + break; + case Property::RICH_ATTACHMENT: + $this->richAttachment = $this->convertToBoolean($value); + break; + case Property::SEE_ALSO: + $this->seeAlso[] = $value; + break; + case Property::SITE_NAME: + if ($this->siteName === null) { + $this->siteName = $value; + } + break; + case Property::TITLE: + if ($this->title === null) { + $this->title = $value; + } + break; + case Property::UPDATED_TIME: + if ($this->updatedTime === null) { + $this->updatedTime = $this->convertToDateTime($value); + } + break; + case Property::URL: + if ($this->url === null) { + $this->url = $value; + } + break; + case Property::VIDEO: + case Property::VIDEO_URL: + $this->videos[] = new Video($value); + break; + case Property::VIDEO_HEIGHT: + case Property::VIDEO_SECURE_URL: + case Property::VIDEO_TYPE: + case Property::VIDEO_WIDTH: + if (count($this->videos) > 0) { + $this->handleVideoAttribute($this->videos[count($this->videos) - 1], $name, $value); + } elseif ($debug) { + throw new UnexpectedValueException(sprintf( + "Found '%s' property but no video was found before.", + $name + )); + } + } + } + } + + private function handleImageAttribute(Image $element, string $name, string $value): void + { + switch($name) + { + case Property::IMAGE_HEIGHT: + $element->height = (int)$value; + break; + case Property::IMAGE_WIDTH: + $element->width = (int)$value; + break; + case Property::IMAGE_TYPE: + $element->type = $value; + break; + case Property::IMAGE_SECURE_URL: + $element->secureUrl = $value; + break; + case Property::IMAGE_USER_GENERATED: + $element->userGenerated = $this->convertToBoolean($value); + break; + } + } + + private function handleVideoAttribute(Video $element, string $name, string $value): void + { + switch($name) + { + case Property::VIDEO_HEIGHT: + $element->height = (int)$value; + break; + case Property::VIDEO_WIDTH: + $element->width = (int)$value; + break; + case Property::VIDEO_TYPE: + $element->type = $value; + break; + case Property::VIDEO_SECURE_URL: + $element->secureUrl = $value; + break; + } + } + + private function handleAudioAttribute(Audio $element, string $name, string $value): void + { + switch($name) + { + case Property::AUDIO_TYPE: + $element->type = $value; + break; + case Property::AUDIO_SECURE_URL: + $element->secureUrl = $value; + break; + } + } + + protected function convertToDateTime(string $value): ?DateTimeImmutable + { + try { + return new DateTimeImmutable($value); + } catch (\Exception $e) { + return null; + } + } + + protected function convertToBoolean(string $value): bool + { + switch(strtolower($value)) + { + case "1": + case "true": + return true; + default: + return false; + } + } + + /** + * Gets all properties set on this object. + * + * @return Property[] + */ + public function getProperties(): array + { + $properties = []; + + foreach ($this->audios as $audio) { + $properties = array_merge($properties, $audio->getProperties()); + } + + if ($this->title !== null) { + $properties[] = new Property(Property::TITLE, $this->title); + } + + if ($this->description !== null) { + $properties[] = new Property(Property::DESCRIPTION, $this->description); + } + + if ($this->determiner !== null) { + $properties[] = new Property(Property::DETERMINER, $this->determiner); + } + + foreach ($this->images as $image) { + $properties = array_merge($properties, $image->getProperties()); + } + + if ($this->locale !== null) { + $properties[] = new Property(Property::LOCALE, $this->locale); + } + + foreach ($this->localeAlternate as $locale) { + $properties[] = new Property(Property::LOCALE_ALTERNATE, $locale); + } + + if ($this->richAttachment !== null) { + $properties[] = new Property(Property::RICH_ATTACHMENT, (int)$this->richAttachment); + } + + foreach ($this->seeAlso as $seeAlso) { + $properties[] = new Property(Property::SEE_ALSO, $seeAlso); + } + + if ($this->siteName !== null) { + $properties[] = new Property(Property::SITE_NAME, $this->siteName); + } + + if ($this->type !== null) { + $properties[] = new Property(Property::TYPE, $this->type); + } + + if ($this->updatedTime !== null) { + $properties[] = new Property(Property::UPDATED_TIME, $this->updatedTime->format("c")); + } + + if ($this->url !== null) { + $properties[] = new Property(Property::URL, $this->url); + } + + foreach ($this->videos as $video) { + $properties = array_merge($properties, $video->getProperties()); + } + + return $properties; + } +} |