NoReferrerFilter.php in No Referrer 8
File
src/Plugin/Filter/NoReferrerFilter.php
View source
<?php
namespace Drupal\noreferrer\Plugin\Filter;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\filter\FilterProcessResult;
use Drupal\filter\Plugin\FilterBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
class NoReferrerFilter extends FilterBase implements ContainerFactoryPluginInterface {
protected $configFactory;
public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->configFactory = $config_factory;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('config.factory'));
}
public function process($text, $langcode) {
$modified = FALSE;
$result = new FilterProcessResult($text);
$html_dom = Html::load($text);
$links = $html_dom
->getElementsByTagName('a');
$config = $this->configFactory
->get('noreferrer.settings');
$noopener = $config
->get('noopener');
$noreferrer = $config
->get('noreferrer');
foreach ($links as $link) {
$types = [];
if ($noopener && $link
->getAttribute('target') !== '') {
$types[] = 'noopener';
}
if ($noreferrer && ($href = $link
->getAttribute('href')) && UrlHelper::isExternal($href) && !noreferrer_is_whitelisted($href)) {
$types[] = 'noreferrer';
}
if ($types) {
$rel = $link
->getAttribute('rel');
foreach ($types as $type) {
$rel .= $rel ? " {$type}" : $type;
}
$link
->setAttribute('rel', $rel);
$modified = TRUE;
}
}
if ($modified) {
$result
->setProcessedText(Html::serialize($html_dom));
}
return $result;
}
}