Skip to content

Commit 2904b83

Browse files
committed
[TASK] Move shared functions to trait
1 parent 32dd079 commit 2904b83

File tree

7 files changed

+140
-112
lines changed

7 files changed

+140
-112
lines changed

packages/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/AbstractMenuEntryNodeTransformer.php

Lines changed: 0 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,13 @@
77
use Exception;
88
use phpDocumentor\Guides\Compiler\CompilerContext;
99
use phpDocumentor\Guides\Compiler\NodeTransformer;
10-
use phpDocumentor\Guides\Nodes\DocumentTree\DocumentEntryNode;
11-
use phpDocumentor\Guides\Nodes\DocumentTree\SectionEntryNode;
12-
use phpDocumentor\Guides\Nodes\Menu\InternalMenuEntryNode;
1310
use phpDocumentor\Guides\Nodes\Menu\MenuEntryNode;
1411
use phpDocumentor\Guides\Nodes\Menu\MenuNode;
15-
use phpDocumentor\Guides\Nodes\Menu\SectionMenuEntryNode;
1612
use phpDocumentor\Guides\Nodes\Node;
1713
use Psr\Log\LoggerInterface;
1814

1915
use function assert;
2016
use function count;
21-
use function sprintf;
22-
use function str_starts_with;
2317

2418
/** @implements NodeTransformer<MenuNode|MenuEntryNode> */
2519
abstract class AbstractMenuEntryNodeTransformer implements NodeTransformer
@@ -73,104 +67,4 @@ final public function leaveNode(Node $node, CompilerContext $compilerContext): N
7367

7468
/** @return list<MenuEntryNode> */
7569
abstract protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $node, CompilerContext $compilerContext): array;
76-
77-
protected function addSubSectionsToMenuEntries(DocumentEntryNode $documentEntry, InternalMenuEntryNode|SectionMenuEntryNode $menuEntry, int $maxLevel): void
78-
{
79-
foreach ($documentEntry->getSections() as $section) {
80-
// We do not add the main section as it repeats the document title
81-
foreach ($section->getChildren() as $subSectionEntryNode) {
82-
assert($subSectionEntryNode instanceof SectionEntryNode);
83-
$currentLevel = $menuEntry->getLevel() + 1;
84-
$sectionMenuEntry = new SectionMenuEntryNode(
85-
$documentEntry->getFile(),
86-
$subSectionEntryNode->getTitle(),
87-
[],
88-
false,
89-
$currentLevel,
90-
$subSectionEntryNode->getId(),
91-
);
92-
$menuEntry->addSection($sectionMenuEntry);
93-
$this->addSubSections($sectionMenuEntry, $subSectionEntryNode, $documentEntry, $currentLevel, $maxLevel);
94-
}
95-
}
96-
}
97-
98-
private function addSubSections(
99-
SectionMenuEntryNode $sectionMenuEntry,
100-
SectionEntryNode $sectionEntryNode,
101-
DocumentEntryNode $documentEntry,
102-
int $currentLevel,
103-
int $maxLevel,
104-
): void {
105-
if ($currentLevel >= $maxLevel) {
106-
return;
107-
}
108-
109-
foreach ($sectionEntryNode->getChildren() as $subSectionEntryNode) {
110-
$subSectionMenuEntry = new SectionMenuEntryNode(
111-
$documentEntry->getFile(),
112-
$subSectionEntryNode->getTitle(),
113-
[],
114-
false,
115-
$currentLevel,
116-
$subSectionEntryNode->getId(),
117-
);
118-
$sectionMenuEntry->addSection($subSectionMenuEntry);
119-
$this->addSubSections(
120-
$subSectionMenuEntry,
121-
$subSectionEntryNode,
122-
$documentEntry,
123-
$currentLevel + 1,
124-
$maxLevel,
125-
);
126-
}
127-
}
128-
129-
/** @param DocumentEntryNode[] $documentEntriesInTree */
130-
protected function attachDocumentEntriesToParents(
131-
array $documentEntriesInTree,
132-
CompilerContext $compilerContext,
133-
string $currentPath,
134-
): void {
135-
foreach ($documentEntriesInTree as $documentEntryInToc) {
136-
if ($documentEntryInToc->isRoot() || $currentPath === $documentEntryInToc->getFile()) {
137-
// The root page may not be attached to any other
138-
continue;
139-
}
140-
141-
if ($documentEntryInToc->getParent() !== null && $documentEntryInToc->getParent() !== $compilerContext->getDocumentNode()->getDocumentEntry()) {
142-
$this->logger->warning(sprintf(
143-
'Document %s has been added to parents %s and %s. The `toctree` directive changes the '
144-
. 'position of documents in the document tree. Use the `menu` directive to only display a menu without changing the document tree.',
145-
$documentEntryInToc->getFile(),
146-
$documentEntryInToc->getParent()->getFile(),
147-
$compilerContext->getDocumentNode()->getDocumentEntry()->getFile(),
148-
), $compilerContext->getLoggerInformation());
149-
}
150-
151-
if ($documentEntryInToc->getParent() !== null) {
152-
continue;
153-
}
154-
155-
$documentEntryInToc->setParent($compilerContext->getDocumentNode()->getDocumentEntry());
156-
$compilerContext->getDocumentNode()->getDocumentEntry()->addChild($documentEntryInToc);
157-
}
158-
}
159-
160-
protected function isInRootline(DocumentEntryNode $menuEntry, DocumentEntryNode $currentDoc): bool
161-
{
162-
return $menuEntry->getFile() === $currentDoc->getFile()
163-
|| ($currentDoc->getParent() !== null
164-
&& self::isInRootline($menuEntry, $currentDoc->getParent()));
165-
}
166-
167-
protected function isCurrent(DocumentEntryNode $menuEntry, string $currentPath): bool
168-
{
169-
return $menuEntry->getFile() === $currentPath;
170-
}
171-
172-
protected static function isAbsoluteFile(string $expectedFile): bool
173-
{
174-
return str_starts_with($expectedFile, '/');
175-
}
17670
}

