X-Git-Url: https://git.rapsys.eu/packbundle/blobdiff_plain/df7b4f1cde5b1f7c3534df258047d1581f066134..6e41b47900e0dc0b1f17d2494fd0a1af337b44ce:/Util/FacebookUtil.php

diff --git a/Util/FacebookUtil.php b/Util/FacebookUtil.php
index ea3393d..18f37d3 100644
--- a/Util/FacebookUtil.php
+++ b/Util/FacebookUtil.php
@@ -11,93 +11,149 @@
 
 namespace Rapsys\PackBundle\Util;
 
-use Symfony\Component\Asset\PackageInterface;
 use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
 use Symfony\Component\Filesystem\Filesystem;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\RouterInterface;
 
 /**
  * Helps manage facebook images
  */
 class FacebookUtil {
+	/**
+	 * The align
+	 *
+	 * @var string
+	 */
+	protected string $align;
+
 	/**
 	 * The cache directory
 	 *
 	 * @var string
 	 */
-	protected $cache;
+	protected string $cache;
+
+	/**
+	 * The fill
+	 *
+	 * @var string
+	 */
+	protected string $fill;
+
+	/**
+	 * The font
+	 *
+	 * @var string
+	 */
+	protected string $font;
 
 	/**
 	 * The fonts array
 	 *
 	 * @var array
 	 */
-	protected $fonts;
+	protected array $fonts;
 
 	/**
 	 * The public path
 	 *
 	 * @var string
 	 */
-	protected $path;
+	protected string $path;
 
 	/**
-	 * The public url
+	 * The prefix
 	 *
 	 * @var string
 	 */
-	protected $url;
+	protected string $prefix;
 
 	/**
-	 * The package instance
-	 *
-	 * @var PackageInterface
+	 * The RouterInterface instance
 	 */
-	protected $package;
+	protected RouterInterface $router;
 
 	/**
-	 * The prefix
+	 * The size
 	 *
-	 * @var string
+	 * @var int
 	 */
-	protected $prefix;
+	protected int $size;
 
 	/**
 	 * The source
 	 *
+	 * @var ?string
+	 */
+	protected ?string $source;
+
+	/**
+	 * The stroke
+	 *
 	 * @var string
 	 */
-	protected $source;
+	protected string $stroke;
+
+	/**
+	 * The width
+	 *
+	 * @var int
+	 */
+	protected int $width;
 
 	/**
-	 * Creates a new osm util
+	 * Creates a new facebook util
 	 *
-	 * @param PackageInterface $package The package instance
+	 * @param RouterInterface $router The RouterInterface instance
 	 * @param string $cache The cache directory
 	 * @param string $path The public path
-	 * @param string $url The public url
 	 * @param string $prefix The prefix
+	 * @param ?string $source The source
+	 * @param array $fonts The fonts
+	 * @param string $font The font
+	 * @param int $size The size
+	 * @param int $width The width
+	 * @param string $fill The fill
+	 * @param string $stroke The stroke
+	 * @param string $align The align
 	 */
-	function __construct(PackageInterface $package, string $cache, string $path, string $url, string $prefix = 'facebook', string $source = 'png/facebook.png', array $fonts = [ 'default' => 'ttf/default.ttf' ]) {
+	function __construct(RouterInterface $router, string $cache = '../var/cache', string $path = './bundles/rapsyspack', string $prefix = 'facebook', ?string $source = null, array $fonts = [ 'default' => 'ttf/default.ttf' ], string $font = 'default', int $size = 60, int $width = 15, string $fill = 'white', string $stroke = '#00c3f9', string $align = 'center') {
+		//Set align
+		$this->align = $align;
+
 		//Set cache
 		$this->cache = $cache.'/'.$prefix;
 
+		//Set fill
+		$this->fill = $fill;
+
+		//Set font
+		$this->font = $font;
+
 		//Set fonts
 		$this->fonts = $fonts;
 
 		//Set path
 		$this->path = $path.'/'.$prefix;
 
-		//Set url
-		$this->url = $url.'/'.$prefix;
-
-		//Set package instance
-		$this->package = $package;
-
 		//Set prefix key
 		$this->prefix = $prefix;
 
+		//Set router
+		$this->router = $router;
+
+		//Set size
+		$this->size = $size;
+
 		//Set source
 		$this->source = $source;
+
+		//Set stroke
+		$this->stroke = $stroke;
+
+		//Set width
+		$this->width = $width;
 	}
 
 	/**
@@ -114,6 +170,16 @@ class FacebookUtil {
 	 * @return array The image array
 	 */
 	public function getImage(string $pathInfo, array $texts, int $updated, ?string $source = null, int $width = 1200, int $height = 630): array {
+		//Without source
+		if ($source === null && $this->source === null) {
+			//Return empty image data
+			return [];
+		//Without local source
+		} elseif ($source === null) {
+			//Set local source
+			$source = $this->source;
+		}
+
 		//Set path file
 		$path = $this->path.$pathInfo.'.jpeg';
 
@@ -138,8 +204,7 @@ class FacebookUtil {
 
 			//Return image data
 			return [
-				#'og:image' => $this->package->getAbsoluteUrl('@RapsysAir/facebook/'.$mtime.$pathInfo.'.jpeg'),
-				'og:image' => $this->package->getAbsoluteUrl($this->url.'/'.$mtime.$pathInfo.'.jpeg'),
+				'og:image' => $this->router->generate('rapsys_pack_facebook', ['mtime' => $mtime, 'path' => $pathInfo], UrlGeneratorInterface::ABSOLUTE_URL),
 				'og:image:alt' => str_replace("\n", ' ', implode(' - ', array_keys($texts))),
 				'og:image:height' => $height,
 				'og:image:width' => $width
@@ -164,12 +229,6 @@ class FacebookUtil {
 			}
 		}
 
-		//Without source
-		if ($source === null) {
-			//Set source
-			$source = realpath($this->source);
-		}
-
 		//Create image object
 		$image = new \Imagick();
 
@@ -190,7 +249,17 @@ class FacebookUtil {
 				}
 			}
 
+			//Without source
+			if (!is_file($source)) {
+				//Throw error
+				throw new \Exception(sprintf('Source file "%s" do not exists', $this->source));
+			}
+
+			//Convert to absolute path
+			$source = realpath($source);
+
 			//Read image
+			//XXX: Imagick::readImage only supports absolute path
 			$image->readImage($source);
 
 			//Crop using aspect ratio
@@ -227,24 +296,6 @@ class FacebookUtil {
 			'right' => \Imagick::ALIGN_RIGHT
 		];
 
-		//Set default font
-		$defaultFont = 'dejavusans';
-
-		//Set default align
-		$defaultAlign = 'center';
-
-		//Set default size
-		$defaultSize = 60;
-
-		//Set default stroke
-		$defaultStroke = '#00c3f9';
-
-		//Set default width
-		$defaultWidth = 15;
-
-		//Set default fill
-		$defaultFill = 'white';
-
 		//Init counter
 		$i = 1;
 
@@ -254,16 +305,16 @@ class FacebookUtil {
 		//Draw each text stroke
 		foreach($texts as $text => $data) {
 			//Set font
-			$draw->setFont($this->fonts[$data['font']??$defaultFont]);
+			$draw->setFont($this->fonts[$data['font']??$this->font]);
 
 			//Set font size
-			$draw->setFontSize($data['size']??$defaultSize);
+			$draw->setFontSize($data['size']??$this->size);
 
 			//Set stroke width
-			$draw->setStrokeWidth($data['width']??$defaultWidth);
+			$draw->setStrokeWidth($data['width']??$this->width);
 
 			//Set text alignment
-			$draw->setTextAlignment($align = ($aligns[$data['align']??$defaultAlign]));
+			$draw->setTextAlignment($align = ($aligns[$data['align']??$this->align]));
 
 			//Get font metrics
 			$metrics = $image->queryFontMetrics($draw, $text);
@@ -291,10 +342,10 @@ class FacebookUtil {
 			$texts[$text]['y'] = $data['y'] += $metrics['ascender'] - $metrics['textHeight']/2;
 
 			//Set stroke color
-			$draw->setStrokeColor(new \ImagickPixel($data['stroke']??$defaultStroke));
+			$draw->setStrokeColor(new \ImagickPixel($data['stroke']??$this->stroke));
 
 			//Set fill color
-			$draw->setFillColor(new \ImagickPixel($data['stroke']??$defaultStroke));
+			$draw->setFillColor(new \ImagickPixel($data['stroke']??$this->stroke));
 
 			//Add annotation
 			$draw->annotation($data['x'], $data['y'], $text);
@@ -338,16 +389,16 @@ class FacebookUtil {
 		//Draw each text
 		foreach($texts as $text => $data) {
 			//Set font
-			$draw->setFont($this->fonts[$data['font']??$defaultFont]);
+			$draw->setFont($this->fonts[$data['font']??$this->font]);
 
 			//Set font size
-			$draw->setFontSize($data['size']??$defaultSize);
+			$draw->setFontSize($data['size']??$this->size);
 
 			//Set text alignment
-			$draw->setTextAlignment($aligns[$data['align']??$defaultAlign]);
+			$draw->setTextAlignment($aligns[$data['align']??$this->align]);
 
 			//Set fill color
-			$draw->setFillColor(new \ImagickPixel($data['fill']??$defaultFill));
+			$draw->setFillColor(new \ImagickPixel($data['fill']??$this->fill));
 
 			//Add annotation
 			$draw->annotation($data['x'], $data['y'], $text);
@@ -379,7 +430,7 @@ class FacebookUtil {
 
 		//Return image data
 		return [
-			'og:image' => $this->package->getAbsoluteUrl($this->url.'/'.stat($path)['mtime'].$pathInfo.'.jpeg'),
+			'og:image' => $this->router->generate('rapsys_pack_facebook', ['mtime' => stat($path)['mtime'], 'path' => $pathInfo], UrlGeneratorInterface::ABSOLUTE_URL),
 			'og:image:alt' => str_replace("\n", ' ', implode(' - ', array_keys($texts))),
 			'og:image:height' => $height,
 			'og:image:width' => $width