xref: /plugin/combo/ComboStrap/Meta/Field/SocialCardImage.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\ResourceCombo;
14*04fd306cSNickeauuse ComboStrap\Site;
15*04fd306cSNickeauuse ComboStrap\WikiPath;
16*04fd306cSNickeau
17*04fd306cSNickeau/**
18*04fd306cSNickeau * A field that derived the featured image for social network
19*04fd306cSNickeau *
20*04fd306cSNickeau * (The featured image for a html page may be a svg
21*04fd306cSNickeau * while for a social network, it should not)
22*04fd306cSNickeau *
23*04fd306cSNickeau * This meta returns the first raster image found.
24*04fd306cSNickeau */
25*04fd306cSNickeauclass SocialCardImage extends MetadataImage
26*04fd306cSNickeau{
27*04fd306cSNickeau
28*04fd306cSNickeau
29*04fd306cSNickeau    const PROPERTY_NAME = "social-card-image";
30*04fd306cSNickeau
31*04fd306cSNickeau    public static function createFromResourcePage(MarkupPath $page): SocialCardImage
32*04fd306cSNickeau    {
33*04fd306cSNickeau        return (new SocialCardImage())->setResource($page);
34*04fd306cSNickeau    }
35*04fd306cSNickeau
36*04fd306cSNickeau    static public function getDescription(): string
37*04fd306cSNickeau    {
38*04fd306cSNickeau        return "The image for social card";
39*04fd306cSNickeau    }
40*04fd306cSNickeau
41*04fd306cSNickeau    static public function getLabel(): string
42*04fd306cSNickeau    {
43*04fd306cSNickeau        return "Social Card Image";
44*04fd306cSNickeau    }
45*04fd306cSNickeau
46*04fd306cSNickeau    public static function getName(): string
47*04fd306cSNickeau    {
48*04fd306cSNickeau        return self::PROPERTY_NAME;
49*04fd306cSNickeau    }
50*04fd306cSNickeau
51*04fd306cSNickeau    static public function getPersistenceType(): string
52*04fd306cSNickeau    {
53*04fd306cSNickeau        return Metadata::DERIVED_METADATA;
54*04fd306cSNickeau    }
55*04fd306cSNickeau
56*04fd306cSNickeau
57*04fd306cSNickeau    static public function isMutable(): bool
58*04fd306cSNickeau    {
59*04fd306cSNickeau        return false;
60*04fd306cSNickeau    }
61*04fd306cSNickeau
62*04fd306cSNickeau    public function getValue(): WikiPath
63*04fd306cSNickeau    {
64*04fd306cSNickeau
65*04fd306cSNickeau        $contextPage = $this->getResource();
66*04fd306cSNickeau        $actual = $contextPage;
67*04fd306cSNickeau        while (true) {
68*04fd306cSNickeau            try {
69*04fd306cSNickeau                return $this->getFeaturedRasterImageOrFirst($actual);
70*04fd306cSNickeau            } catch (ExceptionNotFound $e) {
71*04fd306cSNickeau                // ok, vignette ?
72*04fd306cSNickeau            }
73*04fd306cSNickeau            try {
74*04fd306cSNickeau                $actual = $actual->getParent();
75*04fd306cSNickeau            } catch (ExceptionNotFound $e) {
76*04fd306cSNickeau                break;
77*04fd306cSNickeau            }
78*04fd306cSNickeau        }
79*04fd306cSNickeau        try {
80*04fd306cSNickeau            return Site::getLogoAsRasterImage()->getSourcePath();
81*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
82*04fd306cSNickeau            return FeaturedRasterImage::getComboStrapLogo();
83*04fd306cSNickeau        }
84*04fd306cSNickeau
85*04fd306cSNickeau    }
86*04fd306cSNickeau
87*04fd306cSNickeau    /**
88*04fd306cSNickeau     * @throws ExceptionNotFound
89*04fd306cSNickeau     */
90*04fd306cSNickeau    private function getFeaturedRasterImageOrFirst(ResourceCombo $contextPage): WikiPath
91*04fd306cSNickeau    {
92*04fd306cSNickeau        $featuredRasterImage = FeaturedRasterImage::createFromResourcePage($contextPage);
93*04fd306cSNickeau        try {
94*04fd306cSNickeau            return $featuredRasterImage->getValueOrParsed();
95*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
96*04fd306cSNickeau            return FirstRasterImage::createForPage($contextPage)->getValue();
97*04fd306cSNickeau        }
98*04fd306cSNickeau    }
99*04fd306cSNickeau
100*04fd306cSNickeau    static public function getDrive(): string
101*04fd306cSNickeau    {
102*04fd306cSNickeau        return WikiPath::MEDIA_DRIVE;
103*04fd306cSNickeau    }
104*04fd306cSNickeau
105*04fd306cSNickeau}
106