Add line splitting in user render string functionality

Introduce a new option to split lines in user job and scope render strings based on a specified character limit. Implement a corresponding test to verify the correct behavior of this feature.
This commit is contained in:
2024-11-13 17:54:20 +01:00
parent 21ec3121ec
commit ba2d8663f1
2 changed files with 76 additions and 5 deletions

View File

@@ -13,8 +13,6 @@ namespace Chill\MainBundle\Templating\Entity;
use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use DateTime;
use DateTimeImmutable;
use Symfony\Component\Clock\ClockInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Error\LoaderError;
@@ -26,11 +24,17 @@ use Twig\Error\SyntaxError;
*/
class UserRender implements ChillEntityRenderInterface
{
public const SPLIT_LINE_BEFORE_CHARACTER = 'split_lines_before_characters';
final public const DEFAULT_OPTIONS = [
'main_scope' => true,
'user_job' => true,
'absence' => true,
'at_date' => null, // instanceof DateTimeInterface
/*
* when set, the jobs and service will be splitted in multiple lines. The line will be splitted
* before the given character. Only for renderString, renderBox is not concerned.
*/
self::SPLIT_LINE_BEFORE_CHARACTER => null,
];
public function __construct(
@@ -65,8 +69,6 @@ class UserRender implements ChillEntityRenderInterface
{
$opts = \array_merge(self::DEFAULT_OPTIONS, $options);
// $immutableAtDate = $opts['at_date'] instanceOf DateTime ? DateTimeImmutable::createFromMutable($opts['at_date']) : $opts['at_date'];
if (null === $opts['at_date']) {
$opts['at_date'] = $this->clock->now();
} elseif ($opts['at_date'] instanceof \DateTime) {
@@ -89,6 +91,28 @@ class UserRender implements ChillEntityRenderInterface
$str .= ' ('.$this->translator->trans('absence.Absent').')';
}
if (null !== $opts[self::SPLIT_LINE_BEFORE_CHARACTER]) {
if (!is_int($opts[self::SPLIT_LINE_BEFORE_CHARACTER])) {
throw new \InvalidArgumentException('Only integer for option split_lines_before_characters is allowed');
}
$characterPerLine = $opts[self::SPLIT_LINE_BEFORE_CHARACTER];
$exploded = explode(' ', $str);
$charOnLine = 0;
$str = '';
foreach ($exploded as $word) {
if ($charOnLine + strlen($word) > $characterPerLine) {
$str .= "\n";
$charOnLine = 0;
}
if ($charOnLine > 0) {
$str .= ' ';
}
$str .= $word;
$charOnLine += strlen($word);
}
}
return $str;
}