Class: JsDuck::Categories::Auto
- Inherits:
-
Object
- Object
- JsDuck::Categories::Auto
- Defined in:
- lib/jsduck/categories/auto.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) ⇒ Auto
constructor
A new instance of Auto.
Constructor Details
#initialize(relations) ⇒ Auto
Returns a new instance of Auto.
6 7 8 |
# File 'lib/jsduck/categories/auto.rb', line 6 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.
70 71 72 73 74 75 76 77 78 |
# File 'lib/jsduck/categories/auto.rb', line 70 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…”
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/jsduck/categories/auto.rb', line 46 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
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 42 |
# File 'lib/jsduck/categories/auto.rb', line 11 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 |