From 676e8c72dd8e0d42dfaaf5d52f5ef44d6b28224e Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 11 Feb 2022 10:10:08 +0100 Subject: [PATCH 1/7] Add support for figures with custom CSS classes --- src/Directive/FigureDirective.php | 34 ++++++++++++++++ src/KernelFactory.php | 1 + src/Renderers/FigureNodeRenderer.php | 39 +++++++++++++++++++ src/SymfonyHTMLFormat.php | 10 +++++ src/Templates/default/html/figure.html.twig | 13 +++++++ .../expected/blocks/nodes/figure.html | 7 ++++ tests/fixtures/source/blocks/nodes/figure.rst | 7 ++++ 7 files changed, 111 insertions(+) create mode 100644 src/Directive/FigureDirective.php create mode 100644 src/Renderers/FigureNodeRenderer.php create mode 100644 src/Templates/default/html/figure.html.twig diff --git a/src/Directive/FigureDirective.php b/src/Directive/FigureDirective.php new file mode 100644 index 0000000..db97f19 --- /dev/null +++ b/src/Directive/FigureDirective.php @@ -0,0 +1,34 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SymfonyDocsBuilder\Directive; + +use Doctrine\RST\Directives\Directive; +use Doctrine\RST\Nodes\FigureNode; +use Doctrine\RST\Nodes\Node; +use Doctrine\RST\Parser; + +class FigureDirective extends Directive +{ + public function getName(): string + { + return 'figure'; + } + + public function process(Parser $parser, ?Node $node, string $variable, string $data, array $options): void + { + if (!$node instanceof FigureNode) { + return; + } + + // grab the "class" option and forward it onto the Node + // FigureRenderer can then use it when rendering + $node->setClasses(isset($options['class']) ? explode(' ', $options['class']) : []); + } +} diff --git a/src/KernelFactory.php b/src/KernelFactory.php index 3a17b47..f886634 100644 --- a/src/KernelFactory.php +++ b/src/KernelFactory.php @@ -80,6 +80,7 @@ private static function getDirectives(): array new SymfonyDirectives\DangerDirective(), new SymfonyDirectives\DeprecatedDirective(), new SymfonyDirectives\ErrorDirective(), + new SymfonyDirectives\FigureDirective(), new SymfonyDirectives\HintDirective(), new SymfonyDirectives\ImportantDirective(), new SymfonyDirectives\IndexDirective(), diff --git a/src/Renderers/FigureNodeRenderer.php b/src/Renderers/FigureNodeRenderer.php new file mode 100644 index 0000000..9c95c9d --- /dev/null +++ b/src/Renderers/FigureNodeRenderer.php @@ -0,0 +1,39 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SymfonyDocsBuilder\Renderers; + +use Doctrine\RST\Nodes\FigureNode; +use Doctrine\RST\Renderers\NodeRenderer; +use Doctrine\RST\Templates\TemplateRenderer; + +class FigureNodeRenderer implements NodeRenderer +{ + /** @var FigureNode */ + private $figureNode; + + /** @var TemplateRenderer */ + private $templateRenderer; + + public function __construct(FigureNode $figureNode, TemplateRenderer $templateRenderer) + { + $this->figureNode = $figureNode; + $this->templateRenderer = $templateRenderer; + } + + public function render(): string + { + var_dump('here');exit; + return $this->templateRenderer->render('figure.html.twig', [ + 'figureNode' => $this->figureNode, + ]); + } +} diff --git a/src/SymfonyHTMLFormat.php b/src/SymfonyHTMLFormat.php index bf01090..8bd3667 100644 --- a/src/SymfonyHTMLFormat.php +++ b/src/SymfonyHTMLFormat.php @@ -13,6 +13,7 @@ use Doctrine\RST\Formats\Format; use Doctrine\RST\Nodes\CodeNode; +use Doctrine\RST\Nodes\FigureNode; use Doctrine\RST\Nodes\SpanNode; use Doctrine\RST\Renderers\CallableNodeRendererFactory; use Doctrine\RST\Renderers\NodeRendererFactory; @@ -74,6 +75,15 @@ function (SpanNode $node) { } ); + $nodeRendererFactories[FigureNode::class] = new CallableNodeRendererFactory( + function (FigureNode $node) { + return new Renderers\FigureNodeRenderer( + $node, + $this->templateRenderer + ); + } + ); + return $nodeRendererFactories; } } diff --git a/src/Templates/default/html/figure.html.twig b/src/Templates/default/html/figure.html.twig new file mode 100644 index 0000000..bbf0c83 --- /dev/null +++ b/src/Templates/default/html/figure.html.twig @@ -0,0 +1,13 @@ +{% if figureNode.classesString %}
{% endif %} +
+ {{ figureNode.image.render()|raw }} + + {% if figureNode.document %} + {% set caption = figureNode.document.render()|trim %} + + {% if caption %} +
{{ caption|raw }}
+ {% endif %} + {% endif %} +
+{% if figureNode.classesString %}
{% endif %} diff --git a/tests/fixtures/expected/blocks/nodes/figure.html b/tests/fixtures/expected/blocks/nodes/figure.html index 16042ca..aeeba64 100644 --- a/tests/fixtures/expected/blocks/nodes/figure.html +++ b/tests/fixtures/expected/blocks/nodes/figure.html @@ -15,3 +15,10 @@
A typical exception page in the development environment
+ +

And RST figures use a different syntax to define their custom CSS classes:

+
+
+ / +
+
diff --git a/tests/fixtures/source/blocks/nodes/figure.rst b/tests/fixtures/source/blocks/nodes/figure.rst index aef414f..b1d6361 100644 --- a/tests/fixtures/source/blocks/nodes/figure.rst +++ b/tests/fixtures/source/blocks/nodes/figure.rst @@ -15,3 +15,10 @@ Some images use a special CSS class to wrap a fake browser around them: :alt: A typical exception page in the development environment :align: center :class: some-class with-browser another-class + +And RST figures use a different syntax to define their custom CSS classes: + +.. figure:: images/logo.png + :alt: / + :align: center + :figclass: with-browser foo From b63440f491aed7748ba258e41ab6fadba114718c Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 11 Feb 2022 13:47:12 +0100 Subject: [PATCH 2/7] - --- src/Directive/FigureDirective.php | 2 +- src/SymfonyHTMLFormat.php | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Directive/FigureDirective.php b/src/Directive/FigureDirective.php index db97f19..ab07c0b 100644 --- a/src/Directive/FigureDirective.php +++ b/src/Directive/FigureDirective.php @@ -29,6 +29,6 @@ public function process(Parser $parser, ?Node $node, string $variable, string $d // grab the "class" option and forward it onto the Node // FigureRenderer can then use it when rendering - $node->setClasses(isset($options['class']) ? explode(' ', $options['class']) : []); + $node->setClasses(isset($options['class']) ? explode(' ', $options['figclass']) : []); } } diff --git a/src/SymfonyHTMLFormat.php b/src/SymfonyHTMLFormat.php index 8bd3667..6c0c740 100644 --- a/src/SymfonyHTMLFormat.php +++ b/src/SymfonyHTMLFormat.php @@ -55,6 +55,15 @@ public function getNodeRendererFactories(): array { $nodeRendererFactories = $this->htmlFormat->getNodeRendererFactories(); + $nodeRendererFactories[FigureNode::class] = new CallableNodeRendererFactory( + function (FigureNode $node) { + return new Renderers\FigureNodeRenderer( + $node, + $this->templateRenderer + ); + } + ); + $nodeRendererFactories[CodeNode::class] = new CallableNodeRendererFactory( function (CodeNode $node) { return new Renderers\CodeNodeRenderer( @@ -75,15 +84,6 @@ function (SpanNode $node) { } ); - $nodeRendererFactories[FigureNode::class] = new CallableNodeRendererFactory( - function (FigureNode $node) { - return new Renderers\FigureNodeRenderer( - $node, - $this->templateRenderer - ); - } - ); - return $nodeRendererFactories; } } From a81fc947de6dec339e160b65e83ce68d39c7e79e Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 15 Feb 2022 17:03:51 +0100 Subject: [PATCH 3/7] - --- src/Directive/FigureDirective.php | 17 ++++---- src/Renderers/FigureNodeRenderer.php | 39 ------------------- src/SymfonyHTMLFormat.php | 9 ----- .../default/html/directives/figure.html.twig | 1 + src/Templates/default/html/figure.html.twig | 13 ------- 5 files changed, 10 insertions(+), 69 deletions(-) delete mode 100644 src/Renderers/FigureNodeRenderer.php create mode 100644 src/Templates/default/html/directives/figure.html.twig delete mode 100644 src/Templates/default/html/figure.html.twig diff --git a/src/Directive/FigureDirective.php b/src/Directive/FigureDirective.php index ab07c0b..64c3c71 100644 --- a/src/Directive/FigureDirective.php +++ b/src/Directive/FigureDirective.php @@ -10,7 +10,6 @@ namespace SymfonyDocsBuilder\Directive; use Doctrine\RST\Directives\Directive; -use Doctrine\RST\Nodes\FigureNode; use Doctrine\RST\Nodes\Node; use Doctrine\RST\Parser; @@ -21,14 +20,16 @@ public function getName(): string return 'figure'; } - public function process(Parser $parser, ?Node $node, string $variable, string $data, array $options): void + final public function processSub(Parser $parser, ?Node $document, string $variable, string $data, array $options): ?Node { - if (!$node instanceof FigureNode) { - return; - } +die('here');exit; + $wrapperDiv = $parser->renderTemplate( + 'directives/figure.html.twig', + [ + 'custom_css_classes' => $options['class'] ?? '', + ] + ); - // grab the "class" option and forward it onto the Node - // FigureRenderer can then use it when rendering - $node->setClasses(isset($options['class']) ? explode(' ', $options['figclass']) : []); + return $parser->getNodeFactory()->createWrapperNode($document, $wrapperDiv, ''); } } diff --git a/src/Renderers/FigureNodeRenderer.php b/src/Renderers/FigureNodeRenderer.php deleted file mode 100644 index 9c95c9d..0000000 --- a/src/Renderers/FigureNodeRenderer.php +++ /dev/null @@ -1,39 +0,0 @@ - - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace SymfonyDocsBuilder\Renderers; - -use Doctrine\RST\Nodes\FigureNode; -use Doctrine\RST\Renderers\NodeRenderer; -use Doctrine\RST\Templates\TemplateRenderer; - -class FigureNodeRenderer implements NodeRenderer -{ - /** @var FigureNode */ - private $figureNode; - - /** @var TemplateRenderer */ - private $templateRenderer; - - public function __construct(FigureNode $figureNode, TemplateRenderer $templateRenderer) - { - $this->figureNode = $figureNode; - $this->templateRenderer = $templateRenderer; - } - - public function render(): string - { - var_dump('here');exit; - return $this->templateRenderer->render('figure.html.twig', [ - 'figureNode' => $this->figureNode, - ]); - } -} diff --git a/src/SymfonyHTMLFormat.php b/src/SymfonyHTMLFormat.php index 6c0c740..25f8347 100644 --- a/src/SymfonyHTMLFormat.php +++ b/src/SymfonyHTMLFormat.php @@ -55,15 +55,6 @@ public function getNodeRendererFactories(): array { $nodeRendererFactories = $this->htmlFormat->getNodeRendererFactories(); - $nodeRendererFactories[FigureNode::class] = new CallableNodeRendererFactory( - function (FigureNode $node) { - return new Renderers\FigureNodeRenderer( - $node, - $this->templateRenderer - ); - } - ); - $nodeRendererFactories[CodeNode::class] = new CallableNodeRendererFactory( function (CodeNode $node) { return new Renderers\CodeNodeRenderer( diff --git a/src/Templates/default/html/directives/figure.html.twig b/src/Templates/default/html/directives/figure.html.twig new file mode 100644 index 0000000..2f5e6a9 --- /dev/null +++ b/src/Templates/default/html/directives/figure.html.twig @@ -0,0 +1 @@ +
diff --git a/src/Templates/default/html/figure.html.twig b/src/Templates/default/html/figure.html.twig deleted file mode 100644 index bbf0c83..0000000 --- a/src/Templates/default/html/figure.html.twig +++ /dev/null @@ -1,13 +0,0 @@ -{% if figureNode.classesString %}
{% endif %} -
- {{ figureNode.image.render()|raw }} - - {% if figureNode.document %} - {% set caption = figureNode.document.render()|trim %} - - {% if caption %} -
{{ caption|raw }}
- {% endif %} - {% endif %} -
-{% if figureNode.classesString %}
{% endif %} From ba606615546680490764cb77711b5356c98c3ead Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Wed, 16 Feb 2022 16:11:35 +0100 Subject: [PATCH 4/7] - --- src/Directive/FigureDirective.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Directive/FigureDirective.php b/src/Directive/FigureDirective.php index 64c3c71..10c28f3 100644 --- a/src/Directive/FigureDirective.php +++ b/src/Directive/FigureDirective.php @@ -9,11 +9,12 @@ namespace SymfonyDocsBuilder\Directive; -use Doctrine\RST\Directives\Directive; +use Doctrine\RST\Directives\SubDirective; +use Doctrine\RST\Nodes\FigureNode; use Doctrine\RST\Nodes\Node; use Doctrine\RST\Parser; -class FigureDirective extends Directive +class FigureDirective extends SubDirective { public function getName(): string { @@ -22,11 +23,13 @@ public function getName(): string final public function processSub(Parser $parser, ?Node $document, string $variable, string $data, array $options): ?Node { -die('here');exit; $wrapperDiv = $parser->renderTemplate( 'directives/figure.html.twig', [ 'custom_css_classes' => $options['class'] ?? '', + 'alt' => $options['alt'] ?? '', + 'height' => $options['height'] ?? null, + 'width' => $options['width'] ?? null, ] ); From b7f351bb6e0d06f844dbc134223f8995cf4af059 Mon Sep 17 00:00:00 2001 From: Ryan Weaver Date: Mon, 7 Mar 2022 10:09:54 -0500 Subject: [PATCH 5/7] Overriding FigureDirective to fix lack of support for figclass --- src/Directive/FigureDirective.php | 45 ++++++++++++++----- .../default/html/directives/figure.html.twig | 1 - src/Templates/default/html/figure.html.twig | 17 +++++++ .../expected/blocks/nodes/figure.html | 9 ++-- 4 files changed, 54 insertions(+), 18 deletions(-) delete mode 100644 src/Templates/default/html/directives/figure.html.twig create mode 100644 src/Templates/default/html/figure.html.twig diff --git a/src/Directive/FigureDirective.php b/src/Directive/FigureDirective.php index 10c28f3..fa6f17d 100644 --- a/src/Directive/FigureDirective.php +++ b/src/Directive/FigureDirective.php @@ -10,10 +10,12 @@ namespace SymfonyDocsBuilder\Directive; use Doctrine\RST\Directives\SubDirective; -use Doctrine\RST\Nodes\FigureNode; use Doctrine\RST\Nodes\Node; use Doctrine\RST\Parser; +/** + * Overridden to handle "figclass" properly. + */ class FigureDirective extends SubDirective { public function getName(): string @@ -21,18 +23,37 @@ public function getName(): string return 'figure'; } - final public function processSub(Parser $parser, ?Node $document, string $variable, string $data, array $options): ?Node - { - $wrapperDiv = $parser->renderTemplate( - 'directives/figure.html.twig', - [ - 'custom_css_classes' => $options['class'] ?? '', - 'alt' => $options['alt'] ?? '', - 'height' => $options['height'] ?? null, - 'width' => $options['width'] ?? null, - ] + /** + * @param string[] $options + */ + public function processSub( + Parser $parser, + ?Node $document, + string $variable, + string $data, + array $options + ): ?Node { + $environment = $parser->getEnvironment(); + + $url = $environment->relativeUrl($data); + + if ($url === null) { + throw new \Exception(sprintf('Could not get relative url for %s', $data)); + } + + $nodeFactory = $parser->getNodeFactory(); + + $figClass = $options['figclass'] ?? null; + unset($options['figclass']); + + $figureNode = $parser->getNodeFactory()->createFigureNode( + $nodeFactory->createImageNode($url, $options), + $document ); + if ($figClass) { + $figureNode->setClasses(explode(' ', $figClass)); + } - return $parser->getNodeFactory()->createWrapperNode($document, $wrapperDiv, '
'); + return $figureNode; } } diff --git a/src/Templates/default/html/directives/figure.html.twig b/src/Templates/default/html/directives/figure.html.twig deleted file mode 100644 index 2f5e6a9..0000000 --- a/src/Templates/default/html/directives/figure.html.twig +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/src/Templates/default/html/figure.html.twig b/src/Templates/default/html/figure.html.twig new file mode 100644 index 0000000..c7b7f9c --- /dev/null +++ b/src/Templates/default/html/figure.html.twig @@ -0,0 +1,17 @@ +{% apply spaceless %} +
+ {{ figureNode.image.render()|raw }} + + {% if figureNode.document %} + {% set caption = figureNode.document.render()|trim %} + + {% if caption %} +
{{ caption|raw }}
+ {% endif %} + {% endif %} +
+{% endapply %} diff --git a/tests/fixtures/expected/blocks/nodes/figure.html b/tests/fixtures/expected/blocks/nodes/figure.html index aeeba64..d50411d 100644 --- a/tests/fixtures/expected/blocks/nodes/figure.html +++ b/tests/fixtures/expected/blocks/nodes/figure.html @@ -17,8 +17,7 @@

And RST figures use a different syntax to define their custom CSS classes:

-
-
- / -
-
+ +
+ / +
From 61761e51cbce2ab31b21c631fe40b9da620d69d1 Mon Sep 17 00:00:00 2001 From: Ryan Weaver Date: Mon, 7 Mar 2022 10:11:56 -0500 Subject: [PATCH 6/7] cleanup and notes --- src/Directive/FigureDirective.php | 5 +++++ src/SymfonyHTMLFormat.php | 1 - src/Templates/default/html/figure.html.twig | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Directive/FigureDirective.php b/src/Directive/FigureDirective.php index fa6f17d..43cfdd2 100644 --- a/src/Directive/FigureDirective.php +++ b/src/Directive/FigureDirective.php @@ -43,16 +43,21 @@ public function processSub( $nodeFactory = $parser->getNodeFactory(); + /* Start Custom Code */ $figClass = $options['figclass'] ?? null; unset($options['figclass']); + /* End Custom Code */ $figureNode = $parser->getNodeFactory()->createFigureNode( $nodeFactory->createImageNode($url, $options), $document ); + + /* Start Custom Code */ if ($figClass) { $figureNode->setClasses(explode(' ', $figClass)); } + /* End Custom Code */ return $figureNode; } diff --git a/src/SymfonyHTMLFormat.php b/src/SymfonyHTMLFormat.php index 25f8347..bf01090 100644 --- a/src/SymfonyHTMLFormat.php +++ b/src/SymfonyHTMLFormat.php @@ -13,7 +13,6 @@ use Doctrine\RST\Formats\Format; use Doctrine\RST\Nodes\CodeNode; -use Doctrine\RST\Nodes\FigureNode; use Doctrine\RST\Nodes\SpanNode; use Doctrine\RST\Renderers\CallableNodeRendererFactory; use Doctrine\RST\Renderers\NodeRendererFactory; diff --git a/src/Templates/default/html/figure.html.twig b/src/Templates/default/html/figure.html.twig index c7b7f9c..f89ce15 100644 --- a/src/Templates/default/html/figure.html.twig +++ b/src/Templates/default/html/figure.html.twig @@ -1,3 +1,6 @@ +{# +Overridden to fix lack of figclass support (class attribute on Date: Mon, 7 Mar 2022 10:12:45 -0500 Subject: [PATCH 7/7] unneeded logic --- src/Templates/default/html/figure.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Templates/default/html/figure.html.twig b/src/Templates/default/html/figure.html.twig index f89ce15..e1786c0 100644 --- a/src/Templates/default/html/figure.html.twig +++ b/src/Templates/default/html/figure.html.twig @@ -4,7 +4,7 @@ Overridden to fix lack of figclass support (class attribute on {{ figureNode.image.render()|raw }}