Skip to content

Commit f6d5736

Browse files
committed
!!![TASK] Restructure Menu handling
1 parent a6c2154 commit f6d5736

File tree

79 files changed

+1405
-588
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1405
-588
lines changed

packages/guides-restructured-text/src/RestructuredText/Directives/ContentsDirective.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
namespace phpDocumentor\Guides\RestructuredText\Directives;
66

77
use phpDocumentor\Guides\Nodes\Menu\ContentMenuNode;
8-
use phpDocumentor\Guides\Nodes\Menu\MenuDefinitionLineNode;
8+
use phpDocumentor\Guides\Nodes\Menu\InternalMenuEntryNode;
9+
use phpDocumentor\Guides\Nodes\Menu\SectionMenuEntryNode;
910
use phpDocumentor\Guides\Nodes\Node;
1011
use phpDocumentor\Guides\ReferenceResolvers\DocumentNameResolverInterface;
1112
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
@@ -39,7 +40,7 @@ public function process(
3940
$blockContext->getDocumentParserContext()->getContext()->getCurrentFileName(),
4041
);
4142

42-
return (new ContentMenuNode([new MenuDefinitionLineNode($absoluteUrl)]))
43+
return (new ContentMenuNode([new SectionMenuEntryNode($absoluteUrl, null)]))
4344
->withOptions($this->optionsToArray($options))
4445
->withCaption($directive->getDataNode());
4546
}

packages/guides-restructured-text/src/RestructuredText/Directives/MenuDirective.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace phpDocumentor\Guides\RestructuredText\Directives;
66

7-
use phpDocumentor\Guides\Nodes\Menu\MenuDefinitionLineNode;
7+
use phpDocumentor\Guides\Nodes\Menu\GlobMenuEntryNode;
88
use phpDocumentor\Guides\Nodes\Menu\NavMenuNode;
99
use phpDocumentor\Guides\Nodes\Node;
1010
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
@@ -49,7 +49,7 @@ public function process(
4949
$options,
5050
);
5151
if (count($toctreeFiles) === 0) {
52-
$toctreeFiles[] = new MenuDefinitionLineNode('/*');
52+
$toctreeFiles[] = new GlobMenuEntryNode('/*');
5353
}
5454

5555
return (new NavMenuNode($toctreeFiles))->withOptions($this->optionsToArray($options));
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\RestructuredText\Parser\Reference;
6+
7+
final class ReferenceData
8+
{
9+
public function __construct(
10+
public readonly string $reference,
11+
public readonly string|null $text,
12+
) {
13+
}
14+
}

packages/guides-restructured-text/src/RestructuredText/Toc/ToctreeBuilder.php

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,22 @@
44

55
namespace phpDocumentor\Guides\RestructuredText\Toc;
66

7+
use phpDocumentor\Guides\Nodes\Menu\ExternalMenuEntryNode;
8+
use phpDocumentor\Guides\Nodes\Menu\GlobMenuEntryNode;
9+
use phpDocumentor\Guides\Nodes\Menu\InternalMenuEntryNode;
710
use phpDocumentor\Guides\Nodes\Menu\MenuDefinitionLineNode;
11+
use phpDocumentor\Guides\Nodes\Menu\MenuEntryNode;
12+
use phpDocumentor\Guides\Nodes\TitleNode;
813
use phpDocumentor\Guides\ParserContext;
914
use phpDocumentor\Guides\RestructuredText\Parser\LinesIterator;
10-
use phpDocumentor\Guides\RestructuredText\Parser\References\EmbeddedReferenceParser;
15+
use phpDocumentor\Guides\RestructuredText\Parser\Reference\EmbeddedReferenceParser;
1116

1217
use function array_filter;
1318
use function array_map;
19+
use function filter_var;
20+
use function str_contains;
21+
22+
use const FILTER_VALIDATE_URL;
1423

