-
Notifications
You must be signed in to change notification settings - Fork 3
/
LazyImageRenderer.php
66 lines (54 loc) · 2.02 KB
/
LazyImageRenderer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
namespace SimonVomEyser\CommonMarkExtension;
use League\CommonMark\Extension\CommonMark\Renderer\Inline\ImageRenderer;
use League\CommonMark\Node\Node;
use League\CommonMark\Renderer\ChildNodeRendererInterface;
use League\CommonMark\Renderer\NodeRendererInterface;
use League\Config\ConfigurationInterface;
class LazyImageRenderer implements NodeRendererInterface
{
/** @var ConfigurationInterface */
protected ConfigurationInterface $config;
/** @var ImageRenderer */
protected ImageRenderer $baseImageRenderer;
/**
* @param ConfigurationInterface $config
* @param ImageRenderer $baseImageRenderer
*/
public function __construct(ConfigurationInterface $config, ImageRenderer $baseImageRenderer)
{
$this->config = $config;
$this->baseImageRenderer = $baseImageRenderer;
}
/**
* @param Node $node
* @param ChildNodeRendererInterface $childRenderer
*
* @return string|\Stringable
*/
public function render(Node $node, ChildNodeRendererInterface $childRenderer)
{
$stripSrc = $this->config->get('lazy_image/strip_src');
$dataAttribute = $this->config->get('lazy_image/data_attribute');
$htmlClass = $this->config->get('lazy_image/html_class');
$this->baseImageRenderer->setConfiguration($this->config);
$htmlElement = $this->baseImageRenderer->render($node, $childRenderer);
$htmlElement->setAttribute('loading', 'lazy');
if ($dataAttribute) {
$htmlElement->setAttribute("data-$dataAttribute", $htmlElement->getAttribute('src'));
}
if ($htmlClass) {
// append the class to existing classes
$attr = $htmlElement->getAttribute('class');
if (! empty($attr)) {
$attr .= " ";
}
$attr .= $htmlClass;
$htmlElement->setAttribute('class', $attr);
}
if ($stripSrc) {
$htmlElement->setAttribute('src', '');
}
return $htmlElement;
}
}