From dcb7bebd6bdf79d0eb80b80094cdf662bcd0a2c3 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Mon, 22 Mar 2021 21:35:03 +0100 Subject: [PATCH] add string builder --- core/String/StringBuilder.php | 46 +++++++++++++++++++++++++ core/Twig/Extension/StringExtension.php | 32 +++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 core/String/StringBuilder.php create mode 100644 core/Twig/Extension/StringExtension.php diff --git a/core/String/StringBuilder.php b/core/String/StringBuilder.php new file mode 100644 index 0000000..5164286 --- /dev/null +++ b/core/String/StringBuilder.php @@ -0,0 +1,46 @@ + + */ +class StringBuilder +{ + protected PropertyAccessor $propertyAccessor; + + public function __construct() + { + $this->propertyAccessor = PropertyAccess::createPropertyAccessorBuilder() + ->getPropertyAccessor() + ; + } + + /** + * Builds a string and inject values from given object. + * + * @param mixed $object + */ + public function build(string $format, $object): string + { + if (!is_array($object) && !is_object($object)) { + return $format; + } + + preg_match_all('/\{([a-zA-Z0-9\.]+)\}/i', $format, $matches, PREG_SET_ORDER); + + foreach ($matches as $match) { + $propertyValue = $this->propertyAccessor->getValue($object, $match[1]); + + $format = u($format)->replace($match[0], $propertyValue); + } + + return $format; + } +} diff --git a/core/Twig/Extension/StringExtension.php b/core/Twig/Extension/StringExtension.php new file mode 100644 index 0000000..749b356 --- /dev/null +++ b/core/Twig/Extension/StringExtension.php @@ -0,0 +1,32 @@ +stringBuilder = $stringBuilder; + } + + /** + * {@inheritdoc} + */ + public function getFilters() + { + return [ + new TwigFilter('build_string', [$this, 'buildString']), + ]; + } + + public function buildString(string $format, $object): string + { + return $this->stringBuilder->build($format, $object); + } +}