-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[FEATURE] Render main menu JSON (#757)
- Loading branch information
Showing
13 changed files
with
626 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3 changes: 3 additions & 0 deletions
3
packages/typo3-docs-theme/resources/template/body/directive/main-menu-json.html.twig
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{#- | ||
This directive is only supported in JSON output | ||
-#} |
47 changes: 47 additions & 0 deletions
47
packages/typo3-docs-theme/src/Directives/MainMenuJsonDirective.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace T3Docs\Typo3DocsTheme\Directives; | ||
|
||
use phpDocumentor\Guides\Nodes\CollectionNode; | ||
use phpDocumentor\Guides\Nodes\InlineCompoundNode; | ||
use phpDocumentor\Guides\Nodes\Node; | ||
use phpDocumentor\Guides\RestructuredText\Directives\SubDirective; | ||
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext; | ||
use phpDocumentor\Guides\RestructuredText\Parser\Directive; | ||
use phpDocumentor\Guides\RestructuredText\Parser\Productions\Rule; | ||
use T3Docs\Typo3DocsTheme\Nodes\MainMenuJsonNode; | ||
|
||
/** | ||
* Used in the main documentation page docs.typo3.org to configure | ||
* the main menu docs.typo3.org/mainMenu.json. | ||
* | ||
* To be used together with the MainMenuJsonRenderer and the template | ||
* :template: mainMenu.json | ||
*/ | ||
class MainMenuJsonDirective extends SubDirective | ||
{ | ||
public function __construct( | ||
Rule $startingRule, | ||
) { | ||
parent::__construct($startingRule); | ||
} | ||
|
||
public function getName(): string | ||
{ | ||
return 'main-menu-json'; | ||
} | ||
|
||
protected function processSub( | ||
BlockContext $blockContext, | ||
CollectionNode $collectionNode, | ||
Directive $directive, | ||
): Node|null { | ||
return new MainMenuJsonNode( | ||
$directive->getData(), | ||
$directive->getDataNode() ?? new InlineCompoundNode(), | ||
$collectionNode->getChildren(), | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
<?php | ||
|
||
namespace T3Docs\Typo3DocsTheme\Nodes; | ||
|
||
use phpDocumentor\Guides\Nodes\InlineCompoundNode; | ||
use phpDocumentor\Guides\Nodes\Node; | ||
use phpDocumentor\Guides\RestructuredText\Nodes\GeneralDirectiveNode; | ||
|
||
final class MainMenuJsonNode extends GeneralDirectiveNode | ||
{ | ||
/** | ||
* @param Node[] $value | ||
*/ | ||
public function __construct( | ||
protected readonly string $plainContent, | ||
protected readonly InlineCompoundNode $content, | ||
array $value = [], | ||
) { | ||
parent::__construct('main-menu-json', $plainContent, $content, $value); | ||
} | ||
|
||
} |
47 changes: 47 additions & 0 deletions
47
packages/typo3-docs-theme/src/Renderer/MainMenuJsonRenderer.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
<?php | ||
|
||
namespace T3Docs\Typo3DocsTheme\Renderer; | ||
|
||
use phpDocumentor\Guides\Handlers\RenderCommand; | ||
use phpDocumentor\Guides\RenderContext; | ||
use phpDocumentor\Guides\Renderer\TypeRenderer; | ||
use T3Docs\Typo3DocsTheme\Nodes\Metadata\TemplateNode; | ||
use T3Docs\Typo3DocsTheme\Renderer\NodeRenderer\MainMenuJsonDocumentRenderer; | ||
|
||
final class MainMenuJsonRenderer implements TypeRenderer | ||
{ | ||
public function __construct( | ||
private readonly MainMenuJsonDocumentRenderer $renderer | ||
) {} | ||
|
||
public function render(RenderCommand $renderCommand): void | ||
{ | ||
$projectNode = $renderCommand->getProjectNode(); | ||
|
||
$context = RenderContext::forProject( | ||
$projectNode, | ||
$renderCommand->getDocumentArray(), | ||
$renderCommand->getOrigin(), | ||
$renderCommand->getDestination(), | ||
$renderCommand->getDestinationPath(), | ||
'mainmenujson', | ||
)->withIterator($renderCommand->getDocumentIterator()) | ||
->withOutputFilePath('mainmenu.json'); | ||
|
||
foreach ($renderCommand->getDocumentArray() as $key => $document) { | ||
$headerNodes = $document->getHeaderNodes(); | ||
foreach ($headerNodes as $headerNode) { | ||
if ($headerNode instanceof TemplateNode && $headerNode->getValue() === 'mainmenu.json') { | ||
$context = $context->withDocument($document); | ||
$renderCommand->getDestination()->put( | ||
'mainmenu.json', | ||
$this->renderer->render( | ||
$document, | ||
$context, | ||
), | ||
); | ||
} | ||
} | ||
} | ||
} | ||
} |
118 changes: 118 additions & 0 deletions
118
packages/typo3-docs-theme/src/Renderer/NodeRenderer/MainMenuJsonDocumentRenderer.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
<?php | ||
|
||
namespace T3Docs\Typo3DocsTheme\Renderer\NodeRenderer; | ||
|
||
use phpDocumentor\Guides\NodeRenderers\NodeRenderer; | ||
use phpDocumentor\Guides\Nodes\CollectionNode; | ||
use phpDocumentor\Guides\Nodes\CompoundNode; | ||
use phpDocumentor\Guides\Nodes\DocumentNode; | ||
use phpDocumentor\Guides\Nodes\Inline\LinkInlineNode; | ||
use phpDocumentor\Guides\Nodes\ListItemNode; | ||
use phpDocumentor\Guides\Nodes\ListNode; | ||
use phpDocumentor\Guides\Nodes\Node; | ||
use phpDocumentor\Guides\ReferenceResolvers\DelegatingReferenceResolver; | ||
use phpDocumentor\Guides\ReferenceResolvers\Messages; | ||
use phpDocumentor\Guides\RenderContext; | ||
use T3Docs\Typo3DocsTheme\Nodes\MainMenuJsonNode; | ||
|
||
/** @implements NodeRenderer<Node> */ | ||
class MainMenuJsonDocumentRenderer implements NodeRenderer | ||
{ | ||
public function __construct( | ||
private readonly DelegatingReferenceResolver $delegatingReferenceResolver, | ||
) {} | ||
|
||
public function supports(string $nodeFqcn): bool | ||
{ | ||
return DocumentNode::class === $nodeFqcn; | ||
} | ||
|
||
public function render(Node $node, RenderContext $renderContext): string | ||
{ | ||
$result = ''; | ||
if ($node instanceof DocumentNode) { | ||
foreach ($node->getChildren() as $childNode) { | ||
$result .= $this->render($childNode, $renderContext); | ||
} | ||
} | ||
if ($node instanceof CollectionNode) { | ||
foreach ($node->getChildren() as $childNode) { | ||
$result .= $this->render($childNode, $renderContext); | ||
} | ||
} | ||
if (!$node instanceof MainMenuJsonNode) { | ||
return $result; | ||
} | ||
return $result . $this->renderMainMenu($node, $renderContext); | ||
} | ||
|
||
private function renderMainMenu(MainMenuJsonNode $node, RenderContext $renderContext): string | ||
{ | ||
$stringResult = ''; | ||
$result = []; | ||
foreach ($node->getChildren() as $listNode) { | ||
$this->renderSubEntry($listNode, $renderContext, $result); | ||
} | ||
return $stringResult . json_encode($result, JSON_PRETTY_PRINT); | ||
} | ||
|
||
/** | ||
* @param array<mixed> $result | ||
*/ | ||
public function renderSubEntry(Node $node, RenderContext $renderContext, array &$result): void | ||
{ | ||
if ($node instanceof ListNode) { | ||
foreach ($node->getChildren() as $listItemNode) { | ||
if (!$listItemNode instanceof ListItemNode) { | ||
continue; | ||
} | ||
$menuEntry = []; | ||
foreach ($listItemNode->getChildren() as $childNode) { | ||
if ($childNode instanceof ListNode) { | ||
$this->renderSubEntryList($menuEntry, $childNode, $renderContext); | ||
} elseif ($childNode instanceof CompoundNode) { | ||
$this->renderMenuEntry($menuEntry, $childNode, $renderContext); | ||
} | ||
} | ||
$result[] = $menuEntry; | ||
} | ||
} elseif ($node instanceof CompoundNode) { | ||
foreach ($node->getChildren() as $childNode) { | ||
$this->renderSubEntry($childNode, $renderContext, $result); | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* @param array<mixed> $menuEntry | ||
*/ | ||
private function renderMenuEntry(array &$menuEntry, Node $node, RenderContext $renderContext): void | ||
{ | ||
if ($node instanceof CompoundNode) { | ||
foreach ($node->getChildren() as $childNode) { | ||
$this->renderMenuEntry($menuEntry, $childNode, $renderContext); | ||
} | ||
return; | ||
} | ||
if ($node instanceof LinkInlineNode) { | ||
$this->delegatingReferenceResolver->resolve($node, $renderContext, new Messages()); | ||
$url = $node->getUrl(); | ||
$parsedUrl = parse_url($url); | ||
if (!isset($parsedUrl['scheme'])) { | ||
$url = 'https://docs.typo3.org/' . $url; | ||
} | ||
$menuEntry['name'] = $node->getValue(); | ||
$menuEntry['href'] = $url; | ||
} | ||
} | ||
/** | ||
* @param array<mixed> $menuEntry | ||
*/ | ||
private function renderSubEntryList(array &$menuEntry, ListNode $listNode, RenderContext $renderContext): void | ||
{ | ||
$subListItems = []; | ||
$this->renderSubEntry($listNode, $renderContext, $subListItems); | ||
$menuEntry['children'] = $subListItems; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.