Skip to content

Commit de27f61

Browse files
committed
[FEATURE] Introduce NavigationTitle
1 parent c116fed commit de27f61

File tree

19 files changed

+567
-4
lines changed

19 files changed

+567
-4
lines changed

packages/guides-restructured-text/resources/config/guides-restructured-text.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
use phpDocumentor\Guides\RestructuredText\Parser\Productions\FieldList\DateFieldListItemRule;
8282
use phpDocumentor\Guides\RestructuredText\Parser\Productions\FieldList\DedicationFieldListItemRule;
8383
use phpDocumentor\Guides\RestructuredText\Parser\Productions\FieldList\FieldListItemRule;
84+
use phpDocumentor\Guides\RestructuredText\Parser\Productions\FieldList\NavigationTitleFieldListItemRule;
8485
use phpDocumentor\Guides\RestructuredText\Parser\Productions\FieldList\NocommentsFieldListItemRule;
8586
use phpDocumentor\Guides\RestructuredText\Parser\Productions\FieldList\NosearchFieldListItemRule;
8687
use phpDocumentor\Guides\RestructuredText\Parser\Productions\FieldList\OrganizationFieldListItemRule;
@@ -320,6 +321,9 @@
320321
->set(DedicationFieldListItemRule::class)
321322
->tag('phpdoc.guides.parser.rst.fieldlist')
322323

324+
->set(NavigationTitleFieldListItemRule::class)
325+
->tag('phpdoc.guides.parser.rst.fieldlist')
326+
323327
->set(NocommentsFieldListItemRule::class)
324328
->tag('phpdoc.guides.parser.rst.fieldlist')
325329

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* This file is part of phpDocumentor.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*
11+
* @link https://phpdoc.org
12+
*/
13+
14+
namespace phpDocumentor\Guides\RestructuredText\Parser\Productions\FieldList;
15+
16+
use phpDocumentor\Guides\Nodes\FieldLists\FieldListItemNode;
17+
use phpDocumentor\Guides\Nodes\Metadata\MetadataNode;
18+
use phpDocumentor\Guides\Nodes\Metadata\NavigationTitleNode;
19+
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
20+
21+
use function strtolower;
22+
23+
final class NavigationTitleFieldListItemRule implements FieldListItemRule
24+
{
25+
public function applies(FieldListItemNode $fieldListItemNode): bool
26+
{
27+
return strtolower($fieldListItemNode->getTerm()) === 'navigation-title';
28+
}
29+
30+
public function apply(FieldListItemNode $fieldListItemNode, BlockContext $blockContext): MetadataNode
31+
{
32+
return new NavigationTitleNode($fieldListItemNode->getPlaintextContent());
33+
}
34+
}

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,23 @@
1515

1616
use phpDocumentor\Guides\Compiler\CompilerContextInterface;
1717
use phpDocumentor\Guides\Compiler\NodeTransformer;
18+
use phpDocumentor\Guides\Event\ModifyDocumentEntryAdditionalData;
1819
use phpDocumentor\Guides\Nodes\DocumentNode;
1920
use phpDocumentor\Guides\Nodes\DocumentTree\DocumentEntryNode;
2021
use phpDocumentor\Guides\Nodes\Node;
2122
use phpDocumentor\Guides\Nodes\TitleNode;
23+
use Psr\EventDispatcher\EventDispatcherInterface;
2224
use Psr\Log\LoggerInterface;
2325

26+
use function assert;
27+
use function is_string;
28+
2429
/** @implements NodeTransformer<Node> */
2530
final class DocumentEntryRegistrationTransformer implements NodeTransformer
2631
{
2732
public function __construct(
2833
private readonly LoggerInterface $logger,
34+
private readonly EventDispatcherInterface|null $eventDispatcher = null,
2935
) {
3036
}
3137

@@ -44,7 +50,23 @@ public function leaveNode(Node $node, CompilerContextInterface $compilerContext)
4450
$this->logger->warning('Document has no title', $compilerContext->getLoggerInformation());
4551
}
4652

