Skip to content

Commit 9b5ce6d

Browse files
authored
Refactor darkfish's classes sidebar implementation (#1296)
The current logic written in ERB template is super hard to read and understand. I think given its complexity is makes sense to implement those logic in pure Ruby methods instead of ERB code in a view.
1 parent 22735a7 commit 9b5ce6d

File tree

2 files changed

+45
-30
lines changed

2 files changed

+45
-30
lines changed

lib/rdoc/generator/darkfish.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,50 @@ def generate_ancestor_list(ancestors, klass)
824824
content << '</li></ul>'
825825
end
826826

827+
def generate_class_link(klass, rel_prefix)
828+
if klass.display?
829+
%(<code><a href="#{rel_prefix}/#{klass.path}">#{klass.name}</a></code>)
830+
else
831+
%(<code>#{klass.name}</code>)
832+
end
833+
end
834+
835+
def generate_class_index_content(classes, rel_prefix)
836+
grouped_classes = group_classes_by_namespace_for_sidebar(classes)
837+
return '' unless top = grouped_classes[nil]
838+
839+
solo = top.one? { |klass| klass.display? }
840+
traverse_classes(top, grouped_classes, rel_prefix, solo)
841+
end
842+
843+
def traverse_classes(klasses, grouped_classes, rel_prefix, solo = false)
844+
content = +'<ul class="link-list">'
845+
846+
klasses.each do |index_klass|
847+
if children = grouped_classes[index_klass.full_name]
848+
content << %(<li><details#{solo ? ' open' : ''}><summary>#{generate_class_link(index_klass, rel_prefix)}</summary>)
849+
content << traverse_classes(children, grouped_classes, rel_prefix)
850+
content << '</details></li>'
851+
solo = false
852+
elsif index_klass.display?
853+
content << %(<li>#{generate_class_link(index_klass, rel_prefix)}</li>)
854+
end
855+
end
856+
857+
"#{content}</ul>"
858+
end
859+
860+
def group_classes_by_namespace_for_sidebar(classes)
861+
grouped_classes = classes.group_by do |klass|
862+
klass.full_name[/\A[^:]++(?:::[^:]++(?=::))*+(?=::[^:]*+\z)/]
863+
end.select do |_, klasses|
864+
klasses.any?(&:display?)
865+
end
866+
867+
grouped_classes.values.each(&:uniq!)
868+
grouped_classes
869+
end
870+
827871
private
828872

829873
def nesting_namespaces_to_class_modules klass
Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,5 @@
11
<div id="classindex-section" class="nav-section">
22
<h3>Class and Module Index</h3>
33

4-
<%-
5-
all_classes = @classes.group_by do |klass|
6-
klass.full_name[/\A[^:]++(?:::[^:]++(?=::))*+(?=::[^:]*+\z)/]
7-
end.delete_if do |_, klasses|
8-
!klasses.any?(&:display?)
9-
end
10-
link = proc do |index_klass, display = index_klass.display?|
11-
if display
12-
-%><code><a href="<%= rel_prefix %>/<%= index_klass.path %>"><%= index_klass.name %></a></code><%-
13-
else
14-
-%><code><%= index_klass.name %></code><%-
15-
end
16-
end
17-
if top = all_classes[nil]
18-
solo = top.one? {|klass| klass.display?}
19-
traverse = proc do |klasses| -%>
20-
<ul class="link-list">
21-
<%- klasses.uniq!(&:full_name) -%>
22-
<%- klasses.each do |index_klass| -%>
23-
<%- if children = all_classes[index_klass.full_name] -%>
24-
<li><details<% if solo; solo = false %> open<% end %>><summary><% link.call(index_klass) %></summary>
25-
<%- traverse.call(children) -%>
26-
</ul></details>
27-
<%- elsif index_klass.display? -%>
28-
<li><% link.call(index_klass, true) %>
29-
<%- end -%>
30-
<%- end -%>
31-
<%- end -%>
32-
<%- traverse.call(top) -%>
33-
<%- end -%>
4+
<%= generate_class_index_content(@classes, rel_prefix) %>
345
</div>

0 commit comments

Comments
 (0)