Skip to content

Commit 06ed958

Browse files
committed
WIP
1 parent 6e25e3f commit 06ed958

File tree

1 file changed

+60
-41
lines changed

1 file changed

+60
-41
lines changed

lib/rdoc/generator/darkfish.rb

Lines changed: 60 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -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
927946
end

0 commit comments

Comments
 (0)