3
3
namespace SymfonyDocsBuilder \Generator ;
4
4
5
5
use Doctrine \RST \Environment ;
6
+ use Doctrine \RST \Meta \CachedMetasLoader ;
6
7
use Doctrine \RST \Meta \MetaEntry ;
8
+ use Doctrine \RST \Meta \Metas ;
7
9
use Symfony \Component \Console \Helper \ProgressBar ;
8
10
use Symfony \Component \DomCrawler \Crawler ;
9
11
use Symfony \Component \Filesystem \Filesystem ;
10
12
use Symfony \Component \Finder \Finder ;
11
- use SymfonyDocsBuilder \BuildContext ;
12
13
13
14
/**
14
15
* Class JsonGenerator
@@ -17,44 +18,55 @@ class JsonGenerator
17
18
{
18
19
use GeneratorTrait;
19
20
20
- public function generateJson (
21
- array $ documents ,
22
- BuildContext $ buildContext ,
23
- ProgressBar $ progressBar
24
- ) {
25
- $ environments = $ this ->extractEnvironments ($ documents );
21
+ public function generateJson (array $ documents , ProgressBar $ progressBar )
22
+ {
23
+ $ this ->extractEnvironmentsAndCachedMetas ($ documents );
24
+
25
+ if (!$ this ->buildContext ->getDisableCache ()) {
26
+ $ cachedMetasLoader = new CachedMetasLoader ();
27
+ $ cachedMetasLoader ->loadCachedMetaEntries ($ this ->buildContext ->getHtmlOutputDir (), $ metas = new Metas ());
28
+ }
26
29
27
30
$ finder = new Finder ();
28
- $ finder ->in ($ buildContext ->getHtmlOutputDir ())
31
+ $ finder ->in ($ this -> buildContext ->getHtmlOutputDir ())
29
32
->name ('*.html ' )
30
33
->files ();
31
34
32
35
$ fs = new Filesystem ();
33
- $ fs ->remove ($ buildContext ->getJsonOutputDir ());
34
36
35
37
foreach ($ finder as $ file ) {
38
+ $ parserFilename = $ this ->getParserFilename ($ file ->getRealPath (), $ this ->buildContext ->getHtmlOutputDir ());
39
+ $ jsonFilename = str_replace ([$ this ->buildContext ->getHtmlOutputDir (), '.html ' ], [$ this ->buildContext ->getJsonOutputDir (), '.json ' ], $ file ->getRealPath ());
36
40
41
+ if ($ this ->useCacheForFile ($ parserFilename )) {
42
+ if (!file_exists ($ jsonFilename )) {
43
+ throw new \RuntimeException (
44
+ sprintf ('File %s does not exist although cache is enabled and related environment is not available ' , $ jsonFilename )
45
+ );
46
+ }
37
47
38
- $ crawler = new Crawler ($ file ->getContents ());
48
+ continue ;
49
+ }
50
+
51
+ $ meta = $ this ->getMeta ($ parserFilename );
39
52
40
- $ parserFilename = $ this ->getParserFilename ($ file ->getRealPath (), $ buildContext ->getHtmlOutputDir ());
41
- $ meta = $ this ->getMeta ($ environments , $ parserFilename );
53
+ $ crawler = new Crawler ($ file ->getContents ());
42
54
43
55
$ data = [
44
56
'body ' => $ crawler ->filter ('body ' )->html (),
45
57
'title ' => $ meta ->getTitle (),
46
58
'current_page_name ' => $ parserFilename ,
47
59
'toc ' => $ this ->generateToc ($ meta , current ($ meta ->getTitles ())[1 ]),
48
- 'next ' => $ this ->guessNext ($ environments , $ parserFilename ),
49
- 'prev ' => $ this ->guessPrev ($ environments , $ parserFilename ),
60
+ 'next ' => $ this ->guessNext ($ parserFilename ),
61
+ 'prev ' => $ this ->guessPrev ($ parserFilename ),
50
62
'rellinks ' => [
51
- $ this ->guessNext ($ environments , $ parserFilename ),
52
- $ this ->guessPrev ($ environments , $ parserFilename ),
63
+ $ this ->guessNext ($ parserFilename ),
64
+ $ this ->guessPrev ($ parserFilename ),
53
65
],
54
66
];
55
67
56
68
$ fs ->dumpFile (
57
- str_replace ([ $ buildContext -> getHtmlOutputDir (), ' .html ' ], [ $ buildContext -> getJsonOutputDir (), ' .json ' ], $ file -> getRealPath ()) ,
69
+ $ jsonFilename ,
58
70
json_encode ($ data , JSON_PRETTY_PRINT )
59
71
);
60
72
@@ -83,20 +95,20 @@ private function generateToc(MetaEntry $metaEntry, ?array $titles): array
83
95
return $ tocTree ;
84
96
}
85
97
86
- private function guessNext (array $ environments , string $ parserFilename ): ?array
98
+ private function guessNext (string $ parserFilename ): ?array
87
99
{
88
- $ meta = $ this ->getMeta ($ environments , $ parserFilename );
100
+ $ meta = $ this ->getMeta ($ parserFilename );
89
101
$ parentFile = $ meta ->getParent ();
90
102
91
103
// if current file is an index, next is the first chapter
92
104
if ('index ' === $ parentFile && \count ($ tocs = $ meta ->getTocs ()) === 1 && \count ($ tocs [0 ]) > 0 ) {
93
105
return [
94
- 'title ' => $ this ->getMeta ($ environments , $ tocs [0 ][0 ])->getTitle (),
95
- 'link ' => $ this ->getMeta ($ environments , $ tocs [0 ][0 ])->getUrl (),
106
+ 'title ' => $ this ->getMeta ($ tocs [0 ][0 ])->getTitle (),
107
+ 'link ' => $ this ->getMeta ($ tocs [0 ][0 ])->getUrl (),
96
108
];
97
109
}
98
110
99
- list ($ toc , $ indexCurrentFile ) = $ this ->getNextPrevInformation ($ environments , $ parserFilename );
111
+ list ($ toc , $ indexCurrentFile ) = $ this ->getNextPrevInformation ($ parserFilename );
100
112
101
113
if (!isset ($ toc [$ indexCurrentFile + 1 ])) {
102
114
return null ;
@@ -105,28 +117,28 @@ private function guessNext(array $environments, string $parserFilename): ?array
105
117
$ nextFileName = $ toc [$ indexCurrentFile + 1 ];
106
118
107
119
return [
108
- 'title ' => $ this ->getMeta ($ environments , $ nextFileName )->getTitle (),
109
- 'link ' => $ this ->getMeta ($ environments , $ nextFileName )->getUrl (),
120
+ 'title ' => $ this ->getMeta ($ nextFileName )->getTitle (),
121
+ 'link ' => $ this ->getMeta ($ nextFileName )->getUrl (),
110
122
];
111
123
}
112
124
113
- private function guessPrev (array $ environments , string $ parserFilename ): ?array
125
+ private function guessPrev (string $ parserFilename ): ?array
114
126
{
115
- $ meta = $ this ->getMeta ($ environments , $ parserFilename );
127
+ $ meta = $ this ->getMeta ($ parserFilename );
116
128
$ parentFile = $ meta ->getParent ();
117
129
118
130
// no prev if parent is an index
119
131
if ('index ' === $ parentFile ) {
120
132
return null ;
121
133
}
122
134
123
- list ($ toc , $ indexCurrentFile ) = $ this ->getNextPrevInformation ($ environments , $ parserFilename );
135
+ list ($ toc , $ indexCurrentFile ) = $ this ->getNextPrevInformation ($ parserFilename );
124
136
125
137
// if current file is the first one of the chapter, prev is the direct parent
126
138
if (0 === $ indexCurrentFile ) {
127
139
return [
128
- 'title ' => $ this ->getMeta ($ environments , $ parentFile )->getTitle (),
129
- 'link ' => $ this ->getMeta ($ environments , $ parentFile )->getUrl (),
140
+ 'title ' => $ this ->getMeta ($ parentFile )->getTitle (),
141
+ 'link ' => $ this ->getMeta ($ parentFile )->getUrl (),
130
142
];
131
143
}
132
144
@@ -137,21 +149,21 @@ private function guessPrev(array $environments, string $parserFilename): ?array
137
149
$ prevFileName = $ toc [$ indexCurrentFile - 1 ];
138
150
139
151
return [
140
- 'title ' => $ this ->getMeta ($ environments , $ prevFileName )->getTitle (),
141
- 'link ' => $ this ->getMeta ($ environments , $ prevFileName )->getUrl (),
152
+ 'title ' => $ this ->getMeta ($ prevFileName )->getTitle (),
153
+ 'link ' => $ this ->getMeta ($ prevFileName )->getUrl (),
142
154
];
143
155
}
144
156
145
- private function getNextPrevInformation (array $ environments , string $ parserFilename ): ?array
157
+ private function getNextPrevInformation (string $ parserFilename ): ?array
146
158
{
147
- $ meta = $ this ->getMeta ($ environments , $ parserFilename );
159
+ $ meta = $ this ->getMeta ($ parserFilename );
148
160
$ parentFile = $ meta ->getParent ();
149
161
150
162
if (!$ parentFile ) {
151
163
return [null , null ];
152
164
}
153
165
154
- $ metaParent = $ this ->getMeta ($ environments , $ parentFile );
166
+ $ metaParent = $ this ->getMeta ($ parentFile );
155
167
156
168
if (!$ metaParent ->getTocs () || \count ($ metaParent ->getTocs ()) !== 1 ) {
157
169
return [null , null ];
0 commit comments