@@ -22,6 +22,7 @@ class IncludeDirToNav(BasePlugin):
22
22
("sort_directory" , config_options .Type (bool , default = True )),
23
23
("reverse_sort_file" , config_options .Type (bool , default = False )),
24
24
("reverse_sort_directory" , config_options .Type (bool , default = False )),
25
+ ("include_empty_dir" , config_options .Type (bool , default = False )),
25
26
)
26
27
27
28
def on_files (self , files , config ):
@@ -37,7 +38,8 @@ def on_files(self, files, config):
37
38
reverse_sort_directory = self .config ['reverse_sort_directory' ],
38
39
reverse_sort_file = self .config ['reverse_sort_file' ],
39
40
sort_file = self .config ['sort_file' ],
40
- sort_directory = self .config ['sort_directory' ]
41
+ sort_directory = self .config ['sort_directory' ],
42
+ include_empty_dir = self .config ['include_empty_dir' ]
41
43
)
42
44
log .debug (f"IncludeDirToNav : ## Final NAV : \n { yaml .dump (config ['nav' ], indent = 2 )} ##" )
43
45
@@ -46,7 +48,7 @@ def on_files(self, files, config):
46
48
#### If Yes, get direct files and direct directory, and insert it to nav
47
49
#### If direct directory was finding, recall parse with current index, in order to subCheck needsted folder
48
50
#### Take care of direct notation ( - myFolder ) and page title notation ( - my folder : myFolder)
49
- def parse (ori_nav ,config , pattern : str = '.*\.md$' , flat : bool = False , previous = None , file_name_as_title : bool = False , recurse : bool = True , reverse_sort_file : bool = False , reverse_sort_directory : bool = False , sort_file : bool = True , sort_directory : bool = True ):
51
+ def parse (ori_nav ,config , pattern : str = '.*\.md$' , flat : bool = False , previous = None , file_name_as_title : bool = False , recurse : bool = True , reverse_sort_file : bool = False , reverse_sort_directory : bool = False , sort_file : bool = True , sort_directory : bool = True , include_empty_dir : bool = False ):
50
52
log .debug ("IncludeDirToNav : ##START Parse state###" )
51
53
log .debug (f"IncludeDirToNav : ori_nav = { ori_nav } | previous = { previous } | type of ori_nav { type (ori_nav )} " )
52
54
@@ -73,14 +75,15 @@ def parse(ori_nav,config, pattern: str = '.*\.md$', flat: bool = False, previous
73
75
reverse_sort_directory = reverse_sort_directory ,
74
76
reverse_sort_file = reverse_sort_file ,
75
77
sort_file = sort_file ,
76
- sort_directory = sort_directory
78
+ sort_directory = sort_directory ,
79
+ include_empty_dir = include_empty_dir
77
80
)
78
81
79
82
## Else, item is simple dict, aka, value is string
80
83
else :
81
84
current_item = os .path .join (config ["docs_dir" ], item [k ])
82
85
log .debug (f" IncludeDirToNav : check current item : { current_item } " )
83
- to_add , directory_was_insered = _generate_nav (current_item , pattern , config , flat , file_name_as_title , recurse , reverse_sort_file , reverse_sort_directory , sort_file , sort_directory )
86
+ to_add , directory_was_insered = _generate_nav (current_item , pattern , config , flat , file_name_as_title , recurse , reverse_sort_file , reverse_sort_directory , sort_file , sort_directory , include_empty_dir )
84
87
if to_add :
85
88
item .update ({k : to_add })
86
89
if directory_was_insered :
@@ -95,13 +98,14 @@ def parse(ori_nav,config, pattern: str = '.*\.md$', flat: bool = False, previous
95
98
reverse_sort_directory = reverse_sort_directory ,
96
99
reverse_sort_file = reverse_sort_file ,
97
100
sort_file = sort_file ,
98
- sort_directory = sort_directory
101
+ sort_directory = sort_directory ,
102
+ include_empty_dir = include_empty_dir
99
103
)
100
104
## Else if item is no named, value like { - 'pagePath' }
101
105
elif isinstance (item , str ):
102
106
log .debug (f" IncludeDirToNav : Item in loop is string. Item = { item } " )
103
107
current_item = os .path .join (config ["docs_dir" ], item )
104
- to_add , directory_was_insered = _generate_nav (current_item , pattern , config , flat , file_name_as_title , recurse , reverse_sort_file , reverse_sort_directory , sort_file , sort_directory )
108
+ to_add , directory_was_insered = _generate_nav (current_item , pattern , config , flat , file_name_as_title , recurse , reverse_sort_file , reverse_sort_directory , sort_file , sort_directory , include_empty_dir )
105
109
if to_add :
106
110
# Replace current index by object in order to avoir infinite loop
107
111
ori_nav [index ] = to_add .pop (- 1 )
@@ -121,10 +125,11 @@ def parse(ori_nav,config, pattern: str = '.*\.md$', flat: bool = False, previous
121
125
reverse_sort_directory = reverse_sort_directory ,
122
126
reverse_sort_file = reverse_sort_file ,
123
127
sort_file = sort_file ,
124
- sort_directory = sort_directory
128
+ sort_directory = sort_directory ,
129
+ include_empty_dir = include_empty_dir
125
130
)
126
131
127
- def _generate_nav (current_item : str , pattern : str , config , flat , file_name_as_title , recurse , reverse_sort_file , reverse_sort_directory , sort_file , sort_directory ):
132
+ def _generate_nav (current_item : str , pattern : str , config , flat , file_name_as_title , recurse , reverse_sort_file , reverse_sort_directory , sort_file , sort_directory , include_empty_dir : bool ):
128
133
## Init var
129
134
directory_was_insered = False
130
135
to_add = []
@@ -150,13 +155,25 @@ def _generate_nav(current_item: str, pattern: str, config, flat, file_name_as_ti
150
155
## Else, continue loop to all level
151
156
## Work because first walk loop return all direct file and direct directory
152
157
if not flat and d and recurse :
153
- directory_was_insered = True
154
158
for sd in (sorted (d , reverse = reverse_sort_directory ) if sort_directory else d ):
159
+ ## Check if subdir have file to add in order to not add empty dir
155
160
rpath = os .path .relpath (os .path .os .path .join (r , sd ), config ["docs_dir" ] )
156
- to_add .append ({sd : rpath })
157
- log .debug (f"IncludeDirToNav_generate_nav : adding dir (sd : { sd } , rpath: { rpath } )" )
161
+ if include_empty_dir or _check_subitem (os .path .join (config ["docs_dir" ], rpath ), pattern ):
162
+ directory_was_insered = True
163
+ to_add .append ({sd : rpath })
164
+ log .debug (f"IncludeDirToNav_generate_nav : adding dir (sd : { sd } , rpath: { rpath } )" )
158
165
break
159
166
elif not recurse :
160
167
break
161
168
162
- return to_add , directory_was_insered
169
+ return to_add , directory_was_insered
170
+
171
+ def _check_subitem (item_to_check : str , pattern : str ):
172
+ log .debug (f"IncludeDirToNav_generate_nav : _check_subitem ({ item_to_check } )" )
173
+ for filename in os .listdir (item_to_check ):
174
+ f = os .path .join (item_to_check ,filename )
175
+ if os .path .isfile (f ) and re .match (pattern , filename ):
176
+ log .debug (f"IncludeDirToNav_generate_nav : Dir have concerned subfile ({ item_to_check } )" )
177
+ return True
178
+ log .debug (f"IncludeDirToNav_generate_nav : Dir not have subfile, do not add it ({ item_to_check } )" )
179
+ return False
0 commit comments