Core/src/Twig/Extensions/TransformExtension.php

74 lines
2.1 KiB
PHP

<?php
namespace Benzine\Twig\Extensions;
use Camel\CaseTransformer;
use Camel\Format;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
class TransformExtension extends AbstractExtension
{
private $transformers = [
'Camel',
'ScreamingSnake',
'Snake',
'Spinal',
'Studly',
];
public function getFilters()
{
$filters = [];
foreach ($this->transformers as $fromTransformer) {
foreach ($this->transformers as $toTransformer) {
$name = 'transform_'.strtolower($fromTransformer).'_to_'.strtolower($toTransformer);
$context = $this;
$filters[$name] =
new TwigFilter($name, function (string $word) use ($context, $fromTransformer, $toTransformer): string {
return $context->transform($word, $fromTransformer, $toTransformer);
});
}
}
return $filters;
}
public function transform($string, $from, $to)
{
$fromTransformer = $this->getTransformer($from);
$toTransformer = $this->getTransformer($to);
$transformer = new CaseTransformer($fromTransformer, $toTransformer);
return $transformer->transform($string);
}
public function getName()
{
return 'transform_extension';
}
protected function getTransformer($name)
{
switch (strtolower($name)) {
case 'camel':
case 'camelcase':
return new Format\CamelCase();
case 'screaming':
case 'screamingsnake':
case 'screamingsnakecase':
return new Format\ScreamingSnakeCase();
case 'snake':
case 'snakecase':
return new Format\SnakeCase();
case 'spinal':
case 'spinalcase':
return new Format\SpinalCase();
case 'studly':
return new Format\StudlyCaps();
default:
throw new TransformExtensionException("Unknown transformer: \"{$name}\".");
}
}
}