improvements-2.x-dev/src/Plugin/Filter/AutoAttachLibrariesFilter.php
src/Plugin/Filter/AutoAttachLibrariesFilter.php
<?php
namespace Drupal\improvements\Plugin\Filter;
use Drupal\Component\Utility\Html;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\druhels\ArrayHelper;
use Drupal\filter\Attribute\Filter;
use Drupal\filter\FilterProcessResult;
use Drupal\filter\Plugin\FilterBase;
use Drupal\filter\Plugin\FilterInterface;
/**
* @TODO Add Tests
*/
#[Filter(
id: 'auto_attach_libraries_filter',
title: new TranslatableMarkup('Auto attach libraries'),
type: FilterInterface::TYPE_TRANSFORM_REVERSIBLE,
description: new TranslatableMarkup('Attach libraries by elements.'),
settings: [
'by_text' => [],
'by_xpath' => [],
],
)]
class AutoAttachLibrariesFilter extends FilterBase {
/**
* {@inheritDoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state): array {
$form['by_text'] = [
'#type' => 'textarea',
'#title' => $this->t('Attach libraries by text'),
'#description' => $this->t('Recommended method. Format: "<code>string => library-name</code>". Example: "<code>use-ajax => core/drupal.ajax</code>"'),
'#default_value' => ArrayHelper::formatArrayAsKeyValueList($this->settings['by_text'], ' => '),
];
$form['by_xpath'] = [
'#type' => 'textarea',
'#title' => $this->t('Attach libraries by xpath'),
'#description' => $this->t('Not-recommended method due to lower performance. Format: "<code>xpath => library-name</code>". Example: "<code>//*[contains(@class, \'use-ajax\')] => core/drupal.ajax</code>"'),
'#default_value' => ArrayHelper::formatArrayAsKeyValueList($this->settings['by_xpath'], ' => '),
];
return $form;
}
/**
* {@inheritDoc}
*/
public function setConfiguration(array $configuration): self {
if (is_string($configuration['settings']['by_text'])) {
$configuration['settings']['by_text'] = ArrayHelper::formatKeyValueListAsArray($configuration['settings']['by_text'], ' => ');
}
if (is_string($configuration['settings']['by_xpath'])) {
$configuration['settings']['by_xpath'] = ArrayHelper::formatKeyValueListAsArray($configuration['settings']['by_xpath'], ' => ');
}
return parent::setConfiguration($configuration);
}
/**
* {@inheritDoc}
*/
public function process($text, $langcode): FilterProcessResult {
$result = new FilterProcessResult($text);
$attached_libraries = [];
// By text
if ($this->settings['by_text']) {
foreach ($this->settings['by_text'] as $string => $library_name) {
if (str_contains($text, $string)) {
$attached_libraries[] = $library_name;
}
}
}
// By xpath
if ($this->settings['by_xpath']) {
$dom = Html::load($text);
$xpath = new \DOMXPath($dom);
foreach ($this->settings['by_xpath'] as $query => $library_name) {
if ($xpath->query($query)) {
$attached_libraries[] = $library_name;
}
}
}
if ($attached_libraries) {
$result->addAttachments(['library' => array_unique($attached_libraries)]);
}
return $result;
}
}
