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