Skip to content

Commit 69af53a

Browse files
committed
Refactor sidebar list generation methods
1 parent 6e25e3f commit 69af53a

File tree

1 file changed

+62
-41
lines changed

1 file changed

+62
-41
lines changed

lib/rdoc/generator/darkfish.rb

Lines changed: 62 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,43 @@ 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+
name = CGI.escapeHTML(name)
870+
path = CGI.escapeHTML(path)
871+
%(<a href="#{rel_prefix}/#{path}">#{name}</a>)
874872
end
875873

876874
def generate_pages_index_content(page_files, rel_prefix, current)
877875
return '' if page_files.empty?
878876

879877
dir = current&.full_name&.[](/\A[^\/]+(?=\/)/) || current&.page_name
878+
grouped_files = page_files.group_by { |f| f.full_name[/\A[^\/]+(?=\/)/] || f.page_name }
880879

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)
880+
traverse_tree(grouped_files) do |name, files|
881+
f = files.shift
882+
# If the group has only one file, we can just link to it
883+
if files.empty?
884+
{ label: generate_sidebar_link(f.page_name, f.path, rel_prefix), display: true }
894885
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>)
886+
label =
887+
# If the group has multiple files and the current file matches the group name
888+
# the label should be a link to the current file
889+
if name == f.page_name
890+
generate_sidebar_link(f.page_name, f.path, rel_prefix)
891+
# Otherwise, the label should be the group name
892+
else
893+
files.unshift(f)
894+
h(name)
895+
end
896+
{
897+
label: label,
898+
children: files,
899+
display: true,
900+
open: dir == name,
901+
child_renderer: ->(f) { { label: generate_sidebar_link(f.page_name, f.path, rel_prefix), display: true } }
902+
}
902903
end
903-
904-
content << '</ul></details>'
905904
end
906-
content << '</ul>'
907905
end
908906

909907
private
@@ -924,4 +922,27 @@ def generate_nesting_namespaces_breadcrumb klass, rel_prefix
924922
{ name: namespace, path: path, self: klass.full_name == class_module&.full_name }
925923
end
926924
end
925+
926+
def traverse_tree(items, &block)
927+
content = +'<ul class="link-list">'
928+
929+
items.each do |*args|
930+
result = yield(*args)
931+
next unless result[:display]
932+
933+
if result[:children]
934+
content << %(<li><details#{result[:open] ? ' open' : ''}><summary>#{result[:label]}</summary>)
935+
if result[:child_renderer]
936+
content << traverse_tree(result[:children]) { |item| result[:child_renderer].call(item) }
937+
else
938+
content << traverse_tree(result[:children], &block)
939+
end
940+
content << '</details></li>'
941+
else
942+
content << %(<li>#{result[:label]}</li>)
943+
end
944+
end
945+
946+
"#{content}</ul>"
947+
end
927948
end

0 commit comments

Comments
 (0)