Skip to content

Commit b7f351b

Browse files
committed
Overriding FigureDirective to fix lack of support for figclass
1 parent ba60661 commit b7f351b

File tree

4 files changed

+54
-18
lines changed

4 files changed

+54
-18
lines changed

src/Directive/FigureDirective.php

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,50 @@
1010
namespace SymfonyDocsBuilder\Directive;
1111

1212
use Doctrine\RST\Directives\SubDirective;
13-
use Doctrine\RST\Nodes\FigureNode;
1413
use Doctrine\RST\Nodes\Node;
1514
use Doctrine\RST\Parser;
1615

16+
/**
17+
* Overridden to handle "figclass" properly.
18+
*/
1719
class FigureDirective extends SubDirective
1820
{
1921
public function getName(): string
2022
{
2123
return 'figure';
2224
}
2325

24-
final public function processSub(Parser $parser, ?Node $document, string $variable, string $data, array $options): ?Node
25-
{
26-
$wrapperDiv = $parser->renderTemplate(
27-
'directives/figure.html.twig',
28-
[
29-
'custom_css_classes' => $options['class'] ?? '',
30-
'alt' => $options['alt'] ?? '',
31-
'height' => $options['height'] ?? null,
32-
'width' => $options['width'] ?? null,
33-
]
26+
/**
27+
* @param string[] $options
28+
*/
29+
public function processSub(
30+
Parser $parser,
31+
?Node $document,
32+
string $variable,
33+
string $data,
34+
array $options
35+
): ?Node {
36+
$environment = $parser->getEnvironment();
37+
38+
$url = $environment->relativeUrl($data);
39+
40+
if ($url === null) {
41+
throw new \Exception(sprintf('Could not get relative url for %s', $data));
42+
}
43+
44+
$nodeFactory = $parser->getNodeFactory();
45+
46+
$figClass = $options['figclass'] ?? null;
47+
unset($options['figclass']);
48+
49+
$figureNode = $parser->getNodeFactory()->createFigureNode(
50+
$nodeFactory->createImageNode($url, $options),
51+
$document
3452
);
53+
if ($figClass) {
54+
$figureNode->setClasses(explode(' ', $figClass));
55+
}
3556

36-
return $parser->getNodeFactory()->createWrapperNode($document, $wrapperDiv, '</div>');
57+
return $figureNode;
3758
}
3859
}

src/Templates/default/html/directives/figure.html.twig

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{% apply spaceless %}
2+
<figure
3+
{% if figureNode.classes is not empty %}
4+
class="{{ figureNode.classes ? figureNode.classesString : '' }}"
5+
{% endif %}
6+
>
7+
{{ figureNode.image.render()|raw }}
8+
9+
{% if figureNode.document %}
10+
{% set caption = figureNode.document.render()|trim %}
11+
12+
{% if caption %}
13+
<figcaption>{{ caption|raw }}</figcaption>
14+
{% endif %}
15+
{% endif %}
16+
</figure>
17+
{% endapply %}

tests/fixtures/expected/blocks/nodes/figure.html

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
</div>
1818

1919
<p>And RST figures use a different syntax to define their custom CSS classes:</p>
20-
<div class="with-browser foo">
21-
<figure>
22-
<img src="" alt="/" align="center" figclass="with-browser foo">
23-
</figure>
24-
</div>
20+
21+
<figure class="with-browser foo">
22+
<img src="" alt="/" align="center">
23+
</figure>

0 commit comments

Comments
 (0)