Class: JsDuck::Categories::Auto

Inherits:
Object
  • Object
show all
Defined in:
lib/jsduck/categories/auto.rb

Overview

Automatically divides all available classes into categories

Instance Method Summary collapse

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

#generateObject

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