1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap\Meta\Field; 4*04fd306cSNickeau 5*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 6*04fd306cSNickeauuse ComboStrap\FileSystems; 7*04fd306cSNickeauuse ComboStrap\FirstRasterImage; 8*04fd306cSNickeauuse ComboStrap\MarkupPath; 9*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 10*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataImage; 11*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore; 12*04fd306cSNickeauuse ComboStrap\PageImageUsage; 13*04fd306cSNickeauuse ComboStrap\WikiPath; 14*04fd306cSNickeau 15*04fd306cSNickeau 16*04fd306cSNickeauclass FeaturedRasterImage extends MetadataImage 17*04fd306cSNickeau{ 18*04fd306cSNickeau 19*04fd306cSNickeau 20*04fd306cSNickeau const PROPERTY_NAME = "featured-raster-image"; 21*04fd306cSNickeau const FEATURED_IMAGE_PARSED = "featured-raster-image-parsed"; 22*04fd306cSNickeau 23*04fd306cSNickeau public static function getComboStrapLogo(): WikiPath 24*04fd306cSNickeau { 25*04fd306cSNickeau return WikiPath::createComboResource(":images:apple-touch-icon.png"); 26*04fd306cSNickeau } 27*04fd306cSNickeau 28*04fd306cSNickeau public static function createFromResourcePage(MarkupPath $page): FeaturedRasterImage 29*04fd306cSNickeau { 30*04fd306cSNickeau return (new FeaturedRasterImage())->setResource($page); 31*04fd306cSNickeau } 32*04fd306cSNickeau 33*04fd306cSNickeau static public function getDescription(): string 34*04fd306cSNickeau { 35*04fd306cSNickeau return "A featured image in raster format"; 36*04fd306cSNickeau } 37*04fd306cSNickeau 38*04fd306cSNickeau static public function getLabel(): string 39*04fd306cSNickeau { 40*04fd306cSNickeau return "Featured Raster Image"; 41*04fd306cSNickeau } 42*04fd306cSNickeau 43*04fd306cSNickeau public static function getName(): string 44*04fd306cSNickeau { 45*04fd306cSNickeau return self::PROPERTY_NAME; 46*04fd306cSNickeau } 47*04fd306cSNickeau 48*04fd306cSNickeau static public function getPersistenceType(): string 49*04fd306cSNickeau { 50*04fd306cSNickeau return Metadata::PERSISTENT_METADATA; 51*04fd306cSNickeau } 52*04fd306cSNickeau 53*04fd306cSNickeau public function setFromStoreValueWithoutException($value): Metadata 54*04fd306cSNickeau { 55*04fd306cSNickeau 56*04fd306cSNickeau if ($value === null) { 57*04fd306cSNickeau $pageImages = PageImages::createForPage($this->getResource()) 58*04fd306cSNickeau ->setReadStore($this->getReadStore()) 59*04fd306cSNickeau ->getValueAsPageImages(); 60*04fd306cSNickeau foreach ($pageImages as $pageImage) { 61*04fd306cSNickeau $wikiPath = $pageImage->getImagePath(); 62*04fd306cSNickeau try { 63*04fd306cSNickeau $mime = FileSystems::getMime($wikiPath); 64*04fd306cSNickeau if (!$mime->isSupportedRasterImage()) { 65*04fd306cSNickeau continue; 66*04fd306cSNickeau } 67*04fd306cSNickeau } catch (ExceptionNotFound $e) { 68*04fd306cSNickeau continue; 69*04fd306cSNickeau } 70*04fd306cSNickeau $value = $wikiPath->toAbsoluteId(); 71*04fd306cSNickeau if (in_array(PageImageUsage::ALL, $pageImage->getUsages())) { 72*04fd306cSNickeau break; 73*04fd306cSNickeau } 74*04fd306cSNickeau } 75*04fd306cSNickeau } 76*04fd306cSNickeau return parent::setFromStoreValueWithoutException($value); 77*04fd306cSNickeau 78*04fd306cSNickeau } 79*04fd306cSNickeau 80*04fd306cSNickeau static public function isMutable(): bool 81*04fd306cSNickeau { 82*04fd306cSNickeau return true; 83*04fd306cSNickeau } 84*04fd306cSNickeau 85*04fd306cSNickeau public function getDefaultValue(): WikiPath 86*04fd306cSNickeau { 87*04fd306cSNickeau 88*04fd306cSNickeau /** 89*04fd306cSNickeau * Parsed Feature Images 90*04fd306cSNickeau */ 91*04fd306cSNickeau return $this->getParsedValue(); 92*04fd306cSNickeau 93*04fd306cSNickeau 94*04fd306cSNickeau } 95*04fd306cSNickeau 96*04fd306cSNickeau public function setParsedValue(string $path = null): FeaturedRasterImage 97*04fd306cSNickeau { 98*04fd306cSNickeau $store = $this->getWriteStore(); 99*04fd306cSNickeau if ($store instanceof MetadataDokuWikiStore) { 100*04fd306cSNickeau $store->setFromPersistentName(self::FEATURED_IMAGE_PARSED, $path); 101*04fd306cSNickeau } 102*04fd306cSNickeau return $this; 103*04fd306cSNickeau } 104*04fd306cSNickeau 105*04fd306cSNickeau /** 106*04fd306cSNickeau * @throws ExceptionNotFound 107*04fd306cSNickeau */ 108*04fd306cSNickeau public function getValueOrParsed(): WikiPath 109*04fd306cSNickeau { 110*04fd306cSNickeau try { 111*04fd306cSNickeau return $this->getValue(); 112*04fd306cSNickeau } catch (ExceptionNotFound $e) { 113*04fd306cSNickeau return $this->getParsedValue(); 114*04fd306cSNickeau } 115*04fd306cSNickeau } 116*04fd306cSNickeau 117*04fd306cSNickeau /** 118*04fd306cSNickeau * @throws ExceptionNotFound 119*04fd306cSNickeau */ 120*04fd306cSNickeau private function getParsedValue(): WikiPath 121*04fd306cSNickeau { 122*04fd306cSNickeau /** 123*04fd306cSNickeau * @var MarkupPath $markupPath 124*04fd306cSNickeau */ 125*04fd306cSNickeau $markupPath = $this->getResource(); 126*04fd306cSNickeau $isIndex = $markupPath->isIndexPage(); 127*04fd306cSNickeau if ($isIndex) { 128*04fd306cSNickeau $parsedValue = $this->getReadStore()->getFromName(FirstRasterImage::PROPERTY_NAME); 129*04fd306cSNickeau } else { 130*04fd306cSNickeau $parsedValue = $this->getReadStore()->getFromName(self::FEATURED_IMAGE_PARSED); 131*04fd306cSNickeau } 132*04fd306cSNickeau if ($parsedValue === null) { 133*04fd306cSNickeau throw new ExceptionNotFound(); 134*04fd306cSNickeau } 135*04fd306cSNickeau return WikiPath::createMediaPathFromPath($parsedValue); 136*04fd306cSNickeau 137*04fd306cSNickeau } 138*04fd306cSNickeau 139*04fd306cSNickeau static public function getDrive(): string 140*04fd306cSNickeau { 141*04fd306cSNickeau return WikiPath::MEDIA_DRIVE; 142*04fd306cSNickeau } 143*04fd306cSNickeau 144*04fd306cSNickeau static public function isOnForm(): bool 145*04fd306cSNickeau { 146*04fd306cSNickeau return true; 147*04fd306cSNickeau } 148*04fd306cSNickeau 149*04fd306cSNickeau public static function getCanonical(): string 150*04fd306cSNickeau { 151*04fd306cSNickeau return FeaturedImage::getCanonical(); 152*04fd306cSNickeau } 153*04fd306cSNickeau 154*04fd306cSNickeau 155*04fd306cSNickeau} 156