gin_lp-1.0.x-dev/src/TwigExtension/GinLpExtension.php
src/TwigExtension/GinLpExtension.php
<?php
namespace Drupal\gin_lp\TwigExtension;
use Drupal\Core\Template\Attribute;
use Drupal\Core\Template\TwigExtension;
use Twig\TwigFunction;
/**
* A class providing Gin Twig function.
*
* @package Drupal\gin_lp\TwigExtension
*/
class GinLpExtension extends TwigExtension {
private static $ginLpClasses = NULL;
/**
* {@inheritdoc}
*/
public function getFunctions() {
return [
new TwigFunction('glp_classes', [$this, 'ginClasses']),
];
}
/**
* {@inheritdoc}
*/
public function getName() {
return 'gin_lp';
}
/**
* Returns a list of all glp- prefixed classes.
* The classes are generated by an postcss plugin.
*
* @return []
* The classes
*/
private static function getGinLpClasses() {
if (GinLpExtension::$ginLpClasses === NULL) {
GinLpExtension::$ginLpClasses = json_decode(file_get_contents(__DIR__ . '/../classes.json'));
}
return GinLpExtension::$ginLpClasses;
}
/**
* Replaces all theme classes with gin classes.
*
* @param \Drupal\Core\Template\Attribute $attribute
* Twig attributes.
*
* @return \Drupal\Core\Template\Attribute
* The replaced attributes.
*/
public static function ginClasses(Attribute $attribute) {
$gin_lp_classes = self::getGinLpClasses();
if ($attribute->getClass() === NULL) {
return $attribute;
}
$renamed_classes = [];
// These classes need to be kept for script purposes.
// If this class has been styled, then we'll keep both classes: the original
// and the custom glp one.
$script_classes = [
'form-autocomplete',
];
foreach ($attribute->getClass() as $class_string) {
// $attribute->getClass returns multiple classes as one class.
// To prefix this classes - explode it.
$classes = explode(' ', $class_string);
foreach ($classes as $class) {
if (in_array('glp-' . $class, $gin_lp_classes)) {
$renamed_classes[] = 'glp-' . $class;
if (in_array($class, $script_classes)) {
$renamed_classes[] = $class;
}
} else {
$renamed_classes[] = $class;
}
}
}
$attribute->setAttribute('class', $renamed_classes);
return $attribute;
}
}
