X-Git-Url: https://git.rapsys.eu/.gitweb.cgi/packbundle/blobdiff_plain/f0b926c770e7488b0b965cd611128ac239c95f97..60451adddba856f93d2b4a03dab2e7887fa8f6d0:/Util/ImageUtil.php diff --git a/Util/ImageUtil.php b/Util/ImageUtil.php new file mode 100644 index 0000000..d1b15cb --- /dev/null +++ b/Util/ImageUtil.php @@ -0,0 +1,239 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Rapsys\PackBundle\Util; + +use Symfony\Component\Filesystem\Exception\IOExceptionInterface; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Routing\RouterInterface; + +/** + * Helps manage map + */ +class ImageUtil { + /** + * The captcha width + */ + const captchaWidth = 192; + + /** + * The captcha height + */ + const captchaHeight = 52; + + /** + * The captcha background color + */ + const captchaBackground = 'white'; + + /** + * The captcha fill color + */ + const captchaFill = '#cff'; + + /** + * The captcha font size + */ + const captchaFontSize = 45; + + /** + * The captcha stroke color + */ + const captchaStroke = '#00c3f9'; + + /** + * The captcha stroke width + */ + const captchaStrokeWidth = 2; + + /** + * The thumb width + */ + const thumbWidth = 640; + + /** + * The thumb height + */ + const thumbHeight = 640; + + /** + * The cache path + */ + protected string $cache; + + /** + * The public path + */ + protected string $public; + + /** + * The RouterInterface instance + */ + protected RouterInterface $router; + + /** + * The SluggerUtil instance + */ + protected SluggerUtil $slugger; + + /** + * Creates a new map util + * + * @param RouterInterface $router The RouterInterface instance + * @param SluggerUtil $slugger The SluggerUtil instance + */ + function __construct(RouterInterface $router, SluggerUtil $slugger, string $cache = '../var/cache/image', string $public = './bundles/rapsyspack/image', $captchaBackground = self::captchaBackground, $captchaFill = self::captchaFill, $captchaFontSize = self::captchaFontSize, $captchaStroke = self::captchaStroke, $captchaStrokeWidth = self::captchaStrokeWidth) { + //Set cache + $this->cache = $cache; + + //set captcha background + $this->captchaBackground = $captchaBackground; + + //set captcha fill + $this->captchaFill = $captchaFill; + + //set captcha font size + $this->captchaFontSize = $captchaFontSize; + + //set captcha stroke + $this->captchaStroke = $captchaStroke; + + //set captcha stroke width + $this->captchaStrokeWidth = $captchaStrokeWidth; + + //Set public + $this->public = $public; + + //Set router + $this->router = $router; + + //Set slugger + $this->slugger = $slugger; + } + + /** + * Get captcha data + * + * @param int $updated The updated timestamp + * @param int $width The width + * @param int $height The height + * @return array The captcha data + */ + public function getCaptcha(int $updated, int $width = self::captchaWidth, int $height = self::captchaHeight): array { + //Set a + $a = rand(0, 9); + + //Set b + $b = rand(0, 5); + + //Set c + $c = rand(0, 9); + + //Set equation + $equation = $a.' * '.$b.' + '.$c; + + //Short path + $short = $this->slugger->short($equation); + + //Set hash + $hash = $this->slugger->serialize([$updated, $short, $width, $height]); + + //Return array + return [ + 'token' => $this->slugger->hash(strval($a * $b + $c)), + 'value' => strval($a * $b + $c), + 'equation' => str_replace([' ', '*', '+'], ['-', 'mul', 'add'], $equation), + 'src' => $this->router->generate('rapsys_pack_captcha', ['hash' => $hash, 'updated' => $updated, 'equation' => $short, 'width' => $width, 'height' => $height]), + 'width' => $width, + 'height' => $height + ]; + } + + /** + * Get thumb data + * + * @param string $caption The caption + * @param int $updated The updated timestamp + * @param string $path The path + * @param int $width The width + * @param int $height The height + * @return array The thumb data + */ + public function getThumb(string $caption, int $updated, string $path, int $width = self::thumbWidth, int $height = self::thumbHeight): array { + //Get image width and height + list($imageWidth, $imageHeight) = getimagesize($path); + + //Short path + $short = $this->slugger->short($path); + + //Set link hash + $link = $this->slugger->serialize([$updated, $short, $imageWidth, $imageHeight]); + + //Set src hash + $src = $this->slugger->serialize([$updated, $short, $width, $height]); + + //Return array + return [ + 'caption' => $caption, + 'link' => $this->router->generate('rapsys_pack_thumb', ['hash' => $link, 'updated' => $updated, 'path' => $short, 'width' => $imageWidth, 'height' => $imageHeight]), + 'src' => $this->router->generate('rapsys_pack_thumb', ['hash' => $src, 'updated' => $updated, 'path' => $short, 'width' => $width, 'height' => $height]), + 'width' => $width, + 'height' => $height + ]; + } + + /** + * Remove image + * + * @param int $updated The updated timestamp + * @param string $path The path + * @return array The thumb clear success + */ + public function remove(int $updated, string $path): bool { + //Set hash tree + $hash = array_reverse(str_split(strval($updated))); + + //Set dir + $dir = $this->public.'/'.$hash[0].'/'.$hash[1].'/'.$hash[2].'/'.$updated.'/'.$this->slugger->short($path); + + //Set removes + $removes = []; + + //With dir + if (is_dir($dir)) { + //Add tree to remove + $removes[] = $dir; + + //Iterate on each file + foreach(array_merge($removes, array_diff(scandir($dir), ['..', '.'])) as $file) { + //With file + if (is_file($dir.'/'.$file)) { + //Add file to remove + $removes[] = $dir.'/'.$file; + } + } + } + + //Create filesystem object + $filesystem = new Filesystem(); + + try { + //Remove list + $filesystem->remove($removes); + } catch (IOExceptionInterface $e) { + //Throw error + throw new \Exception(sprintf('Unable to delete thumb directory "%s"', $dir), 0, $e); + } + + //Return success + return true; + } +}