class FilterElf in External Links Filter 8
Adds a CSS class to all external and mailto links.
Plugin annotation
@Filter(
id = "filter_elf",
title = @Translation("Add an icon to external and mailto links"),
description = @Translation("External and mailto links in content links have an icon."),
type = Drupal\filter\Plugin\FilterInterface::TYPE_MARKUP_LANGUAGE,
settings = {
"elf_nofollow" = false
}
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\filter\Plugin\FilterBase implements FilterInterface
- class \Drupal\elf\Plugin\Filter\FilterElf
- class \Drupal\filter\Plugin\FilterBase implements FilterInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of FilterElf
File
- src/
Plugin/ Filter/ FilterElf.php, line 24
Namespace
Drupal\elf\Plugin\FilterView source
class FilterElf extends FilterBase {
/**
* Store internal domains.
* @var string
*/
protected $pattern = '';
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$form['elf_nofollow'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Add rel="nofollow" to all external links'),
'#default_value' => $this->settings['elf_nofollow'],
];
return $form;
}
/**
* {@inheritdoc}
*/
public function process($text, $langcode) {
$elf_settings = \Drupal::config('elf.settings');
$result = new FilterProcessResult($text);
$dom = Html::load($text);
$links = $dom
->getElementsByTagName('a');
foreach ($links as $a) {
$href = $a
->getAttribute('href');
if (!$href) {
continue;
}
// This is a mailto link.
if (strpos($href, 'mailto:') === 0) {
$a
->setAttribute('class', $a
->getAttribute('class') ? $a
->getAttribute('class') . ' elf-mailto elf-icon' : 'elf-mailto elf-icon');
continue;
}
// This is external links.
if ($this
->elf_url_external($href)) {
// The link is external. Add external class.
$a
->setAttribute('class', $a
->getAttribute('class') ? $a
->getAttribute('class') . ' elf-external elf-icon' : 'elf-external elf-icon');
if ($a
->getElementsByTagName('img')->length > 0) {
$a
->setAttribute('class', $a
->getAttribute('class') ? $a
->getAttribute('class') . ' elf-img' : 'elf-img');
}
// Add nofollow.
$no_follow = $this
->getConfiguration()['settings']['elf_nofollow'];
if ($no_follow) {
$rel = array_filter(explode(' ', $a
->getAttribute('rel')));
if (!in_array('nofollow', $rel)) {
$rel[] = 'nofollow';
$a
->setAttribute('rel', implode(' ', $rel));
}
}
// Add redirect.
if ($elf_settings
->get('elf_redirect')) {
$redirect_url = \Drupal::service('elf.manager')
->getRedirectUrl($a
->getAttribute('href'));
$a
->setAttribute('href', $redirect_url
->toString());
}
}
}
$result
->setProcessedText(Html::serialize($dom))
->addAttachments([
'library' => [
'elf/elf_css',
],
]);
return $result;
}
/**
* {@inheritdoc}
*/
public function tips($long = FALSE) {
return $this
->t('External and mailto links in content links have an icon.');
}
/**
* @param string $url
*
* @return bool
*/
public function elf_url_external($url) {
global $base_url;
if (empty($this->pattern)) {
$domains = [];
$elf_domains = \Drupal::config('elf.settings')
->get('elf_domains');
$elf_domains = is_array($elf_domains) ? $elf_domains : [];
foreach (array_merge($elf_domains, [
$base_url,
]) as $domain) {
$domains[] = preg_quote($domain, '#');
}
$this->pattern = '#^(' . str_replace('\\*', '.*', implode('|', $domains)) . ')#';
}
return preg_match($this->pattern, $url) ? FALSE : UrlHelper::isExternal($url);
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
FilterBase:: |
public | property | The name of the provider that owns this filter. | |
FilterBase:: |
public | property | An associative array containing the configured settings of this filter. | |
FilterBase:: |
public | property | A Boolean indicating whether this filter is enabled. | |
FilterBase:: |
public | property | The weight of this filter compared to others in a filter collection. | |
FilterBase:: |
public | function |
Calculates dependencies for the configured plugin. Overrides DependentPluginInterface:: |
1 |
FilterBase:: |
public | function |
Gets default configuration for this plugin. Overrides ConfigurableInterface:: |
|
FilterBase:: |
public | function |
Gets this plugin's configuration. Overrides ConfigurableInterface:: |
|
FilterBase:: |
public | function |
Returns the administrative description for this filter plugin. Overrides FilterInterface:: |
|
FilterBase:: |
public | function |
Returns HTML allowed by this filter's configuration. Overrides FilterInterface:: |
4 |
FilterBase:: |
public | function |
Returns the administrative label for this filter plugin. Overrides FilterInterface:: |
|
FilterBase:: |
public | function |
Returns the processing type of this filter plugin. Overrides FilterInterface:: |
|
FilterBase:: |
public | function |
Prepares the text for processing. Overrides FilterInterface:: |
|
FilterBase:: |
public | function |
Sets the configuration for this plugin instance. Overrides ConfigurableInterface:: |
1 |
FilterBase:: |
public | function |
Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides PluginBase:: |
4 |
FilterElf:: |
protected | property | Store internal domains. | |
FilterElf:: |
public | function | ||
FilterElf:: |
public | function |
Performs the filter processing. Overrides FilterInterface:: |
|
FilterElf:: |
public | function |
Generates a filter's settings form. Overrides FilterBase:: |
|
FilterElf:: |
public | function |
Generates a filter's tip. Overrides FilterBase:: |
|
FilterInterface:: |
constant | HTML tag and attribute restricting filters to prevent XSS attacks. | ||
FilterInterface:: |
constant | Non-HTML markup language filters that generate HTML. | ||
FilterInterface:: |
constant | Irreversible transformation filters. | ||
FilterInterface:: |
constant | Reversible transformation filters. | ||
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |