a50da70b88292bbffc2b12707fca851b4cc66ac8
[yaffs-website] / web / modules / contrib / token / src / Controller / TokenAutocompleteController.php
1 <?php
2
3 namespace Drupal\token\Controller;
4
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;
11
12 /**
13  * Returns autocomplete responses for tokens.
14  */
15 class TokenAutocompleteController extends ControllerBase {
16
17   /**
18    * @var \Drupal\token\TreeBuilderInterface
19    */
20   protected $treeBuilder;
21
22   public function __construct(TreeBuilderInterface $tree_builder) {
23     $this->treeBuilder = $tree_builder;
24   }
25
26   /**
27    * {@inheritdoc}
28    */
29   public static function create(ContainerInterface $container) {
30     return new static(
31       $container->get('token.tree_builder')
32     );
33   }
34
35   /**
36    * Retrieves suggestions for block category autocompletion.
37    *
38    * @param \Symfony\Component\HttpFoundation\Request $request
39    *   The current request.
40    * @param string $token_type
41    *   The token type.
42    * @param string $filter
43    *   The autocomplete filter.
44    *
45    * @return \Symfony\Component\HttpFoundation\JsonResponse
46    *   A JSON response containing autocomplete suggestions.
47    */
48   public function autocomplete($token_type, $filter, Request $request) {
49     $filter = substr($filter, strrpos($filter, '['));
50
51     $matches = array();
52
53     if (!Unicode::strlen($filter)) {
54       $matches["[{$token_type}:"] = 0;
55     }
56     else {
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);
65           }
66         }
67       }
68     }
69
70     asort($matches);
71
72     $keys = array_keys($matches);
73     $matches = array_combine($keys, $keys);
74
75     return new JsonResponse($matches);
76   }
77
78 }