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 cache directory
- *
- * @var string
+ * The default fonts
*/
- protected $cache;
+ const fonts = [ 'default' => 'ttf/default.ttf' ];
/**
- * The fonts array
- *
- * @var array
+ * The default font
*/
- protected $fonts;
+ const font = 'default';
/**
- * The public path
- *
- * @var string
+ * The default font size
*/
- protected $path;
+ const size = 60;
/**
- * The public url
- *
- * @var string
+ * The default width
*/
- protected $url;
+ const width = 15;
/**
- * The package instance
- *
- * @var PackageInterface
+ * The default fill
*/
- protected $package;
+ const fill = 'white';
/**
- * The prefix
- *
- * @var string
+ * The default stroke
*/
- protected $prefix;
+ const stroke = '#00c3f9';
/**
- * The source
- *
- * @var string
+ * The default align
*/
- protected $source;
+ const align = 'center';
/**
- * 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' ]) {
- //Set cache
- $this->cache = $cache.'/'.$prefix;
-
- //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 source
- $this->source = $source;
+ function __construct(protected RouterInterface $router, protected string $cache = '../var/cache', protected string $path = './bundles/rapsyspack', protected string $prefix = 'facebook', protected ?string $source = null, protected array $fonts = self::fonts, protected string $font = self::font, protected int $size = self::size, protected int $width = self::width, protected string $fill = self::fill, protected string $stroke = self::stroke, protected string $align = self::align) {
}
/**
* @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';
+ $path = $this->path.'/'.$this->prefix.$pathInfo.'.jpeg';
//Without existing path
if (!is_dir($dir = dirname($path))) {
//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('rapsyspack_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
}
//Set cache path
- $cache = $this->cache.$pathInfo.'.png';
+ $cache = $this->cache.'/'.$this->prefix.$pathInfo.'.png';
//Without cache path
if (!is_dir($dir = dirname($cache))) {
}
}
- //Without source
- if ($source === null) {
- //Set source
- $source = realpath($this->source);
- }
-
//Create image object
$image = new \Imagick();
}
}
+ //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
'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;
//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);
$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);
//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);
//Return image data
return [
- 'og:image' => $this->package->getAbsoluteUrl($this->url.'/'.stat($path)['mtime'].$pathInfo.'.jpeg'),
+ 'og:image' => $this->router->generate('rapsyspack_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