Skip to content

Commit 014cc7d

Browse files
committed
-
1 parent ac4184a commit 014cc7d

File tree

12 files changed

+286
-175
lines changed

12 files changed

+286
-175
lines changed

src/DocsKernel.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,6 @@ private function initializeListeners(EventManager $eventManager, ErrorManager $e
4949
new CopyImagesListener($this->buildConfig, $errorManager)
5050
);
5151

52-
$eventManager->addEventListener(
53-
PreNodeRenderEvent::PRE_NODE_RENDER,
54-
new TocCustomizerListener($this->buildConfig, $errorManager)
55-
);
56-
5752
if (!$this->buildConfig->getSubdirectoryToBuild()) {
5853
$eventManager->addEventListener(
5954
[PostBuildRenderEvent::POST_BUILD_RENDER],

src/Generator/JsonGenerator.php

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace SymfonyDocsBuilder\Generator;
1313

14+
use Doctrine\RST\Environment;
1415
use Doctrine\RST\Meta\MetaEntry;
1516
use Doctrine\RST\Meta\Metas;
1617
use Symfony\Component\Console\Helper\ProgressBar;
@@ -19,6 +20,7 @@
1920
use Symfony\Component\DomCrawler\Crawler;
2021
use Symfony\Component\Filesystem\Filesystem;
2122
use SymfonyDocsBuilder\BuildConfig;
23+
use function Symfony\Component\String\u;
2224

2325
class JsonGenerator
2426
{
@@ -65,15 +67,14 @@ public function generateJson(string $masterDocument = 'index'): array
6567

6668
$crawler = new Crawler(file_get_contents($this->buildConfig->getOutputDir().'/'.$filename.'.html'));
6769

68-
$tocGenerator = new TocGenerator($metaEntry);
6970
$next = $this->determineNext($parserFilename, $flattenedTocTree, $masterDocument);
7071
$prev = $this->determinePrev($parserFilename, $flattenedTocTree);
7172
$data = [
7273
'title' => $metaEntry->getTitle(),
7374
'parents' => $this->determineParents($parserFilename, $tocTreeHierarchy) ?: [],
7475
'current_page_name' => $parserFilename,
75-
'toc' => $tocGenerator->getToc(),
76-
'toc_num_items' => $tocGenerator->getNumItemsPerLevel(),
76+
'toc' => $toc = $this->generateToc($metaEntry, current($metaEntry->getTitles())[1]),
77+
'toc_options' => $this->getTocOptions($toc),
7778
'next' => $next,
7879
'prev' => $prev,
7980
'body' => $crawler->filter('body')->html(),
@@ -98,6 +99,72 @@ public function setOutput(SymfonyStyle $output)
9899
$this->output = $output;
99100
}
100101

102+
private function generateToc(MetaEntry $metaEntry, ?array $titles, int $level = 1): array
103+
{
104+
if (null === $titles) {
105+
return [];
106+
}
107+
108+
$tocTree = [];
109+
110+
foreach ($titles as $title) {
111+
$tocTree[] = [
112+
'level' => $level,
113+
'url' => sprintf('%s#%s', $metaEntry->getUrl(), Environment::slugify($title[0])),
114+
'page' => u($metaEntry->getUrl())->beforeLast('.html'),
115+
'fragment' => Environment::slugify($title[0]),
116+
'title' => $title[0],
117+
'children' => $this->generateToc($metaEntry, $title[1], $level + 1),
118+
];
119+
}
120+
121+
return $tocTree;
122+
}
123+
124+
private function getTocOptions(array $toc): array
125+
{
126+
$flattendToc = $this->flattenToc($toc);
127+
$maxDepth = 0;
128+
$numVisibleItems = 0;
129+
foreach ($flattendToc as $tocItem) {
130+
$maxDepth = max($maxDepth, $tocItem['level']);
131+
$numVisibleItems++;
132+
}
133+
134+
return [
135+
'maxDepth' => $maxDepth,
136+
'numVisibleItems' => $numVisibleItems,
137+
'size' => $this->getTocSize($numVisibleItems),
138+
];
139+
}
140+
141+
// If you change this method, make the same change in TocNodeRenderer too
142+
private function getTocSize(int $numVisibleItems): string
143+
{
144+
if ($numVisibleItems < 10) {
145+
return 'md';
146+
}
147+
148+
if ($numVisibleItems < 20) {
149+
return 'lg';
150+
}
151+
152+
return 'xl';
153+
}
154+
155+
private function flattenToc(array $toc, array &$flattenedToc = []): array
156+
{
157+
foreach ($toc as $item) {
158+
$flattenedToc[] = $item;
159+
160+
if ([] !== $item['children']) {
161+
$this->flattenToc($item['children'], $flattenedToc);
162+
}
163+
}
164+
165+
return $flattenedToc;
166+
}
167+
101168
private function determineNext(string $parserFilename, array $flattenedTocTree): ?array
102169
{
103170
$foundCurrentFile = false;

src/Generator/TocGenerator.php

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

src/Listener/TocCustomizerListener.php

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

0 commit comments

Comments
 (0)