View source
<?php
namespace Drupal\api_tokens\Plugin\Filter;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\filter\FilterProcessResult;
use Drupal\filter\Plugin\FilterBase;
use Drupal\api_tokens\ApiTokenManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class ApiTokensFilter extends FilterBase implements ContainerFactoryPluginInterface {
const PATTERN = '@\\[api:([0-9a-z_-]+)(\\[.*?\\])?/]@';
protected $apiTokenManager;
public function __construct(array $configuration, $plugin_id, $plugin_definition, ApiTokenManagerInterface $api_token_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->apiTokenManager = $api_token_manager;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('plugin.manager.api_token'));
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$form['unregistered_tokens_behavior'] = [
'#type' => 'radios',
'#title' => $this
->t('Unregistered API tokens process behavior'),
'#default_value' => $this->settings['unregistered_tokens_behavior'],
'#options' => [
'cutout' => $this
->t('Cut out'),
'ignore' => $this
->t('Ignore'),
],
];
return $form;
}
public function process($text, $langcode) {
$result = new FilterProcessResult($text);
if (preg_match_all(self::PATTERN, $text, $matches)) {
list($tokens, $ids, $args) = $matches;
$replacements = $tokens;
foreach ($ids as $index => $id) {
if ($this->apiTokenManager
->hasDefinition($id)) {
$placeholder = $this->apiTokenManager
->createInstance($id, [
'params' => $args[$index],
])
->placeholder();
$result
->addAttachments([
'placeholders' => [
$tokens[$index] => $placeholder,
],
]);
}
elseif ('cutout' == $this->settings['unregistered_tokens_behavior']) {
$replacements[$index] = '';
}
}
$text = str_replace($tokens, $replacements, $text);
$result
->setProcessedText($text);
}
return $result;
}
public function tips($long = FALSE) {
return $this
->t('Replace API tokens.');
}
}