47-
$entry = new DocumentEntryNode($node->getFilePath(), $node->getTitle() ?? TitleNode::emptyNode(), $node->isRoot());
53+
$additionalData = [];
54+
if (is_string($node->getNavigationTitle())) {
55+
$additionalData['navigationTitle'] = TitleNode::fromString($node->getNavigationTitle());
56+
}
57+
58+
if ($this->eventDispatcher !== null) {
59+
$event = $this->eventDispatcher->dispatch(new ModifyDocumentEntryAdditionalData($additionalData, $node, $compilerContext));
60+
assert($event instanceof ModifyDocumentEntryAdditionalData);
61+
$additionalData = $event->getAdditionalData();
62+
}
63+
64+
$entry = new DocumentEntryNode(
65+
$node->getFilePath(),
66+
$node->getTitle() ?? TitleNode::emptyNode(),
67+
$node->isRoot(),
68+
$additionalData,
69+
);
4870
$compilerContext->getProjectNode()->addDocumentEntry($entry);
4971

5072
return $node->setDocumentEntry($entry);

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use phpDocumentor\Guides\Nodes\Menu\MenuNode;
2121
use phpDocumentor\Guides\Nodes\Menu\TocNode;
2222
use phpDocumentor\Guides\Nodes\Node;
23+
use phpDocumentor\Guides\Nodes\TitleNode;
2324

2425
use function array_pop;
2526
use function assert;
@@ -65,10 +66,16 @@ protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $entryNo
6566
}
6667
}
6768

69+
$titleNode = $documentEntry->getTitle();
70+
$navigationTitle = $documentEntry->getAdditionalData('navigationTitle');
71+
if ($navigationTitle instanceof TitleNode) {
72+
$titleNode = $navigationTitle;
73+
}
74+
6875
$documentEntriesInTree[] = $documentEntry;
6976
$newEntryNode = new InternalMenuEntryNode(
7077
$documentEntry->getFile(),
71-
$documentEntry->getTitle(),
78+
$titleNode,
7279
[],
7380
false,
7481
1,

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use phpDocumentor\Guides\Nodes\Menu\MenuNode;
2020
use phpDocumentor\Guides\Nodes\Menu\TocNode;
2121
use phpDocumentor\Guides\Nodes\Node;
22+
use phpDocumentor\Guides\Nodes\TitleNode;
2223
use phpDocumentor\Guides\ReferenceResolvers\DocumentNameResolverInterface;
2324
use Psr\Log\LoggerInterface;
2425

@@ -63,10 +64,20 @@ protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $entryNo
6364
continue;
6465
}
6566

