diff --git a/src/Reference/ClassReference.php b/src/Reference/ClassReference.php index 462c0bd..c5bf2b3 100644 --- a/src/Reference/ClassReference.php +++ b/src/Reference/ClassReference.php @@ -32,19 +32,33 @@ public function resolve(Environment $environment, string $data): ResolvedReferen { $className = u($data)->replace('\\\\', '\\'); + /** + * Symfony AI classes require some special handling because of its monorepo structure. Example: + * + * input: Symfony\AI\Agent\Memory\StaticMemoryProvider + * output: https://github.com/symfony/ai/blob/main/src/agent/src/Memory/StaticMemoryProvider.php + */ if (str_starts_with($className, 'Symfony\\AI\\')) { - // Example: - // input: Symfony\AI\Agent\Memory\StaticMemoryProvider - // output: https://github.com/symfony/ai/blob/main/src/agent/src/Memory/StaticMemoryProvider.php - $classPath = $className->after('Symfony\\AI\\'); [$monorepoSubRepository, $classRelativePath] = $classPath->split('\\', 2); // because of monorepo structure, the first part of the classpath needs to be slugged // 'Agent' -> 'agent', 'AiBundle' -> 'ai-bundle', etc. - $monorepoSubRepository = u($monorepoSubRepository)->snake('-')->lower(); - $classRelativePath = u($classRelativePath)->replace('\\', '/'); + $monorepoSubRepository = $monorepoSubRepository->snake('-')->lower(); + $classRelativePath = $classRelativePath->replace('\\', '/'); $url = \sprintf('https://github.com/symfony/ai/blob/main/src/%s/src/%s.php', $monorepoSubRepository, $classRelativePath); + /** + * Symfony UX classes require some special handling because of its monorepo structure. Example: + * + * input: Symfony\UX\Chartjs\Twig\ChartExtension + * output: https://github.com/symfony/ux/blob/2.x/src/Chartjs/src/Twig/ChartExtension.php + */ + } elseif (str_starts_with($className, 'Symfony\\UX\\')) { + $classPath = $className->after('Symfony\\UX\\'); + [$monorepoSubRepository, $classRelativePath] = $classPath->split('\\', 2); + $classRelativePath = $classRelativePath->replace('\\', '/'); + + $url = \sprintf('https://github.com/symfony/ux/blob/2.x/src/%s/src/%s.php', $monorepoSubRepository, $classRelativePath); } else { $url = sprintf('%s/%s.php', $this->symfonyRepositoryUrl, $className->replace('\\', '/')); } diff --git a/tests/fixtures/expected/blocks/references/class.html b/tests/fixtures/expected/blocks/references/class.html index c0c4547..df524c4 100644 --- a/tests/fixtures/expected/blocks/references/class.html +++ b/tests/fixtures/expected/blocks/references/class.html @@ -1,3 +1,5 @@

ContainerAwareHttpKernel

StaticMemoryProvider

+ +

ChartExtension

diff --git a/tests/fixtures/source/blocks/references/class.rst b/tests/fixtures/source/blocks/references/class.rst index b66d355..7abfbc6 100644 --- a/tests/fixtures/source/blocks/references/class.rst +++ b/tests/fixtures/source/blocks/references/class.rst @@ -2,3 +2,5 @@ :class:`Symfony\\Component\\HttpKernel\\DependencyInjection\\ContainerAwareHttpKernel` :class:`Symfony\\AI\\Agent\\Memory\\StaticMemoryProvider` + +:class:`Symfony\\UX\\Chartjs\\Twig\\ChartExtension`