vendor/symfony/webpack-encore-bundle/src/Dto/StimulusControllersDto.php line 23

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * This file is part of the Symfony WebpackEncoreBundle package.
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  * For the full copyright and license information, please view the LICENSE
  7.  * file that was distributed with this source code.
  8.  */
  9. namespace Symfony\WebpackEncoreBundle\Dto;
  10. /**
  11.  * @deprecated since 1.17.0 - install symfony/stimulus-bundle instead.
  12.  */
  13. final class StimulusControllersDto extends AbstractStimulusDto
  14. {
  15.     private $controllers = [];
  16.     private $values = [];
  17.     private $classes = [];
  18.     public function addController(string $controllerName, array $controllerValues = [], array $controllerClasses = []): void
  19.     {
  20.         $controllerName $this->getFormattedControllerName($controllerName);
  21.         $this->controllers[] = $controllerName;
  22.         foreach ($controllerValues as $key => $value) {
  23.             if (null === $value) {
  24.                 continue;
  25.             }
  26.             $key $this->escapeAsHtmlAttr($this->normalizeKeyName($key));
  27.             $value $this->getFormattedValue($value);
  28.             $this->values['data-'.$controllerName.'-'.$key.'-value'] = $value;
  29.         }
  30.         foreach ($controllerClasses as $key => $class) {
  31.             $key $this->escapeAsHtmlAttr($this->normalizeKeyName($key));
  32.             $this->classes['data-'.$controllerName.'-'.$key.'-class'] = $class;
  33.         }
  34.     }
  35.     public function __toString(): string
  36.     {
  37.         if (=== \count($this->controllers)) {
  38.             return '';
  39.         }
  40.         return rtrim(implode(' 'array_filter([
  41.             'data-controller="'.implode(' '$this->controllers).'"',
  42.             $this->formatDataAttribute($this->values),
  43.             $this->formatDataAttribute($this->classes),
  44.         ])));
  45.     }
  46.     public function toArray(): array
  47.     {
  48.         if (=== \count($this->controllers)) {
  49.             return [];
  50.         }
  51.         return [
  52.             'data-controller' => implode(' '$this->controllers),
  53.         ] + $this->values $this->classes;
  54.     }
  55.     /**
  56.      * Normalize a Stimulus Value API key into its HTML equivalent ("kebab case").
  57.      * Backport features from symfony/string.
  58.      *
  59.      * @see https://stimulus.hotwired.dev/reference/values
  60.      */
  61.     private function normalizeKeyName(string $str): string
  62.     {
  63.         // Adapted from ByteString::camel
  64.         $str ucfirst(str_replace(' '''ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/'' '$str))));
  65.         // Adapted from ByteString::snake
  66.         return strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/''/([a-z\d])([A-Z])/'], '\1-\2'$str));
  67.     }
  68.     private function formatDataAttribute(array $data): string
  69.     {
  70.         return implode(' 'array_map(function (string $attributestring $value): string {
  71.             return $attribute.'="'.$this->escapeAsHtmlAttr($value).'"';
  72.         }, array_keys($data), $data));
  73.     }
  74. }