67+
$titleNode = $documentEntry->getTitle();
68+
$navigationTitle = $documentEntry->getAdditionalData('navigationTitle');
69+
if ($navigationTitle instanceof TitleNode) {
70+
$titleNode = $navigationTitle;
71+
}
72+
73+
if ($entryNode->getValue() instanceof TitleNode) {
74+
$titleNode = $entryNode->getValue();
75+
}
76+
6677
$documentEntriesInTree[] = $documentEntry;
6778
$newEntryNode = new InternalMenuEntryNode(
6879
$documentEntry->getFile(),
69-
$entryNode->getValue() ?? $documentEntry->getTitle(),
80+
$titleNode,
7081
[],
7182
false,
7283
1,
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* This file is part of phpDocumentor.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*
11+
* @link https://phpdoc.org
12+
*/
13+
14+
namespace phpDocumentor\Guides\Event;
15+
16+
use phpDocumentor\Guides\Compiler\CompilerContext;
17+
use phpDocumentor\Guides\Nodes\DocumentNode;
18+
use phpDocumentor\Guides\Nodes\Node;
19+
20+
final class ModifyDocumentEntryAdditionalData
21+
{
22+
/** @param array<string, Node> $additionalData */
23+
public function __construct(
24+
private array $additionalData,
25+
private readonly DocumentNode $documentNode,
26+
private readonly CompilerContext $compilerContext,
27+
) {
28+
}
29+
30+
/** @return array<string, Node> */
31+
public function getAdditionalData(): array
32+
{
33+
return $this->additionalData;
34+
}
35+
36+
/** @param array<string, Node> $additionalData */
37+
public function setAdditionalData(array $additionalData): ModifyDocumentEntryAdditionalData
38+
{
39+
$this->additionalData = $additionalData;
40+
41+
return $this;
42+
}
43+
44+
public function getDocumentNode(): DocumentNode
45+
{
46+
return $this->documentNode;
47+
}
48+
49+
public function getCompilerContext(): CompilerContext
50+
{
51+
return $this->compilerContext;
52+
}
53+
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use phpDocumentor\Guides\Nodes\Menu\InternalMenuEntryNode;
2020
use phpDocumentor\Guides\Nodes\Menu\MenuEntryNode;
2121
use phpDocumentor\Guides\Nodes\Node;
22+
use phpDocumentor\Guides\Nodes\TitleNode;
2223
use phpDocumentor\Guides\RenderContext;
2324
use phpDocumentor\Guides\TemplateRenderer;
2425

@@ -107,9 +108,15 @@ private function buildBreadcrumb(
107108
int $level,
108109
bool $isCurrent,
109110
): array {
111+
$title = $documentEntry->getTitle();
112+
$navigationTitle = $documentEntry->getAdditionalData('navigationTitle');
113+
if ($navigationTitle instanceof TitleNode) {
114+
$title = $navigationTitle;
115+
}
116+
110117
$entry = new InternalMenuEntryNode(
111118
$documentEntry->getFile(),
112-
$documentEntry->getTitle(),
119+
$title,
113120
[],
114121
false,
115122
$level,

packages/guides/src/Nodes/DocumentNode.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use phpDocumentor\Guides\Nodes\DocumentTree\SectionEntryNode;
2020
use phpDocumentor\Guides\Nodes\Menu\TocNode;
2121
use phpDocumentor\Guides\Nodes\Metadata\MetadataNode;
22+
use phpDocumentor\Guides\Nodes\Metadata\NavigationTitleNode;
2223

2324
use function array_filter;
2425
use function max;
@@ -52,6 +53,8 @@ final class DocumentNode extends CompoundNode
5253
private int $maxFootnoteNumber = 0;
5354
private int $lastReturnedAnonymousFootnoteNumber = -1;
5455

56+
private string|null $navigationTitle = null;
57+
5558
/**
5659
* Variables are replacements in a document or project.
5760
*
@@ -97,6 +100,11 @@ public function getNodes(string $nodeType = Node::class): array
97100
return array_filter($this->value, static fn ($node): bool => $node instanceof $nodeType);
98101
}
99102

103+
public function getNavigationTitle(): string|null
104+
{
105+
return $this->navigationTitle;
106+
}
107+
100108
public function getPageTitle(): string|null
101109
{
102110
if ($this->metaTitle !== null) {
@@ -132,6 +140,10 @@ public function setMetaTitle(string $metaTitle): void
132140

133141
public function addHeaderNode(MetadataNode $node): void
134142
{
143+
if ($node instanceof NavigationTitleNode) {
144+
$this->navigationTitle = $node->getValue();
145+
}
146+
135147
$this->headerNodes[] = $node;
136148
}
137149

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace phpDocumentor\Guides\Nodes\DocumentTree;
1515

16+
use phpDocumentor\Guides\Nodes\Node;
1617
use phpDocumentor\Guides\Nodes\SectionNode;
1718
use phpDocumentor\Guides\Nodes\TitleNode;
1819

@@ -27,10 +28,12 @@ final class DocumentEntryNode extends EntryNode
2728
/** @var SectionEntryNode[] */
2829
private array $sections = [];
2930

31+
/** @param array<string, Node> $additionalData */
3032
public function __construct(
3133
private readonly string $file,
3234
private readonly TitleNode $titleNode,
3335
private readonly bool $isRoot = false,
36+
private array $additionalData = [],
3437
) {
3538
}
3639

@@ -100,4 +103,14 @@ public function findSectionEntry(SectionNode $sectionNode): SectionEntryNode|nul
100103

101104
return null;
102105
}
106+
107+
public function getAdditionalData(string $key): Node|null
108+
{
109+
return $this->additionalData[$key] ?? null;
110+
}
111+
112+
public function addAdditionalData(string $key, Node $value): void
113+
{
114+
$this->additionalData[$key] = $value;
115+
}
103116
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* This file is part of phpDocumentor.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*
11+
* @link https://phpdoc.org
12+
*/
13+
14+
namespace phpDocumentor\Guides\Nodes\Metadata;
15+
16+
/**
17+
* The organization element contains the name of document author's organization,
18+
* or the organization responsible for the document.
19+
*/
20+
final class NavigationTitleNode extends MetadataNode
21+
{
22+
public function __construct(string $plaintext)
23+
{
24+
parent::__construct($plaintext);
25+
}
26+
}

0 commit comments

Comments
 (0)