Skip to content

Commit d160f4c

Browse files
authored
Merge pull request #799 from phpDocumentor/task/improve-menu-items2
!!![TASK] Restructure Menu handling
2 parents adde014 + 456cce2 commit d160f4c

File tree

87 files changed

+1764
-984
lines changed

Some content is hidden

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

87 files changed

+1764
-984
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
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\SectionMenuEntryNode;
99
use phpDocumentor\Guides\Nodes\Node;
1010
use phpDocumentor\Guides\ReferenceResolvers\DocumentNameResolverInterface;
1111
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
@@ -39,7 +39,7 @@ public function process(
3939
$blockContext->getDocumentParserContext()->getContext()->getCurrentFileName(),
4040
);
4141

42-
return (new ContentMenuNode([new MenuDefinitionLineNode($absoluteUrl)]))
42+
return (new ContentMenuNode([new SectionMenuEntryNode($absoluteUrl)]))
4343
->withOptions($this->optionsToArray($options))
4444
->withCaption($directive->getDataNode());
4545
}

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: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,21 @@
44

55
namespace phpDocumentor\Guides\RestructuredText\Toc;
66

7-
use phpDocumentor\Guides\Nodes\Menu\MenuDefinitionLineNode;
7+
use phpDocumentor\Guides\Nodes\Menu\ExternalMenuEntryNode;
8+
use phpDocumentor\Guides\Nodes\Menu\GlobMenuEntryNode;
9+
use phpDocumentor\Guides\Nodes\Menu\InternalMenuEntryNode;
10+
use phpDocumentor\Guides\Nodes\Menu\MenuEntryNode;
11+
use phpDocumentor\Guides\Nodes\TitleNode;
812
use phpDocumentor\Guides\ParserContext;
913
use phpDocumentor\Guides\RestructuredText\Parser\LinesIterator;
1014
use phpDocumentor\Guides\RestructuredText\Parser\References\EmbeddedReferenceParser;
1115

1216
use function array_filter;
1317
use function array_map;
18+
use function filter_var;
19+
use function str_contains;
20+
21+
use const FILTER_VALIDATE_URL;
1422

1523
class ToctreeBuilder
1624
{
@@ -19,7 +27,7 @@ class ToctreeBuilder
1927
/**
2028
* @param mixed[] $options
2129
*
22-
* @return MenuDefinitionLineNode[]
30+
* @return MenuEntryNode[]
2331
*/
2432
public function buildToctreeEntries(
2533
ParserContext $parserContext,
@@ -35,7 +43,7 @@ public function buildToctreeEntries(
3543
return $toctreeEntries;
3644
}
3745

38-
/** @return MenuDefinitionLineNode[] */
46+
/** @return MenuEntryNode[] */
3947
private function parseToctreeEntryLines(LinesIterator $lines): array
4048
{
4149
$linesArray = array_filter(
@@ -46,7 +54,17 @@ private function parseToctreeEntryLines(LinesIterator $lines): array
4654
$result = [];
4755
foreach ($linesArray as $line) {
4856
$referenceData = $this->extractEmbeddedReference($line);
49-
$result[] = new MenuDefinitionLineNode($referenceData->reference, $referenceData->text);
57+
if (filter_var($referenceData->reference, FILTER_VALIDATE_URL) !== false) {
58+
$result[] = new ExternalMenuEntryNode($referenceData->reference, TitleNode::fromString($referenceData->text ?? $referenceData->reference));
59+
continue;
60+
}
61+
62+
if (str_contains($referenceData->reference, '*')) {
63+
$result[] = new GlobMenuEntryNode($referenceData->reference);
64+
continue;
65+
}
66+
67+
$result[] = new InternalMenuEntryNode($referenceData->reference, $referenceData->text === null ? null : TitleNode::fromString($referenceData->text));
5068
}
5169

5270
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
}

packages/guides/src/Compiler/NodeTransformers/ContentMenuNodeWithSectionEntryTransformer.php

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

0 commit comments

Comments
 (0)