. */ namespace App\Services\LabelSystem; use App\Entity\Contracts\NamedElementInterface; use App\Entity\LabelSystem\LabelOptions; use App\Exceptions\TwigModeException; use App\Services\ElementTypeNameGenerator; use Symfony\Component\Security\Core\Security; use Twig\Environment; use Twig\Error\Error; final class LabelHTMLGenerator { private $twig; private $elementTypeNameGenerator; private $replacer; private $barcodeGenerator; private $sandboxedTwigProvider; private $partdb_title; private $security; public function __construct(ElementTypeNameGenerator $elementTypeNameGenerator, LabelTextReplacer $replacer, Environment $twig, BarcodeGenerator $barcodeGenerator, SandboxedTwigProvider $sandboxedTwigProvider, Security $security, string $partdb_title) { $this->twig = $twig; $this->elementTypeNameGenerator = $elementTypeNameGenerator; $this->replacer = $replacer; $this->barcodeGenerator = $barcodeGenerator; $this->sandboxedTwigProvider = $sandboxedTwigProvider; $this->security = $security; $this->partdb_title = $partdb_title; } public function getLabelHTML(LabelOptions $options, array $elements): string { if (empty($elements)) { throw new \InvalidArgumentException('$elements must not be empty'); } $twig_elements = []; if ('twig' === $options->getLinesMode()) { $sandboxed_twig = $this->sandboxedTwigProvider->getTwig($options); $current_user = $this->security->getUser(); } $page = 1; foreach ($elements as $element) { if ('twig' === $options->getLinesMode() && isset($sandboxed_twig) && isset($current_user)) { try { $lines = $sandboxed_twig->render( 'lines', [ 'element' => $element, 'page' => $page, 'user' => $current_user, 'install_title' => $this->partdb_title, ] ); } catch (Error $exception) { throw new TwigModeException($exception); } } else { $lines = $this->replacer->replace($options->getLines(), $element); } $twig_elements[] = [ 'element' => $element, 'lines' => $lines, 'barcode' => $this->barcodeGenerator->generateSVG($options, $element), 'barcode_content' => $this->barcodeGenerator->getContent($options, $element), ]; ++$page; } return $this->twig->render('LabelSystem/labels/base_label.html.twig', [ 'meta_title' => $this->getPDFTitle($options, $elements[0]), 'elements' => $twig_elements, 'options' => $options, ]); } private function getPDFTitle(LabelOptions $options, object $element) { if ($element instanceof NamedElementInterface) { return $this->elementTypeNameGenerator->getTypeNameCombination($element, false); } return 'Part-DB label'; } }