Skip to content

Commit 13c7676

Browse files
linawolfjaapio
authored andcommitted
[TASK] Split Anchor link resolvers
depends on #717
1 parent a4f80ed commit 13c7676

File tree

3 files changed

+61
-10
lines changed

3 files changed

+61
-10
lines changed

packages/guides/resources/config/guides.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use phpDocumentor\Guides\NodeRenderers\Html\TableNodeRenderer;
2020
use phpDocumentor\Guides\NodeRenderers\OutputAwareDelegatingNodeRenderer;
2121
use phpDocumentor\Guides\Parser;
22+
use phpDocumentor\Guides\ReferenceResolvers\AnchorHyperlinkResolver;
2223
use phpDocumentor\Guides\ReferenceResolvers\AnchorReducer;
2324
use phpDocumentor\Guides\ReferenceResolvers\AnchorReferenceResolver;
2425
use phpDocumentor\Guides\ReferenceResolvers\DelegatingReferenceResolver;
@@ -121,6 +122,8 @@
121122

122123
->set(EmailReferenceResolver::class)
123124

125+
->set(AnchorHyperlinkResolver::class)
126+
124127
->set(AnchorReferenceResolver::class)
125128

126129
->set(InternalReferenceResolver::class)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\ReferenceResolvers;
6+
7+
use phpDocumentor\Guides\Nodes\Inline\HyperLinkNode;
8+
use phpDocumentor\Guides\Nodes\Inline\LinkInlineNode;
9+
use phpDocumentor\Guides\RenderContext;
10+
use phpDocumentor\Guides\Renderer\UrlGenerator\UrlGeneratorInterface;
11+
12+
/**
13+
* Resolves references with an anchor URL.
14+
*
15+
* A link is an anchor if it starts with a hashtag
16+
*/
17+
class AnchorHyperlinkResolver implements ReferenceResolver
18+
{
19+
public final const PRIORITY = -100;
20+
21+
public function __construct(
22+
private readonly AnchorReducer $anchorReducer,
23+
private readonly UrlGeneratorInterface $urlGenerator,
24+
) {
25+
}
26+
27+
public function resolve(LinkInlineNode $node, RenderContext $renderContext): bool
28+
{
29+
if (!$node instanceof HyperLinkNode) {
30+
return false;
31+
}
32+
33+
$reducedAnchor = $this->anchorReducer->reduceAnchor($node->getTargetReference());
34+
$target = $renderContext->getProjectNode()->getInternalTarget($reducedAnchor);
35+
36+
if ($target === null) {
37+
return false;
38+
}
39+
40+
$node->setUrl($this->urlGenerator->generateCanonicalOutputUrl($renderContext, $target->getDocumentPath(), $target->getAnchor()));
41+
if ($node->getValue() === '') {
42+
$node->setValue($target->getTitle() ?? '');
43+
}
44+
45+
return true;
46+
}
47+
48+
public static function getPriority(): int
49+
{
50+
return self::PRIORITY;
51+
}
52+
}

packages/guides/src/ReferenceResolvers/AnchorReferenceResolver.php

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,14 @@ public function __construct(
2626

2727
public function resolve(LinkInlineNode $node, RenderContext $renderContext): bool
2828
{
29-
$reducedAnchor = $this->anchorReducer->reduceAnchor($node->getTargetReference());
30-
if ($node instanceof ReferenceNode) {
31-
if ($node->getInterlinkDomain() !== '') {
32-
return false;
33-
}
34-
35-
$target = $renderContext->getProjectNode()->getInternalTarget($reducedAnchor, $node->getLinkType());
36-
} else {
37-
// Todo: move this to a separate resolver?
38-
$target = $renderContext->getProjectNode()->getInternalTarget($reducedAnchor);
29+
if (!$node instanceof ReferenceNode) {
30+
return false;
3931
}
4032

33+
$reducedAnchor = $this->anchorReducer->reduceAnchor($node->getTargetReference());
34+
35+
$target = $renderContext->getProjectNode()->getInternalTarget($reducedAnchor, $node->getLinkType());
36+
4137
if ($target === null) {
4238
return false;
4339
}

0 commit comments

Comments
 (0)