packages/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/ContentsMenuEntryNodeTransformer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
final class ContentsMenuEntryNodeTransformer extends AbstractMenuEntryNodeTransformer
2020
{
21+
use SubSectionHierarchyHandler;
22+
2123
private const DEFAULT_MAX_LEVELS = PHP_INT_MAX;
2224

2325
public function __construct(

packages/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/GlobMenuEntryNodeTransformer.php

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
use function in_array;
2121
use function preg_match;
2222
use function str_replace;
23-
use function str_starts_with;
2423

2524
final class GlobMenuEntryNodeTransformer extends AbstractMenuEntryNodeTransformer
2625
{
26+
use MenuEntryManagement;
27+
use SubSectionHierarchyHandler;
28+
2729
// Setting a default level prevents PHP errors in case of circular references
2830
private const DEFAULT_MAX_LEVELS = 10;
2931

@@ -127,9 +129,4 @@ private static function isGlob(string $documentEntryFile, string $currentPath, s
127129

128130
return false;
129131
}
130-
131-
public static function isAbsoluteFile(string $expectedFile): bool
132-
{
133-
return str_starts_with($expectedFile, '/');
134-
}
135132
}

packages/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/InternalMenuEntryNodeTransformer.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919

2020
class InternalMenuEntryNodeTransformer extends AbstractMenuEntryNodeTransformer
2121
{
22+
use MenuEntryManagement;
23+
use SubSectionHierarchyHandler;
24+
2225
// Setting a default level prevents PHP errors in case of circular references
2326
private const DEFAULT_MAX_LEVELS = 10;
2427

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\Compiler\NodeTransformers\MenuNodeTransformers;
6+
7+
use phpDocumentor\Guides\Compiler\CompilerContext;
8+
use phpDocumentor\Guides\Nodes\DocumentTree\DocumentEntryNode;
9+
10+
use function sprintf;
11+
use function str_starts_with;
12+
13+
trait MenuEntryManagement
14+
{
15+
/** @param DocumentEntryNode[] $documentEntriesInTree */
16+
private function attachDocumentEntriesToParents(
17+
array $documentEntriesInTree,
18+
CompilerContext $compilerContext,
19+
string $currentPath,
20+
): void {
21+
foreach ($documentEntriesInTree as $documentEntryInToc) {
22+
if ($documentEntryInToc->isRoot() || $currentPath === $documentEntryInToc->getFile()) {
23+
// The root page may not be attached to any other
24+
continue;
25+
}
26+
27+
if ($documentEntryInToc->getParent() !== null && $documentEntryInToc->getParent() !== $compilerContext->getDocumentNode()->getDocumentEntry()) {
28+
$this->logger->warning(sprintf(
29+
'Document %s has been added to parents %s and %s. The `toctree` directive changes the '
30+
. 'position of documents in the document tree. Use the `menu` directive to only display a menu without changing the document tree.',
31+
$documentEntryInToc->getFile(),
32+
$documentEntryInToc->getParent()->getFile(),
33+
$compilerContext->getDocumentNode()->getDocumentEntry()->getFile(),
34+
), $compilerContext->getLoggerInformation());
35+
}
36+
37+
if ($documentEntryInToc->getParent() !== null) {
38+
continue;
39+
}
40+
41+
$documentEntryInToc->setParent($compilerContext->getDocumentNode()->getDocumentEntry());
42+
$compilerContext->getDocumentNode()->getDocumentEntry()->addChild($documentEntryInToc);
43+
}
44+
}
45+
46+
private function isInRootline(DocumentEntryNode $menuEntry, DocumentEntryNode $currentDoc): bool
47+
{
48+
return $menuEntry->getFile() === $currentDoc->getFile()
49+
|| ($currentDoc->getParent() !== null
50+
&& self::isInRootline($menuEntry, $currentDoc->getParent()));
51+
}
52+
53+
private function isCurrent(DocumentEntryNode $menuEntry, string $currentPath): bool
54+
{
55+
return $menuEntry->getFile() === $currentPath;
56+
}
57+
58+
private static function isAbsoluteFile(string $expectedFile): bool
59+
{
60+
return str_starts_with($expectedFile, '/');
61+
}
62+
}

packages/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/SubInternalMenuEntryNodeTransformer.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
class SubInternalMenuEntryNodeTransformer extends AbstractMenuEntryNodeTransformer
2020
{
21+
use MenuEntryManagement;
22+
use SubSectionHierarchyHandler;
23+
2124
// Setting a default level prevents PHP errors in case of circular references
2225
private const DEFAULT_MAX_LEVELS = 10;
2326

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\Compiler\NodeTransformers\MenuNodeTransformers;
6+
7+
use phpDocumentor\Guides\Nodes\DocumentTree\DocumentEntryNode;
8+
use phpDocumentor\Guides\Nodes\DocumentTree\SectionEntryNode;
9+
use phpDocumentor\Guides\Nodes\Menu\InternalMenuEntryNode;
10+
use phpDocumentor\Guides\Nodes\Menu\SectionMenuEntryNode;
11+
12+
use function assert;
13+
14+
trait SubSectionHierarchyHandler
15+
{
16+
private function addSubSectionsToMenuEntries(DocumentEntryNode $documentEntry, InternalMenuEntryNode|SectionMenuEntryNode $menuEntry, int $maxLevel): void
17+
{
18+
foreach ($documentEntry->getSections() as $section) {
19+
// We do not add the main section as it repeats the document title
20+
foreach ($section->getChildren() as $subSectionEntryNode) {
21+
assert($subSectionEntryNode instanceof SectionEntryNode);
22+
$currentLevel = $menuEntry->getLevel() + 1;
23+
$sectionMenuEntry = new SectionMenuEntryNode(
24+
$documentEntry->getFile(),
25+
$subSectionEntryNode->getTitle(),
26+
[],
27+
false,
28+
$currentLevel,
29+
$subSectionEntryNode->getId(),
30+
);
31+
$menuEntry->addSection($sectionMenuEntry);
32+
$this->addSubSections($sectionMenuEntry, $subSectionEntryNode, $documentEntry, $currentLevel, $maxLevel);
33+
}
34+
}
35+
}
36+
37+
private function addSubSections(
38+
SectionMenuEntryNode $sectionMenuEntry,
39+
SectionEntryNode $sectionEntryNode,
40+
DocumentEntryNode $documentEntry,
41+
int $currentLevel,
42+
int $maxLevel,
43+
): void {
44+
if ($currentLevel >= $maxLevel) {
45+
return;
46+
}
47+
48+
foreach ($sectionEntryNode->getChildren() as $subSectionEntryNode) {
49+
$subSectionMenuEntry = new SectionMenuEntryNode(
50+
$documentEntry->getFile(),
51+
$subSectionEntryNode->getTitle(),
52+
[],
53+
false,
54+
$currentLevel,
55+
$subSectionEntryNode->getId(),
56+
);
57+
$sectionMenuEntry->addSection($subSectionMenuEntry);
58+
$this->addSubSections(
59+
$subSectionMenuEntry,
60+
$subSectionEntryNode,
61+
$documentEntry,
62+
$currentLevel + 1,
63+
$maxLevel,
64+
);
65+
}
66+
}
67+
}

0 commit comments

Comments
 (0)