Skip to content

Commit af11284

Browse files
authored
Docs: the parent in the manifest must be only the next level slug (#34)
1 parent 6c73317 commit af11284

File tree

2 files changed

+101
-61
lines changed

2 files changed

+101
-61
lines changed

docs/bin/generate-manifest.php

+53-13
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
$root . '/bin/README.md',
2727
);
2828

29+
// First pass: collect all slugs
2930
foreach ( $paths as $path_pattern ) {
3031
foreach ( glob( $path_pattern ) as $file ) {
3132
// Skip specified README.md files and all META.md files.
@@ -34,8 +35,7 @@
3435
}
3536

3637
$slug = basename( $file, '.md' );
37-
// Get relative path from docs directory
38-
$key = str_replace( array( $root . '/', '.md' ), '', $file );
38+
$key = str_replace( array( $root . '/', '.md' ), '', $file );
3939

4040
// Special handling for tutorial files
4141
if ( 'tutorial' === $slug ) {
@@ -49,11 +49,60 @@
4949
$key = implode( '/', $bits ); // Remove /index from key
5050
}
5151

52+
// Check for slug conflicts
53+
if ( isset( $slug_map[ $slug ] ) ) {
54+
printf( "\nError: Slug conflict detected!\n\n" );
55+
printf( "Original entry:\n%s\n\n", json_encode( array( 'key' => $slug_map[ $slug ] ), JSON_PRETTY_PRINT ) );
56+
printf( "Conflicting entry:\n%s\n\n", json_encode( array( 'key' => $key ), JSON_PRETTY_PRINT ) );
57+
exit( 1 );
58+
}
59+
$slug_map[ $slug ] = $key;
60+
}
61+
}
62+
63+
// Second pass: build manifest with validated parents
64+
foreach ( $paths as $path_pattern ) {
65+
foreach ( glob( $path_pattern ) as $file ) {
66+
if ( in_array( $file, $excludes, true ) || basename( $file ) === 'META.md' ) {
67+
continue;
68+
}
69+
70+
$slug = basename( $file, '.md' );
71+
$key = str_replace( array( $root . '/', '.md' ), '', $file );
72+
73+
// Special handling for tutorial files
74+
if ( 'tutorial' === $slug ) {
75+
$bits = explode( '/', $key );
76+
array_pop( $bits ); // Remove 'tutorial'
77+
$slug = end( $bits ) . '-tutorial';
78+
} elseif ( 'index' === $slug ) {
79+
$bits = explode( '/', $key );
80+
array_pop( $bits );
81+
$slug = end( $bits );
82+
$key = implode( '/', $bits );
83+
}
84+
85+
// Get parent slug (not path)
5286
$parent = null;
5387
if ( stripos( $key, '/' ) ) {
5488
$bits = explode( '/', $key );
55-
array_pop( $bits );
56-
$parent = implode( '/', $bits );
89+
array_pop( $bits ); // Remove current item
90+
$parent_key = implode( '/', $bits );
91+
92+
// Find the parent's slug
93+
foreach ( $slug_map as $potential_parent_slug => $mapped_key ) {
94+
if ( $mapped_key === $parent_key ) {
95+
$parent = $potential_parent_slug;
96+
break;
97+
}
98+
}
99+
100+
// Validate parent exists
101+
if ( ! isset( $slug_map[ $parent ] ) ) {
102+
// phpcs:ignore
103+
printf( "\nError: Parent slug '%s' not found for '%s'\n", $parent, $key );
104+
exit( 1 );
105+
}
57106
}
58107

59108
$manifest[ $key ] = array(
@@ -66,15 +115,6 @@
66115
basename( $file ) === 'index.md' ? '/index.md' : '.md'
67116
),
68117
);
69-
70-
// Check for slug conflicts
71-
if ( isset( $slug_map[ $slug ] ) ) {
72-
printf( "\nError: Slug conflict detected!\n\n" );
73-
printf( "Original entry:\n%s\n\n", json_encode( $manifest[ $slug_map[ $slug ] ], JSON_PRETTY_PRINT ) );
74-
printf( "Conflicting entry:\n%s\n\n", json_encode( $manifest[ $key ], JSON_PRETTY_PRINT ) );
75-
exit( 1 );
76-
}
77-
$slug_map[ $slug ] = $key;
78118
}
79119
}
80120

docs/bin/manifest.json

