3 namespace Drupal\token\Controller;
5 use Drupal\Component\Utility\Unicode;
6 use Drupal\Core\Controller\ControllerBase;
7 use Drupal\token\TreeBuilderInterface;
8 use Symfony\Component\DependencyInjection\ContainerInterface;
9 use Symfony\Component\HttpFoundation\JsonResponse;
10 use Symfony\Component\HttpFoundation\Request;
13 * Returns autocomplete responses for tokens.
15 class TokenAutocompleteController extends ControllerBase {
18 * @var \Drupal\token\TreeBuilderInterface
20 protected $treeBuilder;
22 public function __construct(TreeBuilderInterface $tree_builder) {
23 $this->treeBuilder = $tree_builder;
29 public static function create(ContainerInterface $container) {
31 $container->get('token.tree_builder')
36 * Retrieves suggestions for block category autocompletion.
38 * @param \Symfony\Component\HttpFoundation\Request $request
39 * The current request.
40 * @param string $token_type
42 * @param string $filter
43 * The autocomplete filter.
45 * @return \Symfony\Component\HttpFoundation\JsonResponse
46 * A JSON response containing autocomplete suggestions.
48 public function autocomplete($token_type, $filter, Request $request) {
49 $filter = substr($filter, strrpos($filter, '['));
53 if (!Unicode::strlen($filter)) {
54 $matches["[{$token_type}:"] = 0;
57 $depth = max(1, substr_count($filter, ':'));
58 $tree = $this->treeBuilder->buildTree($token_type, ['flat' => TRUE, 'depth' => $depth]);
59 foreach (array_keys($tree) as $token) {
60 if (strpos($token, $filter) === 0) {
61 $matches[$token] = levenshtein($token, $filter);
62 if (isset($tree[$token]['children'])) {
63 $token = rtrim($token, ':]') . ':';
64 $matches[$token] = levenshtein($token, $filter);
72 $keys = array_keys($matches);
73 $matches = array_combine($keys, $keys);
75 return new JsonResponse($matches);