diff --git a/packages/framework/src/Framework/Actions/GeneratesDocumentationSearchIndex.php b/packages/framework/src/Framework/Actions/GeneratesDocumentationSearchIndex.php index 7cd75691d9d..cdd0ec0907a 100644 --- a/packages/framework/src/Framework/Actions/GeneratesDocumentationSearchIndex.php +++ b/packages/framework/src/Framework/Actions/GeneratesDocumentationSearchIndex.php @@ -55,10 +55,10 @@ protected function run(): void protected function generatePageEntry(DocumentationPage $page): array { return [ - 'slug' => basename($page->identifier), + 'slug' => basename($page->routeKey), 'title' => $page->title, 'content' => trim($this->getSearchContentForDocument($page)), - 'destination' => $this->formatDestination(basename($page->identifier)), + 'destination' => $this->formatDestination(basename($page->routeKey)), ]; } diff --git a/packages/framework/src/Framework/Factories/HydePageDataFactory.php b/packages/framework/src/Framework/Factories/HydePageDataFactory.php index ddedce7823d..a08df2d6a98 100644 --- a/packages/framework/src/Framework/Factories/HydePageDataFactory.php +++ b/packages/framework/src/Framework/Factories/HydePageDataFactory.php @@ -10,6 +10,7 @@ use Hyde\Markdown\Contracts\FrontMatter\PageSchema; use Hyde\Framework\Factories\Concerns\CoreDataObject; use Hyde\Framework\Features\Navigation\NavigationData; +use Hyde\Framework\Features\Navigation\NumericalPageOrderingHelper; use function basename; use function dirname; @@ -68,7 +69,18 @@ private function findTitleForPage(): string return $this->getMatter('title') ?? $this->findTitleFromMarkdownHeadings() ?? $this->findTitleFromParentIdentifier() - ?? Hyde::makeTitle(basename($this->identifier)); + ?? Hyde::makeTitle($this->getCleanBasename()); + } + + private function getCleanBasename(): string + { + $basename = basename($this->identifier); + + if (NumericalPageOrderingHelper::hasNumericalPrefix($basename)) { + return NumericalPageOrderingHelper::splitNumericPrefix($basename)[1]; + } + + return $basename; } private function findTitleFromMarkdownHeadings(): ?string @@ -87,7 +99,13 @@ private function findTitleFromMarkdownHeadings(): ?string private function findTitleFromParentIdentifier(): ?string { if (str_contains($this->identifier, '/') && str_ends_with($this->identifier, '/index')) { - return Hyde::makeTitle(basename(dirname($this->identifier))); + $parentBasename = basename(dirname($this->identifier)); + + if (NumericalPageOrderingHelper::hasNumericalPrefix($parentBasename)) { + $parentBasename = NumericalPageOrderingHelper::splitNumericPrefix($parentBasename)[1]; + } + + return Hyde::makeTitle($parentBasename); } return null; diff --git a/packages/framework/tests/Feature/Services/DocumentationSearchServiceTest.php b/packages/framework/tests/Feature/Services/DocumentationSearchServiceTest.php index cb0fd00e8e1..61f20194713 100644 --- a/packages/framework/tests/Feature/Services/DocumentationSearchServiceTest.php +++ b/packages/framework/tests/Feature/Services/DocumentationSearchServiceTest.php @@ -114,6 +114,31 @@ public function testNestedSourceFilesDoNotRetainDirectoryNameInSearchIndex() ); } + public function testNumericPrefixesAreStrippedFromSearchResults() + { + $this->file('_docs/01-foo.md'); + + $this->assertSame([[ + 'slug' => 'foo', + 'title' => 'Foo', + 'content' => '', + 'destination' => 'foo.html', + ]], $this->getArray()); + } + + public function testNumericPrefixesAreRemovedFromNestedSearchResults() + { + $this->directory(Hyde::path('_docs/01-category')); + $this->file('_docs/01-category/02-item-name.md'); + + $result = $this->getArray()[0]; + + $this->assertSame('item-name', $result['slug']); + $this->assertSame('item-name.html', $result['destination']); + $this->assertStringNotContainsString('02-', json_encode($result)); + $this->assertStringNotContainsString('01-', json_encode($result)); + } + protected function getArray(): array { return json_decode(GeneratesDocumentationSearchIndex::handle(), true); diff --git a/packages/framework/tests/Unit/HydePageDataFactoryTest.php b/packages/framework/tests/Unit/HydePageDataFactoryTest.php index 65b26353449..6e27ab473b3 100644 --- a/packages/framework/tests/Unit/HydePageDataFactoryTest.php +++ b/packages/framework/tests/Unit/HydePageDataFactoryTest.php @@ -72,6 +72,26 @@ public function testNavigationDataIsGeneratedByNavigationDataFactory() $this->assertInstanceOf(NavigationData::class, $this->factory()->toArray()['navigation']); } + public function testTitleStripsNumericalPrefixFromBasename() + { + $this->assertSame('Foo', $this->factoryFromPage(new MarkdownPage('01-foo'))->toArray()['title']); + } + + public function testTitleStripsNumericalPrefixFromNestedBasename() + { + $this->assertSame('Bar', $this->factoryFromPage(new MarkdownPage('foo/02-bar'))->toArray()['title']); + } + + public function testIndexPageTitleStripsNumericalPrefixFromParentIdentifierBasename() + { + $this->assertSame('Foo', $this->factoryFromPage(new MarkdownPage('01-foo/index'))->toArray()['title']); + } + + public function testIndexPageTitleStripsNumericalPrefixFromNestedParentIdentifierBasename() + { + $this->assertSame('Bar', $this->factoryFromPage(new MarkdownPage('foo/02-bar/index'))->toArray()['title']); + } + protected function factory(array $data = []): HydePageDataFactory { return $this->factoryFromPage(new InMemoryPage('', $data));