1 <?php
2 
3 namespace ComboStrap;
4 
5 use ComboStrap\Meta\Field\FeaturedRasterImage;
6 use ComboStrap\Meta\Field\FeaturedSvgImage;
7 use Exception;
8 
9 class ImageSystem
10 {
11 
12     /**
13      * @throws ExceptionNotFound - if the image was not found
14      */
15     public static function selectAndGetBestMetadataPageImageFetcherForRatio(MarkupPath $page, TagAttributes $tagAttributes): IFetcherLocalImage
16     {
17         /**
18          * Take the image and the page images
19          * of the first page with an image
20          */
21         $selectedPageImage = self::createImageFetchFromPageImageMetadata($page);
22         $stringRatio = $tagAttributes->getValue(Dimension::RATIO_ATTRIBUTE);
23         if ($stringRatio === null) {
24             return $selectedPageImage;
25         }
26 
27         /**
28          * We select the best image for the ratio
29          * Best ratio
30          */
31         $bestRatioDistance = 9999;
32         try {
33             $targetRatio = Dimension::convertTextualRatioToNumber($stringRatio);
34         } catch (ExceptionBadSyntax $e) {
35             LogUtility::error("The ratio ($stringRatio) is not a valid ratio. Error: {$e->getMessage()}", PageImageTag::CANONICAL);
36             return $selectedPageImage;
37         }
38 
39         $pageImages = $page->getPageMetadataImages();
40         foreach ($pageImages as $pageImage) {
41             $path = $pageImage->getImagePath();
42             try {
43                 $fetcherImage = IFetcherLocalImage::createImageFetchFromPath($path);
44             } catch (Exception $e) {
45                 LogUtility::msg("An image object could not be build from ($path). Is it an image file ?. Error: {$e->getMessage()}");
46                 continue;
47             }
48             $ratioDistance = $targetRatio - $fetcherImage->getIntrinsicAspectRatio();
49             if ($ratioDistance < $bestRatioDistance) {
50                 $bestRatioDistance = $ratioDistance;
51                 $selectedPageImage = $fetcherImage;
52             }
53         }
54         return $selectedPageImage;
55     }
56 
57     /**
58      * @throws ExceptionNotFound
59      * @deprecated
60      */
61     public static function createImageFetchFromPageImageMetadata(MarkupPath $page): IFetcherLocalImage
62     {
63         $selectedPageImage = null;
64         foreach ($page->getPageMetadataImages() as $pageMetadataImage) {
65             try {
66                 $pageMetadataImagePath = $pageMetadataImage->getImagePath();
67                 $selectedPageImage = IFetcherLocalImage::createImageFetchFromPath($pageMetadataImagePath);
68             } catch (\Exception $e) {
69                 LogUtility::internalError("The file ($pageMetadataImagePath) is not a valid image for the page ($page). Error: {$e->getMessage()}");
70                 continue;
71             }
72         }
73         if ($selectedPageImage !== null) {
74             return $selectedPageImage;
75         }
76         throw new ExceptionNotFound("No page image metadata image could be found for the page ($page)");
77     }
78 
79 
80 }
81