Skip to content

Commit 8dfd05b

Browse files
committed
Introduce prerendering options
This new pre rendering options allow extensions to do pre-rendering node changes. This can be usefull for changes that depend on the output format like links.
1 parent 8542498 commit 8dfd05b

File tree

9 files changed

+131
-69
lines changed

9 files changed

+131
-69
lines changed

packages/guides-restructured-text/src/RestructuredText/TextRoles/AbstractReferenceTextRole.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,5 @@ public function processNode(
8383
return $this->createNode($referenceTarget, $value);
8484
}
8585

86-
abstract protected function createNode(string $referenceName, string $referenceTarget): AbstractLinkInlineNode;
86+
abstract protected function createNode(string $referenceTarget, string|null $referenceName): AbstractLinkInlineNode;
8787
}

packages/guides/resources/config/guides.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@
1818
use phpDocumentor\Guides\NodeRenderers\InMemoryNodeRendererFactory;
1919
use phpDocumentor\Guides\NodeRenderers\NodeRendererFactory;
2020
use phpDocumentor\Guides\NodeRenderers\NodeRendererFactoryAware;
21-
use phpDocumentor\Guides\NodeRenderers\ReferenceResolvingNodeRendererFactory;
21+
use phpDocumentor\Guides\NodeRenderers\PreRenderers\PreNodeRendererFactory;
2222
use phpDocumentor\Guides\Parser;
2323
use phpDocumentor\Guides\ReferenceResolvers\DelegatingReferenceResolver;
2424
use phpDocumentor\Guides\ReferenceResolvers\DocReferenceResolver;
2525
use phpDocumentor\Guides\ReferenceResolvers\ExternalReferenceResolver;
2626
use phpDocumentor\Guides\ReferenceResolvers\InternalReferenceResolver;
2727
use phpDocumentor\Guides\ReferenceResolvers\ReferenceResolver;
28+
use phpDocumentor\Guides\ReferenceResolvers\ReferenceResolverPreRender;
2829
use phpDocumentor\Guides\ReferenceResolvers\RefReferenceResolver;
2930
use phpDocumentor\Guides\Renderer\HtmlRenderer;
3031
use phpDocumentor\Guides\Renderer\InMemoryRendererFactory;
@@ -141,10 +142,13 @@
141142
])
142143
->alias(NodeRendererFactory::class, InMemoryNodeRendererFactory::class)
143144

144-
->set(ReferenceResolvingNodeRendererFactory::class)
145+
->set(PreNodeRendererFactory::class)
145146
->decorate(NodeRendererFactory::class)
146147
->arg('$innerFactory', service('.inner'))
147-
->arg('$referenceResolver', service(DelegatingReferenceResolver::class))
148+
->arg('$preRenderers', tagged_iterator('phpdoc.guides.prerenderer'))
149+
150+
->set(ReferenceResolverPreRender::class)
151+
->tag('phpdoc.guides.prerenderer')
148152

149153
->set(InMemoryRendererFactory::class)
150154
->arg('$renderSets', tagged_iterator('phpdoc.renderer.typerenderer'))
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\NodeRenderers\PreRenderers;
6+
7+
use phpDocumentor\Guides\Nodes\Node;
8+
use phpDocumentor\Guides\RenderContext;
9+
10+
interface PreNodeRenderer
11+
{
12+
public function supports(Node $node): bool;
13+
14+
public function execute(Node $node, RenderContext $renderContext): Node;
15+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\NodeRenderers\PreRenderers;
6+
7+
use phpDocumentor\Guides\NodeRenderers\NodeRenderer;
8+
use phpDocumentor\Guides\NodeRenderers\NodeRendererFactory;
9+
use phpDocumentor\Guides\Nodes\Node;
10+
11+
use function count;
12+
13+
/**
14+
* Decorator to add pre-rendering logic to node renderers.
15+
*/
16+
final class PreNodeRendererFactory implements NodeRendererFactory
17+
{
18+
public function __construct(
19+
private NodeRendererFactory $innerFactory,
20+
/** @var iterable<PreNodeRenderer> */
21+
private iterable $preRenderers,
22+
) {
23+
}
24+
25+
public function get(Node $node): NodeRenderer
26+
{
27+
$preRenderers = [];
28+
foreach ($this->preRenderers as $preRenderer) {
29+
if (!$preRenderer->supports($node)) {
30+
continue;
31+
}
32+
33+
$preRenderers[] = $preRenderer;
34+
}
35+
36+
if (count($preRenderers) === 0) {
37+
return $this->innerFactory->get($node);
38+
}
39+
40+
return new PreRenderer($this->innerFactory->get($node), $preRenderers);
41+
}
42+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\NodeRenderers\PreRenderers;
6+
7+
use phpDocumentor\Guides\NodeRenderers\NodeRenderer;
8+
use phpDocumentor\Guides\Nodes\Node;
9+
use phpDocumentor\Guides\RenderContext;
10+
11+
/** @implements NodeRenderer<Node> */
12+
final class PreRenderer implements NodeRenderer
13+
{
14+
public function __construct(
15+
/** @var NodeRenderer<Node> */
16+
private readonly NodeRenderer $nodeRenderer,
17+
/** @var iterable<PreNodeRenderer> */
18+
private readonly iterable $preNodeRenderers,
19+
) {
20+
}
21+
22+
public function supports(Node $node): bool
23+
{
24+
return $this->nodeRenderer->supports($node);
25+
}
26+
27+
public function render(Node $node, RenderContext $renderContext): string
28+
{
29+
foreach ($this->preNodeRenderers as $preNodeRenderer) {
30+
$node = $preNodeRenderer->execute($node, $renderContext);
31+
}
32+
33+
return $this->nodeRenderer->render($node, $renderContext);
34+
}
35+
}

packages/guides/src/NodeRenderers/ReferenceResolverNodeRenderer.php

Lines changed: 0 additions & 34 deletions
This file was deleted.

packages/guides/src/NodeRenderers/ReferenceResolvingNodeRendererFactory.php

Lines changed: 0 additions & 30 deletions
This file was deleted.

packages/guides/src/ReferenceResolvers/ExternalReferenceResolver.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use phpDocumentor\Guides\Nodes\Inline\LinkInlineNode;
88
use phpDocumentor\Guides\RenderContext;
9-
use phpDocumentor\Guides\RestructuredText\Parser\InlineLexer;
109

1110
use function parse_url;
1211
use function preg_match;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\ReferenceResolvers;
6+
7+
use phpDocumentor\Guides\NodeRenderers\PreRenderers\PreNodeRenderer;
8+
use phpDocumentor\Guides\Nodes\Inline\LinkInlineNode;
9+
use phpDocumentor\Guides\Nodes\Node;
10+
use phpDocumentor\Guides\RenderContext;
11+
use Webmozart\Assert\Assert;
12+
13+
final class ReferenceResolverPreRender implements PreNodeRenderer
14+
{
15+
public function __construct(private readonly DelegatingReferenceResolver $referenceResolver)
16+
{
17+
}
18+
19+
public function supports(Node $node): bool
20+
{
21+
return $node instanceof LinkInlineNode;
22+
}
23+
24+
public function execute(Node $node, RenderContext $renderContext): Node
25+
{
26+
Assert::isInstanceOf($node, LinkInlineNode::class);
27+
$this->referenceResolver->resolve($node, $renderContext);
28+
29+
return $node;
30+
}
31+
}

0 commit comments

Comments
 (0)