X-Git-Url: https://git.rapsys.eu/packbundle/blobdiff_plain/438757217861be80e99c8648b3f4e57d207f4198..60451adddba856f93d2b4a03dab2e7887fa8f6d0:/Util/SluggerUtil.php?ds=sidebyside

diff --git a/Util/SluggerUtil.php b/Util/SluggerUtil.php
index 0d8f346..8dc50df 100644
--- a/Util/SluggerUtil.php
+++ b/Util/SluggerUtil.php
@@ -31,7 +31,7 @@ class SluggerUtil {
 	private $offset;
 
 	/**
-	 * Creates a new slugger util
+	 * Construct slugger util
 	 *
 	 * @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
@@ -42,9 +42,12 @@ class SluggerUtil {
 		//Set secret
 		$this->secret = $secret;
 
-		//Pseudo-random alphabet
-		//XXX: use array flip and keys to workaround php "smart" that cast range('0', '9') as int instead of string
-		//XXX: The key count mismatch, count(alpha)>count(rev), resulted in a data corruption due to duplicate numeric values
+		/**
+		 * Pseudo-random alphabet
+		 * @xxx use array flip and keys to workaround php "smart" that cast range('0', '9') as int instead of string
+		 * @xxx The key count mismatch, count(alpha)>count(rev), resulted in a data corruption due to duplicate numeric values
+		 * @todosee required range by json_encode result and short input (0->255 ???)
+		 */
 		$this->alpha = array_keys(array_flip(array_merge(
 			range('^', '[', -1),
 			range('V', 'Z'),
@@ -115,10 +118,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
@@ -133,7 +142,8 @@ class SluggerUtil {
 	 */
 	public function serialize(array $data): string {
 		//Return shorted serialized data
-		return $this->short(serialize($data));
+		//XXX: dropped serialize use to prevent short function from dropping utf-8 characters
+		return $this->short(json_encode($data));
 	}
 
 	/**
@@ -146,11 +156,16 @@ class SluggerUtil {
 		//Return string
 		$ret = '';
 
-		//Iterate on each character
-		foreach(str_split($data) as $k => $c) {
-			if (isset($this->rev[$c]) && isset($this->alpha[($this->rev[$c]+$this->offset)%$this->count])) {
-				//XXX: Remap char to an other one
-				$ret .= chr(($this->rev[$c] - $this->offset + $this->count) % $this->count);
+		//With data
+		if (!empty($data)) {
+			//Iterate on each character
+			foreach(str_split($data) as $k => $c) {
+				if (isset($this->rev[$c]) && isset($this->alpha[($this->rev[$c]+$this->offset)%$this->count])) {
+					//XXX: Remap char to an other one
+					$ret .= chr(($this->rev[$c] - $this->offset + $this->count) % $this->count);
+				} else {
+					throw new \RuntimeException(sprintf('Unable to retrieve character: %c', $c));
+				}
 			}
 		}
 
@@ -162,9 +177,15 @@ class SluggerUtil {
 	 * Convert string to safe slug
 	 *
 	 * @param string $data The data string
-	 * @return string The slugged data
+	 * @return ?string The slugged data
 	 */
-	function slug(string $data): string {
+	function slug(?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
@@ -172,6 +193,7 @@ class SluggerUtil {
 			//Replace every non alphanumeric character by dash then trim dash
 			return trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $trans->transliterate($data)), '-');
 		}
+
 		//Convert from utf-8 to ascii, replace quotes with space, remove non alphanumericseparator, replace separator with dash and trim dash
 		return trim(preg_replace('/[\/_|+ -]+/', '-', strtolower(preg_replace('/[^a-zA-Z0-9\/_|+ -]/', '', str_replace(['\'', '"'], ' ', iconv('UTF-8', 'ASCII//TRANSLIT', $data))))), '-');
 	}
@@ -184,7 +206,7 @@ class SluggerUtil {
 	 */
 	public function unserialize(string $data): array {
 		//Return unshorted unserialized string
-		return unserialize($this->unshort($data));
+		return json_decode($this->unshort($data), true);
 	}
 
 	/**