FilterImageLazyLoad.php
Same filename in other branches
Namespace
Drupal\filter\Plugin\FilterFile
-
core/
modules/ filter/ src/ Plugin/ Filter/ FilterImageLazyLoad.php
View source
<?php
declare (strict_types=1);
namespace Drupal\filter\Plugin\Filter;
use Drupal\Component\Utility\Html;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\filter\Attribute\Filter;
use Drupal\filter\FilterProcessResult;
use Drupal\filter\Plugin\FilterBase;
use Drupal\filter\Plugin\FilterInterface;
/**
* Provides a filter to lazy load tracked images.
*/
final class FilterImageLazyLoad extends FilterBase {
/**
* {@inheritdoc}
*/
public function process($text, $langcode) : FilterProcessResult {
$result = new FilterProcessResult($text);
// If there are no images, return early.
if (stripos($text, '<img ') === FALSE && stripos($text, 'data-entity-type="file"') === FALSE) {
return $result;
}
return $result->setProcessedText($this->transformImages($text));
}
/**
* Transform markup of images to include loading="lazy".
*
* @param string $text
* The markup to transform.
*
* @return string
* The transformed text with loading attribute added.
*/
private function transformImages(string $text) : string {
$dom = Html::load($text);
$xpath = new \DOMXPath($dom);
// Only set loading="lazy" if no existing loading attribute is specified and
// dimensions are specified.
foreach ($xpath->query('//img[not(@loading="eager") and @width and @height]') as $element) {
assert($element instanceof \DOMElement);
$element->setAttribute('loading', 'lazy');
}
return Html::serialize($dom);
}
}
Classes
Title | Deprecated | Summary |
---|---|---|
FilterImageLazyLoad | Provides a filter to lazy load tracked images. |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.