Skip to content

!!![TASK] Restructure Menu handling #799

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Jan 5, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace phpDocumentor\Guides\RestructuredText\Directives;

use phpDocumentor\Guides\Nodes\Menu\ContentMenuNode;
use phpDocumentor\Guides\Nodes\Menu\MenuDefinitionLineNode;
use phpDocumentor\Guides\Nodes\Menu\SectionMenuEntryNode;
use phpDocumentor\Guides\Nodes\Node;
use phpDocumentor\Guides\ReferenceResolvers\DocumentNameResolverInterface;
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
Expand Down Expand Up @@ -39,7 +39,7 @@ public function process(
$blockContext->getDocumentParserContext()->getContext()->getCurrentFileName(),
);

return (new ContentMenuNode([new MenuDefinitionLineNode($absoluteUrl)]))
return (new ContentMenuNode([new SectionMenuEntryNode($absoluteUrl, null)]))
->withOptions($this->optionsToArray($options))
->withCaption($directive->getDataNode());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace phpDocumentor\Guides\RestructuredText\Directives;

use phpDocumentor\Guides\Nodes\Menu\MenuDefinitionLineNode;
use phpDocumentor\Guides\Nodes\Menu\GlobMenuEntryNode;
use phpDocumentor\Guides\Nodes\Menu\NavMenuNode;
use phpDocumentor\Guides\Nodes\Node;
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
Expand Down Expand Up @@ -49,7 +49,7 @@ public function process(
$options,
);
if (count($toctreeFiles) === 0) {
$toctreeFiles[] = new MenuDefinitionLineNode('/*');
$toctreeFiles[] = new GlobMenuEntryNode('/*');
}

return (new NavMenuNode($toctreeFiles))->withOptions($this->optionsToArray($options));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

declare(strict_types=1);

namespace phpDocumentor\Guides\RestructuredText\Parser\Reference;

final class ReferenceData
{
public function __construct(
public readonly string $reference,
public readonly string|null $text,
) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,21 @@

namespace phpDocumentor\Guides\RestructuredText\Toc;

use phpDocumentor\Guides\Nodes\Menu\MenuDefinitionLineNode;
use phpDocumentor\Guides\Nodes\Menu\ExternalMenuEntryNode;
use phpDocumentor\Guides\Nodes\Menu\GlobMenuEntryNode;
use phpDocumentor\Guides\Nodes\Menu\InternalMenuEntryNode;
use phpDocumentor\Guides\Nodes\Menu\MenuEntryNode;
use phpDocumentor\Guides\Nodes\TitleNode;
use phpDocumentor\Guides\ParserContext;
use phpDocumentor\Guides\RestructuredText\Parser\LinesIterator;
use phpDocumentor\Guides\RestructuredText\Parser\References\EmbeddedReferenceParser;

use function array_filter;
use function array_map;
use function filter_var;
use function str_contains;

use const FILTER_VALIDATE_URL;

class ToctreeBuilder
{
Expand All @@ -19,7 +27,7 @@ class ToctreeBuilder
/**
* @param mixed[] $options
*
* @return MenuDefinitionLineNode[]
* @return MenuEntryNode[]
*/
public function buildToctreeEntries(
ParserContext $parserContext,
Expand All @@ -35,7 +43,7 @@ public function buildToctreeEntries(
return $toctreeEntries;
}

/** @return MenuDefinitionLineNode[] */
/** @return MenuEntryNode[] */
private function parseToctreeEntryLines(LinesIterator $lines): array
{
$linesArray = array_filter(
Expand All @@ -46,7 +54,17 @@ private function parseToctreeEntryLines(LinesIterator $lines): array
$result = [];
foreach ($linesArray as $line) {
$referenceData = $this->extractEmbeddedReference($line);
$result[] = new MenuDefinitionLineNode($referenceData->reference, $referenceData->text);
if (filter_var($referenceData->reference, FILTER_VALIDATE_URL) !== false) {
$result[] = new ExternalMenuEntryNode($referenceData->reference, TitleNode::fromString($referenceData->text ?? $referenceData->reference));
continue;
}

if (str_contains($referenceData->reference, '*')) {
$result[] = new GlobMenuEntryNode($referenceData->reference);
continue;
}

$result[] = new InternalMenuEntryNode($referenceData->reference, $referenceData->text === null ? null : TitleNode::fromString($referenceData->text));
}

return $result;
Expand Down
9 changes: 9 additions & 0 deletions packages/guides/resources/config/guides.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use phpDocumentor\Guides\Compiler\DocumentNodeTraverser;
use phpDocumentor\Guides\Compiler\NodeTransformer;
use phpDocumentor\Guides\Compiler\NodeTransformers\CustomNodeTransformerFactory;
use phpDocumentor\Guides\Compiler\NodeTransformers\MenuNodeTransformers\InternalMenuEntryNodeTransformer;
use phpDocumentor\Guides\Compiler\NodeTransformers\NodeTransformerFactory;
use phpDocumentor\Guides\Interlink\DefaultInventoryLoader;
use phpDocumentor\Guides\Interlink\DefaultInventoryRepository;
Expand Down Expand Up @@ -84,12 +85,20 @@
'phpDocumentor\\Guides\\Compiler\\NodeTransformers\\',
'%vendor_dir%/phpdocumentor/guides/src/Compiler/NodeTransformers/*Transformer.php',
)
->load(
'phpDocumentor\\Guides\\Compiler\\NodeTransformers\\MenuNodeTransformers\\',
'%vendor_dir%/phpdocumentor/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/*Transformer.php',
)

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

->set(InternalMenuEntryNodeTransformer::class)
->tag('phpdoc.guides.compiler.nodeTransformers')


->set(AbsoluteUrlGenerator::class)
->set(RelativeUrlGenerator::class)
->set(UrlGeneratorInterface::class, ConfigurableUrlGenerator::class)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
{% apply spaceless %}
<div class="contents">
{% if node.caption %}
<p class="topic-title">{{ renderNode(node.caption) }}</p>
{% endif %}
{% include "body/menu/menu-level.html.twig" %}
</div>
{% endapply %}
<div class="contents">
{% if node.caption %}
<p class="topic-title">{{ renderNode(node.caption) }}</p>
{% endif %}
{% include "body/menu/menu-level.html.twig" %}
</div>
3 changes: 3 additions & 0 deletions packages/guides/src/Compiler/NodeTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,8 @@ public function leaveNode(Node $node, CompilerContext $compilerContext): Node|nu
/** @psalm-assert-if-true T $node */
public function supports(Node $node): bool;

/**
* The higher the priority the earlier the NodeTransformer is executed.
*/
public function getPriority(): int;
}

This file was deleted.

Loading