Skip to content

Commit 676e8c7

Browse files
committed
Add support for figures with custom CSS classes
1 parent 4b1e49a commit 676e8c7

File tree

7 files changed

+111
-0
lines changed

7 files changed

+111
-0
lines changed

src/Directive/FigureDirective.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Docs Builder package.
5+
* (c) Ryan Weaver <ryan@symfonycasts.com>
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
8+
*/
9+
10+
namespace SymfonyDocsBuilder\Directive;
11+
12+
use Doctrine\RST\Directives\Directive;
13+
use Doctrine\RST\Nodes\FigureNode;
14+
use Doctrine\RST\Nodes\Node;
15+
use Doctrine\RST\Parser;
16+
17+
class FigureDirective extends Directive
18+
{
19+
public function getName(): string
20+
{
21+
return 'figure';
22+
}
23+
24+
public function process(Parser $parser, ?Node $node, string $variable, string $data, array $options): void
25+
{
26+
if (!$node instanceof FigureNode) {
27+
return;
28+
}
29+
30+
// grab the "class" option and forward it onto the Node
31+
// FigureRenderer can then use it when rendering
32+
$node->setClasses(isset($options['class']) ? explode(' ', $options['class']) : []);
33+
}
34+
}

src/KernelFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ private static function getDirectives(): array
8080
new SymfonyDirectives\DangerDirective(),
8181
new SymfonyDirectives\DeprecatedDirective(),
8282
new SymfonyDirectives\ErrorDirective(),
83+
new SymfonyDirectives\FigureDirective(),
8384
new SymfonyDirectives\HintDirective(),
8485
new SymfonyDirectives\ImportantDirective(),
8586
new SymfonyDirectives\IndexDirective(),

src/Renderers/FigureNodeRenderer.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* This file is part of the Docs Builder package.
7+
* (c) Ryan Weaver <ryan@symfonycasts.com>
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace SymfonyDocsBuilder\Renderers;
13+
14+
use Doctrine\RST\Nodes\FigureNode;
15+
use Doctrine\RST\Renderers\NodeRenderer;
16+
use Doctrine\RST\Templates\TemplateRenderer;
17+
18+
class FigureNodeRenderer implements NodeRenderer
19+
{
20+
/** @var FigureNode */
21+
private $figureNode;
22+
23+
/** @var TemplateRenderer */
24+
private $templateRenderer;
25+
26+
public function __construct(FigureNode $figureNode, TemplateRenderer $templateRenderer)
27+
{
28+
$this->figureNode = $figureNode;
29+
$this->templateRenderer = $templateRenderer;
30+
}
31+
32+
public function render(): string
33+
{
34+
var_dump('here');exit;
35+
return $this->templateRenderer->render('figure.html.twig', [
36+
'figureNode' => $this->figureNode,
37+
]);
38+
}
39+
}

src/SymfonyHTMLFormat.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Doctrine\RST\Formats\Format;
1515
use Doctrine\RST\Nodes\CodeNode;
16+
use Doctrine\RST\Nodes\FigureNode;
1617
use Doctrine\RST\Nodes\SpanNode;
1718
use Doctrine\RST\Renderers\CallableNodeRendererFactory;
1819
use Doctrine\RST\Renderers\NodeRendererFactory;
@@ -74,6 +75,15 @@ function (SpanNode $node) {
7475
}
7576
);
7677

78+
$nodeRendererFactories[FigureNode::class] = new CallableNodeRendererFactory(
79+
function (FigureNode $node) {
80+
return new Renderers\FigureNodeRenderer(
81+
$node,
82+
$this->templateRenderer
83+
);
84+
}
85+
);
86+
7787
return $nodeRendererFactories;
7888
}
7989
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{% if figureNode.classesString %}<div class="{{ figureNode.classesString }}">{% endif %}
2+
<figure>
3+
{{ figureNode.image.render()|raw }}
4+
5+
{% if figureNode.document %}
6+
{% set caption = figureNode.document.render()|trim %}
7+
8+
{% if caption %}
9+
<figcaption>{{ caption|raw }}</figcaption>
10+
{% endif %}
11+
{% endif %}
12+
</figure>
13+
{% if figureNode.classesString %}</div>{% endif %}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,10 @@
1515
<div class="with-browser">
1616
<img src="" alt="A typical exception page in the development environment" align="center" class="some-class with-browser another-class">
1717
</div>
18+
19+
<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>

tests/fixtures/source/blocks/nodes/figure.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,10 @@ Some images use a special CSS class to wrap a fake browser around them:
1515
:alt: A typical exception page in the development environment
1616
:align: center
1717
:class: some-class with-browser another-class
18+
19+
And RST figures use a different syntax to define their custom CSS classes:
20+
21+
.. figure:: images/logo.png
22+
:alt: /
23+
:align: center
24+
:figclass: with-browser foo

0 commit comments

Comments
 (0)