src/TextTransformer/Strategy/ASCII.php
<?php
namespace TextTransformer\Strategy;
use TextTransformer\Model\Text;
/**
* Class ASCII
*
* Soort 4: In deze tekst willen we karakters vervangen op basis van zijn voorganger. Ieder karakter heeft een waarde in
* de ASCII tabel. Is de waarde van zijn voorganger groter, vervang dan het karakter met het volgende karakter volgens
* de ASCII tabel, is deze kleiner, vervang dan het karakter met het vorige karakter volgens de ASCII tabel. Is de
* waarde identiek, doe dan niks. Het eerste karakter heeft geen voorganger dus, ook deze kun je laten zoals het is.
*
* @package TextTransformer\Strategy
*/
class ASCII implements TransformStrategyInterface
{
/**
* Function to transform text that satisfies the class description.
* @param Text $text
* @return string
*/
public function transform(Text $text): string
{
$chars = $text->getCharsByText();
$asciiChars = [];
foreach ($chars as $key => $char) {
$asciiChars[$key] = $this->uni_ord($char);
# Skip first char, has no predecessor
if ($key == 0) {
continue;
}
# Smaller then predecessor
if ($asciiChars[$key] < $asciiChars[$key - 1]) {
$nextAsciiChar = $this->uni_chr($asciiChars[$key] + 1);
$chars[$key] = $nextAsciiChar;
}
# Greater then predecessor
if ($asciiChars[$key] > $asciiChars[$key - 1]) {
$nextAsciiChar = $this->uni_chr($asciiChars[$key] + -1);
$chars[$key] = $nextAsciiChar;
}
}
$text->setChars($chars);
return $text->buildTextFromChars();
}
/**
* Get the ASCII value of a multibyte character.
* @param $u
* @return int
*/
private function uni_ord($u)
{
$k = mb_convert_encoding($u, 'UCS-2LE', 'UTF-8');
$k1 = ord(substr($k, 0, 1));
$k2 = ord(substr($k, 1, 1));
return $k2 * 256 + $k1;
}
/**
* Get character by an ASCII value.
* @param $u
* @return string
*/
private function uni_chr($u)
{
return mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML-ENTITIES');
}
}