Skip to content

Commit 4546dc8

Browse files
committed
Display sections in simple toctree
1 parent accf732 commit 4546dc8

File tree

18 files changed

+108
-413
lines changed

18 files changed

+108
-413
lines changed
Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
<li class="toc-item"><a href="{{ url }}">{{ renderNode(node.value.value) }}</a>
2-
32
{%- if node.children|length %}
4-
{% include "body/menu/menu-level.html.twig" with {
5-
tocItems:tocItem.children
6-
} %}
3+
<ul class="menu-level-{{ node.level }}">
4+
{% for child in node.children -%}
5+
{{ renderNode(child) }}
6+
{% endfor %}
7+
</ul>
8+
{%- endif -%}
9+
{%- if node.sections|length %}
10+
<ul class="section-level-{{ node.level }}">
11+
{% for subsection in node.sections -%}
12+
{{ renderNode(subsection) }}
13+
{% endfor %}
14+
</ul>
715
{%- endif -%}
816
</li>

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ public function leaveNode(Node $node, CompilerContext $compilerContext): Node|nu
3737

3838
$entry = new DocumentEntryNode($node->getFilePath(), $node->getTitle() ?? TitleNode::emptyNode());
3939
$compilerContext->getProjectNode()->addDocumentEntry($entry);
40+
$node->setDocumentEntry($entry);
4041

41-
return $node->withDocumentEntry($entry);
42+
return $node;
4243
}
4344

4445
public function supports(Node $node): bool

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

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

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212

1313
use function array_pop;
1414
use function assert;
15+
use function count;
1516
use function end;
16-
use function sizeof;
1717

1818
/** @implements NodeTransformer<Node> */
1919
class SectionEntryRegistrationTransformer implements NodeTransformer
2020
{
21-
/** @var SectionEntryNode $sectionStack */
21+
/** @var SectionEntryNode[] $sectionStack */
2222
private array $sectionStack = [];
2323

2424
public function enterNode(Node $node, CompilerContext $compilerContext): Node
@@ -28,8 +28,8 @@ public function enterNode(Node $node, CompilerContext $compilerContext): Node
2828
}
2929