1524
class ToctreeBuilder
1625
{
@@ -19,7 +28,7 @@ class ToctreeBuilder
1928
/**
2029
* @param mixed[] $options
2130
*
22-
* @return MenuDefinitionLineNode[]
31+
* @return MenuEntryNode[]
2332
*/
2433
public function buildToctreeEntries(
2534
ParserContext $parserContext,
@@ -35,7 +44,7 @@ public function buildToctreeEntries(
3544
return $toctreeEntries;
3645
}
3746

38-
/** @return MenuDefinitionLineNode[] */
47+
/** @return MenuEntryNode[] */
3948
private function parseToctreeEntryLines(LinesIterator $lines): array
4049
{
4150
$linesArray = array_filter(
@@ -45,8 +54,18 @@ private function parseToctreeEntryLines(LinesIterator $lines): array
4554

4655
$result = [];
4756
foreach ($linesArray as $line) {
48-
$referenceData = $this->extractEmbeddedReference($line);
49-
$result[] = new MenuDefinitionLineNode($referenceData->reference, $referenceData->text);
57+
$referenceData = $this->extractEmbeddedUri($line);
58+
if (filter_var($referenceData->reference, FILTER_VALIDATE_URL) !== false) {
59+
$result[] = new ExternalMenuEntryNode($referenceData->reference, TitleNode::fromString($referenceData->text ?? $referenceData->reference));
60+
continue;
61+
}
62+
63+
if (str_contains($referenceData->reference, '*')) {
64+
$result[] = new GlobMenuEntryNode($referenceData->reference);
65+
continue;
66+
}
67+
68+
$result[] = new InternalMenuEntryNode($referenceData->reference, $referenceData->text === null ? null : TitleNode::fromString($referenceData->text));
5069
}
5170

5271
return $result;

packages/guides/resources/config/guides.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use phpDocumentor\Guides\Compiler\DocumentNodeTraverser;
99
use phpDocumentor\Guides\Compiler\NodeTransformer;
1010
use phpDocumentor\Guides\Compiler\NodeTransformers\CustomNodeTransformerFactory;
11+
use phpDocumentor\Guides\Compiler\NodeTransformers\MenuNodeTransformers\InternalMenuEntryNodeTransformer;
1112
use phpDocumentor\Guides\Compiler\NodeTransformers\NodeTransformerFactory;
1213
use phpDocumentor\Guides\Interlink\DefaultInventoryLoader;
1314
use phpDocumentor\Guides\Interlink\DefaultInventoryRepository;
@@ -84,12 +85,20 @@
8485
'phpDocumentor\\Guides\\Compiler\\NodeTransformers\\',
8586
'%vendor_dir%/phpdocumentor/guides/src/Compiler/NodeTransformers/*Transformer.php',
8687
)
88+
->load(
89+
'phpDocumentor\\Guides\\Compiler\\NodeTransformers\\MenuNodeTransformers\\',
90+
'%vendor_dir%/phpdocumentor/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/*Transformer.php',
91+
)
8792

8893
->load(
8994
'phpDocumentor\\Guides\\Compiler\\Passes\\',
9095
'%vendor_dir%/phpdocumentor/guides/src/Compiler/Passes/*Pass.php',
9196
)
9297

98+
->set(InternalMenuEntryNodeTransformer::class)
99+
->tag('phpdoc.guides.compiler.nodeTransformers')
100+
101+
93102
->set(AbsoluteUrlGenerator::class)
94103
->set(RelativeUrlGenerator::class)
95104
->set(UrlGeneratorInterface::class, ConfigurableUrlGenerator::class)
Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
{% apply spaceless %}
2-
<div class="contents">
3-
{% if node.caption %}
4-
<p class="topic-title">{{ renderNode(node.caption) }}</p>
5-
{% endif %}
6-
{% include "body/menu/menu-level.html.twig" %}
7-
</div>
8-
{% endapply %}
1+
<div class="contents">
2+
{% if node.caption %}
3+
<p class="topic-title">{{ renderNode(node.caption) }}</p>
4+
{% endif %}
5+
{% include "body/menu/menu-level.html.twig" %}
6+
</div>

packages/guides/src/Compiler/NodeTransformer.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,8 @@ public function leaveNode(Node $node, CompilerContext $compilerContext): Node|nu
2626
/** @psalm-assert-if-true T $node */
2727
public function supports(Node $node): bool;
2828

29+
/**
30+
* The higher the priority the earlier the NodeTransformer is executed.
31+
*/
2932
public function getPriority(): int;
3033
}

0 commit comments

Comments
 (0)