+48-48
Original file line numberDiff line numberDiff line change
@@ -71,242 +71,242 @@
7171
},
7272
"features/fields/accordion": {
7373
"slug": "accordion",
74-
"parent": "features/fields",
74+
"parent": "fields",
7575
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/accordion/index.md"
7676
},
7777
"features/fields/accordion/tutorial": {
7878
"slug": "accordion-tutorial",
79-
"parent": "features/fields/accordion",
79+
"parent": "accordion",
8080
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/accordion/tutorial.md"
8181
},
8282
"features/fields/button-group": {
8383
"slug": "button-group",
84-
"parent": "features/fields",
84+
"parent": "fields",
8585
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/button-group/index.md"
8686
},
8787
"features/fields/button-group/tutorial": {
8888
"slug": "button-group-tutorial",
89-
"parent": "features/fields/button-group",
89+
"parent": "button-group",
9090
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/button-group/tutorial.md"
9191
},
9292
"features/fields/checkbox": {
9393
"slug": "checkbox",
94-
"parent": "features/fields",
94+
"parent": "fields",
9595
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/checkbox/index.md"
9696
},
9797
"features/fields/checkbox/tutorial": {
9898
"slug": "checkbox-tutorial",
99-
"parent": "features/fields/checkbox",
99+
"parent": "checkbox",
100100
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/checkbox/tutorial.md"
101101
},
102102
"features/fields/clone": {
103103
"slug": "clone",
104-
"parent": "features/fields",
104+
"parent": "fields",
105105
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/clone/index.md"
106106
},
107107
"features/fields/clone/tutorial": {
108108
"slug": "clone-tutorial",
109-
"parent": "features/fields/clone",
109+
"parent": "clone",
110110
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/clone/tutorial.md"
111111
},
112112
"features/fields/color-picker": {
113113
"slug": "color-picker",
114-
"parent": "features/fields",
114+
"parent": "fields",
115115
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/color-picker/index.md"
116116
},
117117
"features/fields/color-picker/tutorial": {
118118
"slug": "color-picker-tutorial",
119-
"parent": "features/fields/color-picker",
119+
"parent": "color-picker",
120120
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/color-picker/tutorial.md"
121121
},
122122
"features/fields/date-picker": {
123123
"slug": "date-picker",
124-
"parent": "features/fields",
124+
"parent": "fields",
125125
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/date-picker/index.md"
126126
},
127127
"features/fields/date-picker/tutorial": {
128128
"slug": "date-picker-tutorial",
129-
"parent": "features/fields/date-picker",
129+
"parent": "date-picker",
130130
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/date-picker/tutorial.md"
131131
},
132132
"features/fields/date-time-picker": {
133133
"slug": "date-time-picker",
134-
"parent": "features/fields",
134+
"parent": "fields",
135135
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/date-time-picker/index.md"
136136
},
137137
"features/fields/date-time-picker/tutorial": {
138138
"slug": "date-time-picker-tutorial",
139-
"parent": "features/fields/date-time-picker",
139+
"parent": "date-time-picker",
140140
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/date-time-picker/tutorial.md"
141141
},
142142
"features/fields/email": {
143143
"slug": "email",
144-
"parent": "features/fields",
144+
"parent": "fields",
145145
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/email/index.md"
146146
},
147147
"features/fields/email/tutorial": {
148148
"slug": "email-tutorial",
149-
"parent": "features/fields/email",
149+
"parent": "email",
150150
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/email/tutorial.md"
151151
},
152152
"features/fields/file": {
153153
"slug": "file",
154-
"parent": "features/fields",
154+
"parent": "fields",
155155
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/file/index.md"
156156
},
157157
"features/fields/file/tutorial": {
158158
"slug": "file-tutorial",
159-
"parent": "features/fields/file",
159+
"parent": "file",
160160
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/file/tutorial.md"
161161
},
162162
"features/fields/flexible-content": {
163163
"slug": "flexible-content",
164-
"parent": "features/fields",
164+
"parent": "fields",
165165
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/flexible-content/index.md"
166166
},
167167
"features/fields/flexible-content/tutorial": {
168168
"slug": "flexible-content-tutorial",
169-
"parent": "features/fields/flexible-content",
169+
"parent": "flexible-content",
170170
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/flexible-content/tutorial.md"
171171
},
172172
"features/fields/gallery": {
173173
"slug": "gallery",
174-
"parent": "features/fields",
174+
"parent": "fields",
175175
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/gallery/index.md"
176176
},
177177
"features/fields/gallery/tutorial": {
178178
"slug": "gallery-tutorial",
179-
"parent": "features/fields/gallery",
179+
"parent": "gallery",
180180
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/gallery/tutorial.md"
181181
},
182182
"features/fields/google-map": {
183183
"slug": "google-map",
184-
"parent": "features/fields",
184+
"parent": "fields",
185185
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/google-map/index.md"
186186
},
187187
"features/fields/google-map/tutorial": {
188188
"slug": "google-map-tutorial",
189-
"parent": "features/fields/google-map",
189+
"parent": "google-map",
190190
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/google-map/tutorial.md"
191191
},
192192
"features/fields/group": {
193193
"slug": "group",
194-
"parent": "features/fields",
194+
"parent": "fields",
195195
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/group/index.md"
196196
},
197197
"features/fields/group/tutorial": {
198198
"slug": "group-tutorial",
199-
"parent": "features/fields/group",
199+
"parent": "group",
200200
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/group/tutorial.md"
201201
},
202202
"features/fields/icon-picker": {
203203
"slug": "icon-picker",
204-
"parent": "features/fields",
204+
"parent": "fields",
205205
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/icon-picker/index.md"
206206
},
207207
"features/fields/icon-picker/tutorial": {
208208
"slug": "icon-picker-tutorial",
209-
"parent": "features/fields/icon-picker",
209+
"parent": "icon-picker",
210210
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/icon-picker/tutorial.md"
211211
},
212212
"features/fields/image": {
213213
"slug": "image",
214-
"parent": "features/fields",
214+
"parent": "fields",
215215
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/image/index.md"
216216
},
217217
"features/fields/image/tutorial": {
218218
"slug": "image-tutorial",
219-
"parent": "features/fields/image",
219+
"parent": "image",
220220
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/image/tutorial.md"
221221
},
222222
"features/fields/link": {
223223
"slug": "link",
224-
"parent": "features/fields",
224+
"parent": "fields",
225225
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/link/index.md"
226226
},
227227
"features/fields/link/tutorial": {
228228
"slug": "link-tutorial",
229-
"parent": "features/fields/link",
229+
"parent": "link",
230230
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/link/tutorial.md"
231231
},
232232
"features/fields/message": {
233233
"slug": "message",
234-
"parent": "features/fields",
234+
"parent": "fields",
235235
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/message/index.md"
236236
},
237237
"features/fields/message/tutorial": {
238238
"slug": "message-tutorial",
239-
"parent": "features/fields/message",
239+
"parent": "message",
240240
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/message/tutorial.md"
241241
},
242242
"features/fields/number": {
243243
"slug": "number",
244-
"parent": "features/fields",
244+
"parent": "fields",
245245
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/number/index.md"
246246
},
247247
"features/fields/number/tutorial": {
248248
"slug": "number-tutorial",
249-
"parent": "features/fields/number",
249+
"parent": "number",
250250
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/number/tutorial.md"
251251
},
252252
"features/fields/oembed": {
253253
"slug": "oembed",
254-
"parent": "features/fields",
254+
"parent": "fields",
255255
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/oembed/index.md"
256256
},
257257
"features/fields/oembed/tutorial": {
258258
"slug": "oembed-tutorial",
259-
"parent": "features/fields/oembed",
259+
"parent": "oembed",
260260
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/oembed/tutorial.md"
261261
},
262262
"features/fields/page-link": {
263263
"slug": "page-link",
264-
"parent": "features/fields",
264+
"parent": "fields",
265265
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/page-link/index.md"
266266
},
267267
"features/fields/page-link/tutorial": {
268268
"slug": "page-link-tutorial",
269-
"parent": "features/fields/page-link",
269+
"parent": "page-link",
270270
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/page-link/tutorial.md"
271271
},
272272
"features/fields/password": {
273273
"slug": "password",
274-
"parent": "features/fields",
274+
"parent": "fields",
275275
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/password/index.md"
276276
},
277277
"features/fields/password/tutorial": {
278278
"slug": "password-tutorial",
279-
"parent": "features/fields/password",
279+
"parent": "password",
280280
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/password/tutorial.md"
281281
},
282282
"features/fields/post-object": {
283283
"slug": "post-object",
284-
"parent": "features/fields",
284+
"parent": "fields",
285285
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/post-object/index.md"
286286
},
287287
"features/fields/post-object/tutorial": {
288288
"slug": "post-object-tutorial",
289-
"parent": "features/fields/post-object",
289+
"parent": "post-object",
290290
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/post-object/tutorial.md"
291291
},
292292
"features/fields/radio": {
293293
"slug": "radio",
294-
"parent": "features/fields",
294+
"parent": "fields",
295295
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/radio/index.md"
296296
},
297297
"features/fields/radio/tutorial": {
298298
"slug": "radio-tutorial",
299-
"parent": "features/fields/radio",
299+
"parent": "radio",
300300
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/radio/tutorial.md"
301301
},
302302
"features/fields/range": {
303303
"slug": "range",
304-
"parent": "features/fields",
304+
"parent": "fields",
305305
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/range/index.md"
306306
},
307307
"features/fields/range/tutorial": {
308308
"slug": "range-tutorial",
309-
"parent": "features/fields/range",
309+
"parent": "range",
310310
"markdown_source": "https://github.com/wordpress/secure-custom-fields/blob/trunk/docs/features/fields/range/tutorial.md"
311311
}
312312
}

0 commit comments

Comments
 (0)