3 namespace Drupal\token\Controller;
5 use Drupal\Core\Controller\ControllerBase;
6 use Drupal\token\TreeBuilderInterface;
7 use Symfony\Component\DependencyInjection\ContainerInterface;
8 use Symfony\Component\HttpFoundation\JsonResponse;
9 use Symfony\Component\HttpFoundation\Request;
12 * Returns autocomplete responses for tokens.
14 class TokenAutocompleteController extends ControllerBase {
17 * @var \Drupal\token\TreeBuilderInterface
19 protected $treeBuilder;
21 public function __construct(TreeBuilderInterface $tree_builder) {
22 $this->treeBuilder = $tree_builder;
28 public static function create(ContainerInterface $container) {
30 $container->get('token.tree_builder')
35 * Retrieves suggestions for block category autocompletion.
37 * @param \Symfony\Component\HttpFoundation\Request $request
38 * The current request.
39 * @param string $token_type
41 * @param string $filter
42 * The autocomplete filter.
44 * @return \Symfony\Component\HttpFoundation\JsonResponse
45 * A JSON response containing autocomplete suggestions.
47 public function autocomplete($token_type, $filter, Request $request) {
48 $filter = substr($filter, strrpos($filter, '['));
52 if (!mb_strlen($filter)) {
53 $matches["[{$token_type}:"] = 0;
56 $depth = max(1, substr_count($filter, ':'));
57 $tree = $this->treeBuilder->buildTree($token_type, ['flat' => TRUE, 'depth' => $depth]);
58 foreach (array_keys($tree) as $token) {
59 if (strpos($token, $filter) === 0) {
60 $matches[$token] = levenshtein($token, $filter);
61 if (isset($tree[$token]['children'])) {
62 $token = rtrim($token, ':]') . ':';
63 $matches[$token] = levenshtein($token, $filter);
71 $keys = array_keys($matches);
72 $matches = array_combine($keys, $keys);
74 return new JsonResponse($matches);