Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
97.30% covered (success)
97.30%
36 / 37
88.89% covered (warning)
88.89%
8 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
Image
97.30% covered (success)
97.30%
36 / 37
88.89% covered (warning)
88.89%
8 / 9
21
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 getSource
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getLink
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getContentLength
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getImageAuthorAttributionString
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
3
 getCopyrightString
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 getLicenseString
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
4
 getFluentAttribution
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
4
 getMetadataArray
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3namespace Hyde\Framework\Models;
4
5use Hyde\Framework\Actions\FindsContentLengthForImageObject;
6use Hyde\Framework\Hyde;
7
8/**
9 * Holds the information for an image.
10 */
11class Image
12{
13    // Core properties
14
15    /**
16     * The image's path (if it is stored locally).
17     * Example: _media/image.jpg.
18     *
19     * @var string|null
20     */
21    public ?string $path;
22
23    /**
24     * The image's URI (if stored externally).
25     * Example: https://example.com/media/image.jpg.
26     *
27     * Will override the path property if both are set.
28     *
29     * @var string|null
30     */
31    public ?string $uri;
32
33    /**
34     * The image's description. (Used for alt text for screen readers.)
35     * You should always set this to provide accessibility.
36     * Example: "This is an image of a cat sitting in a basket.".
37     *
38     * @var string|null
39     */
40    public ?string $description;
41
42    /**
43     * The image's title. (Shows a tooltip on hover.)
44     * Example: "My Cat Archer".
45     *
46     * @var string|null
47     */
48    public ?string $title;
49
50    // Extra metadata
51
52    /**
53     * The image's copyright.
54     * Example: "Copyright (c) 2020 John Doe".
55     *
56     * @var string|null
57     */
58    public ?string $copyright;
59
60    /**
61     * The image's license name.
62     * Example: "CC BY-NC-SA 4.0".
63     *
64     * @var string|null
65     */
66    public ?string $license;
67
68    /**
69     * The image's license URL.
70     * Example: "https://creativecommons.org/licenses/by-nc-sa/4.0/".
71     *
72     * @var string|null
73     */
74    public ?string $licenseUrl;
75
76    /**
77     * The image's author.
78     * Example: "John Doe".
79     *
80     * @var string|null
81     */
82    public ?string $author;
83
84    /**
85     * The image's source (for attribution).
86     * Example: "https://unsplash.com/photos/example".
87     *
88     * @var string|null
89     */
90    public ?string $credit = null;
91
92    public function __construct(array $data = [])
93    {
94        foreach ($data as $key => $value) {
95            $this->{$key} = $value;
96        }
97    }
98
99    public function getSource(): ?string
100    {
101        return $this->uri ?? $this->path ?? null;
102    }
103
104    public function getLink(?string $currentPage = ''): string
105    {
106        return Hyde::image($this->getSource() ?? '', $currentPage);
107    }
108
109    public function getContentLength(): int
110    {
111        return (new FindsContentLengthForImageObject($this))->execute();
112    }
113
114    public function getImageAuthorAttributionString(): ?string
115    {
116        if (isset($this->author)) {
117            if (isset($this->credit)) {
118                return '<span itemprop="creator" itemscope="" itemtype="http://schema.org/Person"><a href="'.e($this->credit).'" rel="author noopener" itemprop="url"><span itemprop="name">'.e($this->author).'</span></a></span>';
119            } else {
120                return '<span itemprop="creator" itemscope="" itemtype="http://schema.org/Person"><span itemprop="name">'.e($this->author).'</span></span>';
121            }
122        }
123
124        return null;
125    }
126
127    public function getCopyrightString(): ?string
128    {
129        if (isset($this->copyright)) {
130            return '<span itemprop="copyrightNotice">'.e($this->copyright).'</span>';
131        }
132
133        return null;
134    }
135
136    public function getLicenseString(): ?string
137    {
138        if (isset($this->license) && isset($this->licenseUrl)) {
139            return '<a href="'.e($this->licenseUrl).'" rel="license nofollow noopener" itemprop="license">'.e($this->license).'</a>';
140        }
141
142        if (isset($this->license)) {
143            return '<span itemprop="license">'.e($this->license).'</span>';
144        }
145
146        return null;
147    }
148
149    public function getFluentAttribution(): string
150    {
151        $attribution = [];
152
153        $getImageAuthorAttributionString = $this->getImageAuthorAttributionString();
154        if ($getImageAuthorAttributionString !== null) {
155            $attribution[] = 'Image by '.$getImageAuthorAttributionString;
156        }
157
158        $getCopyrightString = $this->getCopyrightString();
159        if ($getCopyrightString !== null) {
160            $attribution[] = $getCopyrightString;
161        }
162
163        $getLicenseString = $this->getLicenseString();
164        if ($getLicenseString !== null) {
165            $attribution[] = 'License '.$getLicenseString;
166        }
167
168        return implode('. ', $attribution);
169    }
170
171    /**
172     * Used in resources\views\components\post\image.blade.php to add meta tags with itemprop attributes.
173     *
174     * @return array
175     */
176    public function getMetadataArray(): array
177    {
178        $metadata = [];
179
180        if (isset($this->description)) {
181            $metadata['text'] = $this->description;
182        }
183
184        if (isset($this->title)) {
185            $metadata['name'] = $this->title;
186        }
187
188        $metadata['url'] = $this->getSource();
189        $metadata['contentUrl'] = $this->getSource();
190
191        return $metadata;
192    }
193}