deepseek-1.x-dev/src/Plugin/CKEditor5Plugin/InsertPromptSettings.php
src/Plugin/CKEditor5Plugin/InsertPromptSettings.php
<?php
namespace Drupal\deepseek\Plugin\CKEditor5Plugin;
use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
use Drupal\Component\Serialization\Yaml;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Url;
use Drupal\editor\EditorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* CKEditor 5 Url get content prompt plugin.
*/
class InsertPromptSettings extends CKEditor5PluginDefault implements CKEditor5PluginConfigurableInterface, ContainerFactoryPluginInterface {
use CKEditor5PluginConfigurableTrait;
/**
* {@inheritdoc}
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, protected ConfigFactoryInterface $configFactory) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
}
/**
* {@inheritDoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
// Swap config with a values from config object.
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('config.factory'),
);
}
/**
* {@inheritdoc}
*/
public function defaultConfiguration() {
return [
'prompts' => [],
];
}
/**
* {@inheritdoc}
*/
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$config = $this->getConfiguration();
$prompts = $this->listPrompt($this->configFactory->get('deepseek.settings'));
$options = [];
foreach ($prompts as $id => $prompt) {
$options[$id] = $prompt['title'];
}
$form['prompts'] = [
'#type' => 'checkboxes',
'#title' => $this->t('Available prompts'),
'#options' => $options,
'#description' => $this->t('The selected prompts will appear in the ckeditor list.'),
'#default_value' => $config['prompts'],
];
return $form;
}
/**
* {@inheritdoc}
*/
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
// @todo Implement validateConfigurationForm() method.
}
/**
* {@inheritdoc}
*/
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
$this->configuration['prompts'] = $form_state->getValue('prompts');
}
/**
* {@inheritdoc}
*
* Get list of block in editor config.
*/
public function getDynamicPluginConfig(array $static_plugin_config, EditorInterface $editor): array {
$config = $this->configFactory->get('deepseek.settings');
$listPrompts = $prompts = $this->listPrompt($config);
$voice = $config->get('voice');
$configBlocks = array_filter($this->configuration['prompts']);
if (!empty($configBlocks)) {
$prompts = [];
foreach ($this->configuration['prompts'] as $promptId) {
if ($promptId) {
$prompts[$promptId] = $listPrompts[$promptId];
}
}
}
return [
'prompts' => $prompts,
'voice' => $voice,
'ai_connect' => Url::fromRoute('deepseek.ai_connect')->toString(),
];
}
/**
* Shows a list of blocks that can be added to a theme's layout.
*
* @inheritDoc
*/
public function listPrompt($config) {
$definitions = is_string($config->get('prompts')) ? Yaml::decode($config->get('prompts')) : $config->get('prompts');
$prompts = [];
foreach ($definitions as $plugin_definition) {
if (!isset($plugin_definition['title']) || !isset($plugin_definition['prompt'])) {
continue;
}
$plugin_id = $plugin_definition['id'] ?? substr(bin2hex(random_bytes(3)), 0, 5);
$prompts[$plugin_id] = $plugin_definition;
}
return $prompts;
}
}
