Skip to content

Commit e5d047e

Browse files
committed
[BUGFIX] Prefere anchors over titles in references
References phpDocumentor/guides#970 (cherry picked from commit 1af4aad5403fe743ea46d2996bd85e1ba4cca19f)
1 parent 5be39be commit e5d047e

File tree

5 files changed

+72
-2
lines changed

5 files changed

+72
-2
lines changed

resources/config/guides.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
use phpDocumentor\Guides\ReferenceResolvers\ReferenceResolver;
4141
use phpDocumentor\Guides\ReferenceResolvers\ReferenceResolverPreRender;
4242
use phpDocumentor\Guides\ReferenceResolvers\SluggerAnchorNormalizer;
43+
use phpDocumentor\Guides\ReferenceResolvers\TitleReferenceResolver;
4344
use phpDocumentor\Guides\Renderer\HtmlRenderer;
4445
use phpDocumentor\Guides\Renderer\InMemoryRendererFactory;
4546
use phpDocumentor\Guides\Renderer\InterlinkObjectsRenderer;
@@ -146,6 +147,8 @@
146147

147148
->set(AnchorReferenceResolver::class)
148149

150+
->set(TitleReferenceResolver::class)
151+
149152
->set(InternalReferenceResolver::class)
150153

151154
->set(DocReferenceResolver::class)

src/Compiler/NodeTransformers/CollectLinkTargetsTransformer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public function enterNode(Node $node, CompilerContextInterface $compilerContext)
8888
$currentDocument->getFilePath(),
8989
$anchorName,
9090
$node->getLinkText(),
91-
$node->getLinkType(),
91+
SectionNode::STD_TITLE,
9292
),
9393
);
9494

src/Nodes/SectionNode.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
final class SectionNode extends CompoundNode implements LinkTargetNode
2020
{
2121
public const STD_LABEL = 'std:label';
22+
public const STD_TITLE = 'std:title';
2223

2324
public function __construct(private readonly TitleNode $title)
2425
{

src/ReferenceResolvers/AnchorHyperlinkResolver.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use phpDocumentor\Guides\Nodes\Inline\HyperLinkNode;
1717
use phpDocumentor\Guides\Nodes\Inline\LinkInlineNode;
18+
use phpDocumentor\Guides\Nodes\SectionNode;
1819
use phpDocumentor\Guides\RenderContext;
1920
use phpDocumentor\Guides\Renderer\UrlGenerator\UrlGeneratorInterface;
2021

@@ -43,7 +44,10 @@ public function resolve(LinkInlineNode $node, RenderContext $renderContext, Mess
4344
$target = $renderContext->getProjectNode()->getInternalTarget($reducedAnchor);
4445

4546
if ($target === null) {
46-
return false;
47+
$target = $renderContext->getProjectNode()->getInternalTarget($reducedAnchor, SectionNode::STD_TITLE);
48+
if ($target === null) {
49+
return false;
50+
}
4751
}
4852

4953
$node->setUrl($this->urlGenerator->generateCanonicalOutputUrl($renderContext, $target->getDocumentPath(), $target->getAnchor()));
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* This file is part of phpDocumentor.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*
11+
* @link https://phpdoc.org
12+
*/
13+
14+
namespace phpDocumentor\Guides\ReferenceResolvers;
15+
16+
use phpDocumentor\Guides\Nodes\Inline\LinkInlineNode;
17+
use phpDocumentor\Guides\Nodes\Inline\ReferenceNode;
18+
use phpDocumentor\Guides\Nodes\SectionNode;
19+
use phpDocumentor\Guides\RenderContext;
20+
use phpDocumentor\Guides\Renderer\UrlGenerator\UrlGeneratorInterface;
21+
22+
/**
23+
* Resolves references with an anchor URL.
24+
*
25+
* A link is an anchor if it starts with a hashtag
26+
*/
27+
final class TitleReferenceResolver implements ReferenceResolver
28+
{
29+
public final const PRIORITY = -200;
30+
31+
public function __construct(
32+
private readonly AnchorNormalizer $anchorReducer,
33+
private readonly UrlGeneratorInterface $urlGenerator,
34+
) {
35+
}
36+
37+
public function resolve(LinkInlineNode $node, RenderContext $renderContext, Messages $messages): bool
38+
{
39+
if (!$node instanceof ReferenceNode || $node->getInterlinkDomain() !== '') {
40+
return false;
41+
}
42+
43+
$reducedAnchor = $this->anchorReducer->reduceAnchor($node->getTargetReference());
44+
$target = $renderContext->getProjectNode()->getInternalTarget($reducedAnchor, SectionNode::STD_TITLE);
45+
46+
if ($target === null) {
47+
return false;
48+
}
49+
50+
$node->setUrl($this->urlGenerator->generateCanonicalOutputUrl($renderContext, $target->getDocumentPath(), $target->getPrefix() . $target->getAnchor()));
51+
if ($node->getValue() === '') {
52+
$node->setValue($target->getTitle() ?? '');
53+
}
54+
55+
return true;
56+
}
57+
58+
public static function getPriority(): int
59+
{
60+
return self::PRIORITY;
61+
}
62+
}

0 commit comments

Comments
 (0)