3030
$sectionEntryNode = new SectionEntryNode($node->getTitle());
31-
if (sizeof($this->sectionStack) === 0) {
32-
$compilerContext->getDocumentNode()->getDocumentEntry()->addSection($sectionEntryNode);
31+
if (count($this->sectionStack) === 0) {
32+
$compilerContext->getDocumentNode()->getDocumentEntry()?->addSection($sectionEntryNode);
3333
} else {
3434
$parentSection = end($this->sectionStack);
3535
assert($parentSection instanceof SectionEntryNode);

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

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77
use phpDocumentor\Guides\Compiler\CompilerContext;
88
use phpDocumentor\Guides\Compiler\NodeTransformer;
99
use phpDocumentor\Guides\Nodes\DocumentTree\DocumentEntryNode;
10-
use phpDocumentor\Guides\Nodes\Menu\MenuEntry;
10+
use phpDocumentor\Guides\Nodes\DocumentTree\SectionEntryNode;
11+
use phpDocumentor\Guides\Nodes\Menu\MenuEntryNode;
1112
use phpDocumentor\Guides\Nodes\Menu\MenuNode;
1213
use phpDocumentor\Guides\Nodes\Menu\TocNode;
1314
use phpDocumentor\Guides\Nodes\Node;
1415

1516
use function array_pop;
17+
use function assert;
18+
use function count;
1619
use function explode;
1720
use function implode;
1821
use function preg_match;
@@ -43,23 +46,34 @@ public function leaveNode(Node $node, CompilerContext $compilerContext): Node|nu
4346

4447
foreach ($files as $file) {
4548
foreach ($documentEntries as $documentEntry) {
46-
if ($this->isEqualAbsolutePath($documentEntry, $file, $currentPath, $glob)) {
47-
$documentEntriesInTree[] = $documentEntry;
48-
$menuEntry = new MenuEntry($documentEntry->getFile(), $documentEntry->getTitle(), [], false);
49-
$menuEntries[] = $menuEntry;
50-
if (!$glob) {
51-
// If blob is not set, there may only be one result per listed file
52-
break;
53-
}
54-
} elseif ($this->isEqualRelativePath($documentEntry, $file, $currentPath, $glob)) {
55-
$documentEntriesInTree[] = $documentEntry;
56-
$menuEntry = new MenuEntry($documentEntry->getFile(), $documentEntry->getTitle(), [], false, 1);
57-
$menuEntries[] = $menuEntry;
58-
if (!$glob) {
59-
// If blob is not set, there may only be one result per listed file
60-
break;
49+
if (!$this->isEqualAbsolutePath($documentEntry, $file, $currentPath, $glob) && !$this->isEqualRelativePath($documentEntry, $file, $currentPath, $glob)) {
50+
continue;
51+
}
52+
53+
$documentEntriesInTree[] = $documentEntry;
54+
$menuEntry = new MenuEntryNode($documentEntry->getFile(), $documentEntry->getTitle(), [], false, 1);
55+
if (!$node->hasOption('titlesonly') && count($documentEntry->getSections()) > 0) {
56+
foreach ($documentEntry->getSections() as $section) {
57+
// We do not add the main section as it repeats the document title
58+
if (count($section->getChildren()) <= 0) {
59+
continue;
60+
}
61+
62+
foreach ($section->getChildren() as $subSectionEntryNode) {
63+
assert($subSectionEntryNode instanceof SectionEntryNode);
64+
$currentLevel = $menuEntry->getLevel() + 1;
65+
$sectionMenuEntry = new MenuEntryNode($documentEntry->getFile(), $subSectionEntryNode->getTitle(), [], false, $currentLevel, $subSectionEntryNode->getId());
66+
$menuEntry->addSection($sectionMenuEntry);
67+
$this->addSubSections($sectionMenuEntry, $subSectionEntryNode, $documentEntry, $currentLevel);
68+
}
6169
}
6270
}
71+
72+
$menuEntries[] = $menuEntry;
73+
if (!$glob) {
74+
// If glob is not set, there may only be one result per listed file
75+
break;
76+
}
6377
}
6478
}
6579

@@ -68,6 +82,14 @@ public function leaveNode(Node $node, CompilerContext $compilerContext): Node|nu
6882
return $node;
6983
}
7084

85+
private function addSubSections(MenuEntryNode $sectionMenuEntry, SectionEntryNode $sectionEntryNode, DocumentEntryNode $documentEntry, int $currentLevel): void
86+
{
87+
foreach ($sectionEntryNode->getChildren() as $subSectionEntryNode) {
88+
$sectionMenuEntry = new MenuEntryNode($documentEntry->getFile(), $subSectionEntryNode->getTitle(), [], false, $currentLevel, $subSectionEntryNode->getId());
89+
$sectionMenuEntry->addSection($sectionMenuEntry);
90+
}
91+
}
92+
7193
public function supports(Node $node): bool
7294
{
7395
return $node instanceof MenuNode;

packages/guides/src/Meta/DocumentReferenceEntry.php

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

packages/guides/src/NodeRenderers/Html/MenuEntryRenderer.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
namespace phpDocumentor\Guides\NodeRenderers\Html;
66

77
use phpDocumentor\Guides\NodeRenderers\NodeRenderer;
8-
use phpDocumentor\Guides\Nodes\Menu\MenuEntry;
8+
use phpDocumentor\Guides\Nodes\Menu\MenuEntryNode;
99
use phpDocumentor\Guides\Nodes\Node;
1010
use phpDocumentor\Guides\RenderContext;
1111
use phpDocumentor\Guides\TemplateRenderer;
1212

13-
/** @implements NodeRenderer<MenuEntry> */
13+
/** @implements NodeRenderer<MenuEntryNode> */
1414
final class MenuEntryRenderer implements NodeRenderer
1515
{
1616
public function __construct(private readonly TemplateRenderer $renderer)
@@ -19,7 +19,7 @@ public function __construct(private readonly TemplateRenderer $renderer)
1919

2020
public function supports(Node $node): bool
2121
{
22-
return $node instanceof MenuEntry;
22+
return $node instanceof MenuEntryNode;
2323
}
2424

2525
public function render(Node $node, RenderContext $renderContext): string

packages/guides/src/Nodes/DocumentNode.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -250,12 +250,9 @@ public function getDocumentEntry(): DocumentEntryNode|null
250250
return $this->documentEntry;
251251
}
252252

253-
public function withDocumentEntry(DocumentEntryNode $documentEntry): DocumentNode
253+
public function setDocumentEntry(DocumentEntryNode $documentEntry): void
254254
{
255-
$node = clone$this;
256-
$node->documentEntry = $documentEntry;
257-
258-
return $node;
255+
$this->documentEntry = $documentEntry;
259256
}
260257

261258
public function getRootSectionEntry(): SectionEntryNode|null

packages/guides/src/Nodes/DocumentTree/DocumentEntryNode.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
use phpDocumentor\Guides\Nodes\TitleNode;
1010

1111
/** @extends AbstractNode<DocumentNode> */
12-
class DocumentEntryNode extends AbstractNode implements Entry
12+
class DocumentEntryNode extends AbstractNode
1313
{
14-
/** @var Entry[] */
14+
/** @var DocumentEntryNode[] */
1515
private array $entries = [];
1616
/** @var SectionEntryNode[] */
1717
private array $sections = [];
@@ -26,12 +26,12 @@ public function getTitle(): TitleNode
2626
return $this->titleNode;
2727
}
2828

29-
public function addChild(Entry $child): void
29+
public function addChild(DocumentEntryNode $child): void
3030
{
3131
$this->entries[] = $child;
3232
}
3333

34-
/** {@inheritDoc} */
34+
/** @return DocumentEntryNode[] */
3535
public function getChildren(): array
3636
{
3737
return $this->entries;

packages/guides/src/Nodes/DocumentTree/Entry.php

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

0 commit comments

Comments
 (0)