Class: JsDuck::AutoCategories
- Inherits:
-
Object
- Object
- JsDuck::AutoCategories
- Defined in:
- lib/jsduck/auto_categories.rb
Overview
Automatically divides all available classes into categories
Instance Method Summary collapse
-
#cat_compare(a, b) ⇒ Object
Comparison function for sorting categories that always places “Others…” category at the end.
-
#categorize(class_names, level = 0) ⇒ Object
Divides classes into categories by namespace.
-
#generate ⇒ Object
Performs the generation.
-
#initialize(relations) ⇒ AutoCategories
constructor
A new instance of AutoCategories.
Constructor Details
#initialize(relations) ⇒ AutoCategories
Returns a new instance of AutoCategories.
5 6 7 |
# File 'lib/jsduck/auto_categories.rb', line 5 def initialize(relations) @relations = relations end |
Instance Method Details
#cat_compare(a, b) ⇒ Object
Comparison function for sorting categories that always places “Others…” category at the end.
69 70 71 72 73 74 75 76 77 |
# File 'lib/jsduck/auto_categories.rb', line 69 def cat_compare(a, b) if a["name"] == "Others..." 1 elsif b["name"] == "Others..." -1 else a["name"] <=> b["name"] end end |
#categorize(class_names, level = 0) ⇒ Object
Divides classes into categories by namespace. Collapses categories having only one class into a category “Others…”
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/jsduck/auto_categories.rb', line 45 def categorize(class_names, level=0) categories = {} class_names.each do |name| ns = name.split(/\./)[level] || name.split(/\./)[0] categories[ns] = [] unless categories[ns] categories[ns] << name end globals = [] categories.each_pair do |ns, classes| if classes.length == 1 globals << classes[0] categories.delete(ns) end end if globals.length > 0 categories["Others..."] = globals end categories end |
#generate ⇒ Object
Performs the generation
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/jsduck/auto_categories.rb', line 10 def generate # list names of all public classes class_names = @relations.to_a.find_all {|cls| !cls[:private] }.map {|cls| cls[:name] } # divide classes into top-level categories by namespace categories = categorize(class_names) # in each category, create sub-categories categories.each_pair do |ns, classes| categories[ns] = categorize(classes, 1) end # Turn categories hash into array, sort everything categories_array = [] categories.each_pair do |ns, groups| groups_array = [] groups.each_pair do |gns, classes| groups_array << { "name" => gns, "classes" => classes.sort } end groups_array.sort! {|a, b| cat_compare(a, b) } categories_array << { "name" => ns, "groups" => groups_array } end categories_array.sort! {|a, b| cat_compare(a, b) } return categories_array end |