X-Git-Url: https://git.rapsys.eu/.gitweb.cgi/packbundle/blobdiff_plain/5b47a8995146637cdc2fa657631a6361dd749283..507bd9657ea19f0e4485c9fbac909183dd4491df:/Util/SluggerUtil.php

diff --git a/Util/SluggerUtil.php b/Util/SluggerUtil.php
index de8ce1b..d88cdfd 100644
--- a/Util/SluggerUtil.php
+++ b/Util/SluggerUtil.php
@@ -12,36 +12,40 @@
 namespace Rapsys\PackBundle\Util;
 
 /**
- * Helps manage string conversions
+ * Manages string conversions
  */
 class SluggerUtil {
-	//The secret parameter
-	private $secret;
-
-	//The alpha array
-	private $alpha;
+	/**
+	 * The alpha array
+	 */
+	protected array $alpha;
 
-	//The rev array
-	private $rev;
+	/**
+	 * The rev array
+	 */
+	protected array $rev;
 
-	//The alpha array key number
-	private $count;
+	/**
+	 * The alpha array key number
+	 */
+	protected int $count;
 
-	//The offset reduced from secret
-	private $offset;
+	/**
+	 * The offset reduced from secret
+	 */
+	protected int $offset;
 
 	/**
 	 * Construct slugger util
 	 *
+	 * TODO: use a recipe to generate in .env.local an env variable RAPSYSPACK_SECRET="ayl[...]z9w"
+	 *
 	 * @todo Add a command to generate alpha array or generate it on first run with cache storage ?
 	 * @todo Use Cache like in calendar controller through FilesystemAdapter
 	 *
 	 * @param string $secret The secret string
 	 */
-	public function __construct(string $secret) {
-		//Set secret
-		$this->secret = $secret;
-
+	public function __construct(protected string $secret) {
 		/**
 		 * Pseudo-random alphabet
 		 * @xxx use array flip and keys to workaround php "smart" that cast range('0', '9') as int instead of string
@@ -118,10 +122,16 @@ class SluggerUtil {
 	/**
 	 * Crypt and base64uri encode string
 	 *
-	 * @param string $data The data string
+	 * @param array|string $data The data string
 	 * @return string The hashed data
 	 */
-	public function hash(string $data): string {
+	public function hash(array|string $data): string {
+		//With array
+		if (is_array($data)) {
+			//Json encode array
+			$data = json_encode($data);
+		}
+
 		//Return hashed data
 		//XXX: we use hash_hmac with md5 hash
 		//XXX: crypt was dropped because it provided identical signature for string starting with same pattern
@@ -192,6 +202,31 @@ class SluggerUtil {
 		return trim(preg_replace('/[\/_|+ -]+/', '-', strtolower(preg_replace('/[^a-zA-Z0-9\/_|+ -]/', '', str_replace(['\'', '"'], ' ', iconv('UTF-8', 'ASCII//TRANSLIT', $data))))), '-');
 	}
 
+	/**
+	 * Convert string to latin
+	 *
+	 * @param string $data The data string
+	 * @return ?string The slugged data
+	 */
+	function latin(?string $data): ?string {
+		//With null
+		if ($data === null) {
+			//Return null
+			return $data;
+		}
+
+		//Use Transliterator if available
+		if (class_exists('Transliterator')) {
+			//Convert from any to latin, then to ascii and lowercase
+			$trans = \Transliterator::create('Any-Latin; Latin-ASCII');
+			//Replace every non alphanumeric character by dash then trim dash
+			return trim($trans->transliterate($data));
+		}
+
+		//Convert from utf-8 to ascii
+		return trim(iconv('UTF-8', 'ASCII//TRANSLIT', $data));
+	}
+
 	/**
 	 * Unshort then unserialize
 	 *