xref: /plugin/combo/ComboStrap/Meta/Field/FeaturedRasterImage.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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