@@ -827,7 +827,7 @@ def generate_ancestor_list(ancestors, klass)
827827
828828 def generate_class_link ( klass , rel_prefix )
829829 if klass . display?
830- %(<code><a href=" #{ rel_prefix } / #{ klass . path } "> #{ klass . name } </a> </code>)
830+ %(<code>#{ generate_sidebar_link ( klass . name , klass . path , rel_prefix ) } </code>)
831831 else
832832 %(<code>#{ klass . name } </code>)
833833 end
@@ -837,25 +837,21 @@ def generate_class_index_content(classes, rel_prefix)
837837 grouped_classes = group_classes_by_namespace_for_sidebar ( classes )
838838 return '' unless top = grouped_classes [ nil ]
839839
840- solo = top . one? { |klass | klass . display? }
841- traverse_classes ( top , grouped_classes , rel_prefix , solo )
840+ open = top . one? { |klass | klass . display? }
841+ traverse_classes ( top , grouped_classes , rel_prefix , open )
842842 end
843843
844- def traverse_classes ( klasses , grouped_classes , rel_prefix , solo = false )
845- content = +'<ul class="link-list">'
846-
847- klasses . each do |index_klass |
848- if children = grouped_classes [ index_klass . full_name ]
849- content << %(<li><details#{ solo ? ' open' : '' } ><summary>#{ generate_class_link ( index_klass , rel_prefix ) } </summary>)
850- content << traverse_classes ( children , grouped_classes , rel_prefix )
851- content << '</details></li>'
852- solo = false
853- elsif index_klass . display?
854- content << %(<li>#{ generate_class_link ( index_klass , rel_prefix ) } </li>)
844+ def traverse_classes ( klasses , grouped_classes , rel_prefix , open )
845+ traverse_tree ( klasses ) do |index_klass |
846+ {
847+ label : generate_class_link ( index_klass , rel_prefix ) ,
848+ children : grouped_classes [ index_klass . full_name ] ,
849+ display : index_klass . display? ,
850+ open : open
851+ } . tap do
852+ open = false
855853 end
856854 end
857-
858- "#{ content } </ul>"
859855 end
860856
861857 def group_classes_by_namespace_for_sidebar ( classes )
@@ -869,41 +865,41 @@ def group_classes_by_namespace_for_sidebar(classes)
869865 grouped_classes
870866 end
871867
872- def generate_page_link ( file , rel_prefix )
873- %(<a href="#{ rel_prefix } /#{ h file . path } ">#{ h file . page_name } </a>)
868+ def generate_sidebar_link ( name , path , rel_prefix )
869+ %(<a href="#{ rel_prefix } /#{ path } ">#{ name } </a>)
874870 end
875871
876872 def generate_pages_index_content ( page_files , rel_prefix , current )
877873 return '' if page_files . empty?
878874
879875 dir = current &.full_name &.[]( /\A [^\/ ]+(?=\/ )/ ) || current &.page_name
876+ grouped_files = page_files . group_by { |f | f . full_name [ /\A [^\/ ]+(?=\/ )/ ] || f . page_name }
880877
881- content = +'<ul class="link-list">'
882- page_files . group_by do |f |
883- f . full_name [ /\A [^\/ ]+(?=\/ )/ ] || f . page_name
884- end . each do |n , grouped_files |
885- f = grouped_files . shift
886- if grouped_files . empty?
887- content << %(<li>#{ generate_page_link ( f , rel_prefix ) } </li>)
888- next
889- end
890-
891- content << %(<li><details#{ dir == n ? ' open' : '' } ><summary>)
892- if n == f . page_name
893- content << generate_page_link ( f , rel_prefix )
878+ traverse_tree ( grouped_files ) do |name , files |
879+ f = files . shift
880+ # If the group has only one file, we can just link to it
881+ if files . empty?
882+ { label : generate_sidebar_link ( f . page_name , f . path , rel_prefix ) , display : true }
894883 else
895- content << h ( n )
896- grouped_files . unshift ( f )
897- end
898- content << '</summary><ul class="link-list">'
899-
900- grouped_files . each do |f |
901- content << %(<li>#{ generate_page_link ( f , rel_prefix ) } </li>)
884+ label =
885+ # If the group has multiple files and the current file matches the group name
886+ # the label should be a link to the current file
887+ if name == f . page_name
888+ generate_sidebar_link ( f . page_name , f . path , rel_prefix )
889+ # Otherwise, the label should be the group name
890+ else
891+ files . unshift ( f )
892+ h ( name )
893+ end
894+ {
895+ label : label ,
896+ children : files ,
897+ display : true ,
898+ open : dir == name ,
899+ child_renderer : -> ( f ) { { label : generate_sidebar_link ( f . page_name , f . path , rel_prefix ) , display : true } }
900+ }
902901 end
903-
904- content << '</ul></details>'
905902 end
906- content << '</ul>'
907903 end
908904
909905 private
@@ -924,4 +920,27 @@ def generate_nesting_namespaces_breadcrumb klass, rel_prefix
924920 { name : namespace , path : path , self : klass . full_name == class_module &.full_name }
925921 end
926922 end
923+
924+ def traverse_tree ( items , &block )
925+ content = +'<ul class="link-list">'
926+
927+ items . each do |*args |
928+ result = yield ( *args )
929+ next unless result [ :display ]
930+
931+ if result [ :children ]
932+ content << %(<li><details#{ result [ :open ] ? ' open' : '' } ><summary>#{ result [ :label ] } </summary>)
933+ if result [ :child_renderer ]
934+ content << traverse_tree ( result [ :children ] ) { |item | result [ :child_renderer ] . call ( item ) }
935+ else
936+ content << traverse_tree ( result [ :children ] , &block )
937+ end
938+ content << '</details></li>'
939+ else
940+ content << %(<li>#{ result [ :label ] } </li>)
941+ end
942+ end
943+
944+ "#{ content } </ul>"
945+ end
927946end
0 commit comments