jsduck 5.3.4 → 6.0.0beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/bin/jsduck +3 -3
  4. data/lib/jsduck/app.rb +1 -1
  5. data/lib/jsduck/assets.rb +3 -3
  6. data/lib/jsduck/base_type.rb +2 -2
  7. data/lib/jsduck/batch_processor.rb +3 -1
  8. data/lib/jsduck/categories/file.rb +2 -2
  9. data/lib/jsduck/class_doc_expander.rb +1 -1
  10. data/lib/jsduck/css/parser.rb +59 -90
  11. data/lib/jsduck/css/type.rb +55 -0
  12. data/lib/jsduck/doc/parser.rb +1 -1
  13. data/lib/jsduck/doc/scanner.rb +2 -2
  14. data/lib/jsduck/doc/subproperties.rb +1 -1
  15. data/lib/jsduck/export_writer.rb +4 -4
  16. data/lib/jsduck/exporter/app.rb +2 -1
  17. data/lib/jsduck/exporter/full.rb +5 -3
  18. data/lib/jsduck/external_classes.rb +337 -5
  19. data/lib/jsduck/format/class.rb +3 -3
  20. data/lib/jsduck/format/doc.rb +6 -5
  21. data/lib/jsduck/format/subproperties.rb +1 -1
  22. data/lib/jsduck/guide_toc.rb +45 -27
  23. data/lib/jsduck/guide_toc_entry.rb +54 -0
  24. data/lib/jsduck/guides.rb +9 -5
  25. data/lib/jsduck/img/dir.rb +1 -1
  26. data/lib/jsduck/inline/example.rb +3 -1
  27. data/lib/jsduck/inline/img.rb +3 -3
  28. data/lib/jsduck/inline/link.rb +2 -2
  29. data/lib/jsduck/inline/link_renderer.rb +3 -2
  30. data/lib/jsduck/inline/video.rb +2 -1
  31. data/lib/jsduck/js/class.rb +6 -11
  32. data/lib/jsduck/js/ext_define.rb +46 -0
  33. data/lib/jsduck/js/ext_patterns.rb +7 -2
  34. data/lib/jsduck/js/rkelly_adapter.rb +16 -2
  35. data/lib/jsduck/logger.rb +40 -25
  36. data/lib/jsduck/member_registry.rb +41 -0
  37. data/lib/jsduck/news.rb +18 -5
  38. data/lib/jsduck/options/config.rb +35 -0
  39. data/lib/jsduck/options/helpful_parser.rb +111 -0
  40. data/lib/jsduck/options/input_files.rb +60 -0
  41. data/lib/jsduck/options/jsb.rb +25 -0
  42. data/lib/jsduck/{options.rb → options/parser.rb} +436 -484
  43. data/lib/jsduck/options/processor.rb +47 -0
  44. data/lib/jsduck/options/record.rb +51 -0
  45. data/lib/jsduck/output_dir.rb +4 -4
  46. data/lib/jsduck/parser.rb +5 -5
  47. data/lib/jsduck/process/components.rb +19 -0
  48. data/lib/jsduck/process/ext4_events.rb +4 -2
  49. data/lib/jsduck/process/importer.rb +5 -2
  50. data/lib/jsduck/process/inherit_members.rb +2 -0
  51. data/lib/jsduck/process/lint.rb +3 -3
  52. data/lib/jsduck/process/no_doc.rb +1 -1
  53. data/lib/jsduck/process/overrides.rb +4 -3
  54. data/lib/jsduck/process/versions.rb +86 -51
  55. data/lib/jsduck/render/class.rb +3 -2
  56. data/lib/jsduck/render/subproperties.rb +18 -0
  57. data/lib/jsduck/render/tags.rb +13 -1
  58. data/lib/jsduck/source/file.rb +2 -2
  59. data/lib/jsduck/tag/class.rb +6 -0
  60. data/lib/jsduck/tag/component.rb +19 -0
  61. data/lib/jsduck/tag/css_mixin.rb +10 -0
  62. data/lib/jsduck/tag/deprecated.rb +1 -1
  63. data/{template-min/resources/images/class-m.png → lib/jsduck/tag/icons/class-large.png} +0 -0
  64. data/lib/jsduck/tag/icons/class-redirect.png +0 -0
  65. data/lib/jsduck/tag/icons/class.png +0 -0
  66. data/{template-min/resources/images/component-m.png → lib/jsduck/tag/icons/component-large.png} +0 -0
  67. data/lib/jsduck/tag/icons/component-redirect.png +0 -0
  68. data/lib/jsduck/tag/icons/component.png +0 -0
  69. data/{template-min/resources/images/singleton-m.png → lib/jsduck/tag/icons/singleton-large.png} +0 -0
  70. data/lib/jsduck/tag/icons/singleton-redirect.png +0 -0
  71. data/lib/jsduck/tag/icons/singleton.png +0 -0
  72. data/lib/jsduck/tag/inheritdoc.rb +2 -2
  73. data/lib/jsduck/tag/new.rb +13 -0
  74. data/lib/jsduck/tag/since.rb +2 -2
  75. data/lib/jsduck/tag/singleton.rb +13 -0
  76. data/lib/jsduck/tag/tag.rb +19 -0
  77. data/lib/jsduck/tag_registry.rb +20 -81
  78. data/lib/jsduck/util/io.rb +5 -0
  79. data/lib/jsduck/util/json.rb +3 -3
  80. data/lib/jsduck/util/null_object.rb +14 -1
  81. data/lib/jsduck/util/parallel.rb +7 -3
  82. data/lib/jsduck/version.rb +1 -1
  83. data/lib/jsduck/warning/registry.rb +4 -2
  84. data/lib/jsduck/warning/tag.rb +57 -0
  85. data/lib/jsduck/web/class_icons.rb +76 -0
  86. data/lib/jsduck/web/css.rb +12 -1
  87. data/lib/jsduck/web/data.rb +4 -3
  88. data/lib/jsduck/web/index_html.rb +26 -10
  89. data/lib/jsduck/web/member_icons.rb +3 -3
  90. data/lib/jsduck/web/search.rb +4 -4
  91. data/lib/jsduck/web/source.rb +1 -1
  92. data/lib/jsduck/web/template.rb +6 -6
  93. data/lib/jsduck/web/tree.rb +22 -0
  94. data/lib/jsduck/web/writer.rb +11 -9
  95. data/template-min/app-0f524ddd276c4019a11a6128932a9c96.js +1 -0
  96. data/template-min/index-template.html +1 -1
  97. data/template-min/print-template.html +1 -1
  98. data/template-min/resources/css/{app-4689d2a5522dcd3c9e9923ca59c33f27.css → app-de670120f43fdad3091a0cc2c10daadb.css} +1 -1
  99. data/template-min/resources/images/icons.xcf +0 -0
  100. data/template-min/template.html +2 -2
  101. metadata +46 -13
  102. data/lib/jsduck/css/lexer.rb +0 -203
  103. data/lib/jsduck/option_parser.rb +0 -109
  104. data/lib/jsduck/web/icons.rb +0 -31
  105. data/template-min/app-0c945a27f43452df695771ddb60b3d14.js +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 08d1a9118d609f1035882ef597e139b4de6655a8
4
- data.tar.gz: 06595bf58bd8c1382dea7e3e01155909ed8c9e69
3
+ metadata.gz: 22b2eee9a27379a8bcb0c152fd6749ac45803aae
4
+ data.tar.gz: 19aca3cbd478c9b9c9dd917a50950580d461ad3c
5
5
  SHA512:
6
- metadata.gz: 6099cee44749de6f4070a0f8b3127f1aad85e1cca3f043e5096afeda5016461d494eb07a82efbda85b2d11be2b1a7de8d8f0cd20a6ffe62e125dcef8df329fcb
7
- data.tar.gz: db32d24569d9ed089ae9a5da09137b780e14c0d6ae15146ede2df077f30ba7ef6700505f72531e07e064a0de9bffcf18c101e3f50bcb093ff3a8b2189118bb4e
6
+ metadata.gz: 18f5f78668b4d1ccc721ab6e0c6fc4e2b07716a524269d6d87bbca2d02b87505e46cbc4f5e27e0c54f451bd40266bf09bbc60f7c9322033a732b9bf6797d0b0a
7
+ data.tar.gz: 8d73b981ebc7e1edaadb280b5bd59293ecdb91d54aa98be139c63f53286a8ca7cbcfaa1694e586efa624371cc03edd7d99c2f77f6c984976a23312205574eeb7
data/README.md CHANGED
@@ -98,7 +98,7 @@ Who's using JSDuck?
98
98
  - [CKEditor](http://docs.ckeditor.com)
99
99
  - [GeoExt 2](https://github.com/geoext/geoext2)
100
100
  - Rally Software [Rally App SDK](https://prod.help.rallydev.com/apps/2.0rc1/doc/)
101
- - Wikimedia Foundation [Mediawiki](https://doc.wikimedia.org/mediawiki-core/master/js/)
101
+ - Wikimedia Foundation [MediaWiki](https://doc.wikimedia.org/mediawiki-core/master/js/)
102
102
  and [VisualEditor](https://doc.wikimedia.org/VisualEditor/master/)
103
103
  - [Sencha](http://docs.sencha.com) - obviously :)
104
104
 
@@ -148,7 +148,7 @@ input.
148
148
  Changelog
149
149
  ---------
150
150
 
151
- See [the Releases page](https://github.com/senchalabs/jsduck/Releases).
151
+ See [the Releases page](https://github.com/senchalabs/jsduck/releases).
152
152
 
153
153
 
154
154
  More questions?
data/bin/jsduck CHANGED
@@ -18,10 +18,10 @@
18
18
  $:.unshift File.dirname(File.dirname(__FILE__)) + "/lib"
19
19
 
20
20
  require 'jsduck/app'
21
- require 'jsduck/options'
21
+ require 'jsduck/options/processor'
22
+
23
+ opts = JsDuck::Options::Processor.process(ARGV)
22
24
 
23
- opts = JsDuck::Options.new
24
- opts.parse!(ARGV)
25
25
  exit_code = JsDuck::App.new(opts).run
26
26
 
27
27
  exit exit_code
@@ -10,7 +10,7 @@ module JsDuck
10
10
 
11
11
  # The main application logic of jsduck
12
12
  class App
13
- # Initializes app with JsDuck::Options object
13
+ # Initializes app with JsDuck::OptionsRecord object
14
14
  def initialize(opts)
15
15
  @opts = opts
16
16
  end
@@ -36,7 +36,7 @@ module JsDuck
36
36
  @guides = Guides.create(@opts.guides, doc_formatter, @opts)
37
37
  @videos = Videos.create(@opts.videos)
38
38
  @examples = Examples.create(@opts.examples, @opts)
39
- @categories = Categories::Factory.create(@opts.categories_path, doc_formatter, @relations)
39
+ @categories = Categories::Factory.create(@opts.categories, doc_formatter, @relations)
40
40
  @news = News.create(@relations, doc_formatter, @opts)
41
41
  end
42
42
 
@@ -45,8 +45,8 @@ module JsDuck
45
45
  #
46
46
  # Welcome page and categories are written in JsDuck::IndexHtml
47
47
  def write
48
- @guides.write(@opts.output_dir+"/guides")
49
- Img::Writer.copy(@images.all_used, @opts.output_dir+"/images")
48
+ @guides.write(@opts.output+"/guides")
49
+ Img::Writer.copy(@images.all_used, @opts.output+"/images")
50
50
  end
51
51
 
52
52
  end
@@ -1,4 +1,4 @@
1
- require 'jsduck/tag_registry'
1
+ require 'jsduck/member_registry'
2
2
 
3
3
  module JsDuck
4
4
 
@@ -38,7 +38,7 @@ module JsDuck
38
38
  # Returns the detected member type on success.
39
39
  # Otherwise nil.
40
40
  def self.detect_member(doc_map)
41
- type = TagRegistry.member_type_names.find {|type| doc_map[type] }
41
+ type = MemberRegistry.names.find {|type| doc_map[type] }
42
42
 
43
43
  if type == :cfg
44
44
  # Only detect a single @cfg as a :cfg.
@@ -13,6 +13,7 @@ require 'jsduck/process/inherit_doc'
13
13
  require 'jsduck/process/versions'
14
14
  require 'jsduck/process/return_values'
15
15
  require 'jsduck/process/fires'
16
+ require 'jsduck/process/components'
16
17
  require 'jsduck/process/lint'
17
18
  require 'jsduck/process/no_doc'
18
19
  require 'jsduck/process/circular_deps'
@@ -61,7 +62,7 @@ module JsDuck
61
62
  # classes inside Relations container.
62
63
  def to_class_objects(docs, opts)
63
64
  classes = docs.map {|d| Class.new(d) }
64
- Relations.new(classes, opts.external_classes)
65
+ Relations.new(classes, opts.external)
65
66
  end
66
67
 
67
68
  # Do all kinds of post-processing on Relations object.
@@ -71,6 +72,7 @@ module JsDuck
71
72
  Process::Versions.new(relations, opts).process_all!
72
73
  Process::ReturnValues.new(relations).process_all!
73
74
  Process::Fires.new(relations).process_all!
75
+ Process::Components.new(relations).process_all!
74
76
  Process::Lint.new(relations).process_all!
75
77
  Process::NoDoc.new(relations).process_all!
76
78
  relations
@@ -38,7 +38,7 @@ module JsDuck
38
38
  end.map {|cls| cls[:name] }.sort
39
39
 
40
40
  if classes.length == 0
41
- Logger.warn(:cat_no_match, "No class found matching a pattern '#{name}' in categories file", @filename)
41
+ Logger.warn(:cat_no_match, "No class found matching a pattern '#{name}' in categories file", {:filename => @filename})
42
42
  end
43
43
  classes
44
44
  end
@@ -58,7 +58,7 @@ module JsDuck
58
58
  # Check that each existing non-private & non-deprecated class is listed
59
59
  @relations.each do |cls|
60
60
  unless listed_classes[cls[:name]] || cls[:private] || cls[:deprecated]
61
- Logger.warn(:cat_class_missing, "Class '#{cls[:name]}' not found in categories file", @filename)
61
+ Logger.warn(:cat_class_missing, "Class '#{cls[:name]}' not found in categories file", {:filename => @filename})
62
62
  end
63
63
  end
64
64
  end
@@ -50,7 +50,7 @@ module JsDuck
50
50
 
51
51
  if tagname == :cfg || tagname == :constructor
52
52
  group_name = tagname
53
- if tagname == :cfg && tag[:name] !~ /\./
53
+ if tagname == :cfg && (tag[:name] !~ /\./ || groups[:cfg].length == 0)
54
54
  groups[:cfg] << []
55
55
  end
56
56
  end
@@ -1,120 +1,89 @@
1
- require 'jsduck/css/lexer'
1
+ require 'sass'
2
+ require 'jsduck/css/type'
2
3
 
3
4
  module JsDuck
4
5
  module Css
5
6
 
7
+ # Parses SCSS using the official SASS parser.
6
8
  class Parser
9
+ TYPE = Css::Type.new
10
+
7
11
  def initialize(input, options = {})
8
- @lex = Css::Lexer.new(input)
12
+ @input = input
9
13
  @docs = []
10
14
  end
11
15
 
12
- # Parses the whole CSS block and returns same kind of structure
13
- # that JavaScript parser does.
16
+ # Returns an array of docsets like the Js::Parser does.
14
17
  def parse
15
- while !@lex.empty? do
16
- if look(:doc_comment)
17
- comment = @lex.next(true)
18
- @docs << {
19
- :comment => comment[:value],
20
- :linenr => comment[:linenr],
21
- :code => code_block,
22
- :type => :doc_comment,
23
- }
24
- else
25
- @lex.next
26
- end
27
- end
18
+ root = Sass::Engine.new(@input, :syntax => :scss).to_tree
19
+ find_doc_comments(root.children)
28
20
  @docs
29
21
  end
30
22
 
31
- # <code-block> := <mixin-declaration> | <var-declaration> | <property>
32
- def code_block
33
- if look("@mixin")
34
- mixin_declaration
35
- elsif look(:var, ":")
36
- var_declaration
37
- else
38
- # Default to property like in Js::Parser.
39
- {:tagname => :property}
23
+ private
24
+
25
+ def find_doc_comments(nodes)
26
+ prev_comment = nil
27
+
28
+ nodes.each do |node|
29
+ if prev_comment
30
+ @docs << make_docset(prev_comment, node)
31
+ prev_comment = nil
32
+ end
33
+
34
+ if node.class == Sass::Tree::CommentNode
35
+ if node.type == :normal && node.value[0] =~ /\A\/\*\*/
36
+ prev_comment = node
37
+ end
38
+ end
39
+
40
+ find_doc_comments(node.children)
40
41
  end
41
- end
42
42
 
43
- # <mixin-declaration> := "@mixin" <ident>
44
- def mixin_declaration
45
- match("@mixin")
46
- return {
47
- :tagname => :css_mixin,
48
- :name => look(:ident) ? match(:ident) : nil,
49
- }
43
+ if prev_comment
44
+ @docs << make_docset(prev_comment)
45
+ end
50
46
  end
51
47
 
52
- # <var-declaration> := <var> ":" <css-value>
53
- def var_declaration
54
- name = match(:var)
55
- match(":")
56
- value_list = css_value
48
+ def make_docset(prev_comment, node=nil)
57
49
  return {
58
- :tagname => :css_var,
59
- :name => name,
60
- :default => value_list.map {|v| v[:value] }.join(" "),
61
- :type => value_type(value_list),
50
+ :comment => prev_comment.value[0].sub(/\A\/\*\*/, "").sub(/\*\/\z/, ""),
51
+ :linenr => prev_comment.line,
52
+ :code => analyze_code(node),
53
+ :type => :doc_comment,
62
54
  }
63
55
  end
64
56
 
65
- # <css-value> := ...anything up to... [ ";" | "}" | "!default" ]
66
- def css_value
67
- val = []
68
- while !look(";") && !look("}") && !look("!", "default")
69
- val << @lex.next(true)
70
- end
71
- val
72
- end
73
-
74
- # Determines type of CSS value
75
- def value_type(val)
76
- case val[0][:type]
77
- when :number
78
- "number"
79
- when :dimension
80
- "length"
81
- when :percentage
82
- "percentage"
83
- when :string
84
- "string"
85
- when :hash
86
- "color"
87
- when :ident
88
- case val[0][:value]
89
- when "true", "false"
90
- return "boolean"
91
- when "rgb", "rgba", "hsl", "hsla"
92
- return "color"
93
- when "black", "silver", "gray", "white", "maroon",
94
- "red", "purple", "fuchsia", "green", "lime", "olive",
95
- "yellow", "navy", "blue", "teal", "aqua", "orange"
96
- return "color"
97
- when "transparent"
98
- return "color"
99
- end
57
+ def analyze_code(node)
58
+ if node.class == Sass::Tree::VariableNode
59
+ return {
60
+ :tagname => :css_var,
61
+ :name => "$" + node.name,
62
+ :default => node.expr.to_sass,
63
+ :type => TYPE.detect(node.expr),
64
+ }
65
+ elsif node.class == Sass::Tree::MixinDefNode
66
+ return {
67
+ :tagname => :css_mixin,
68
+ :name => node.name,
69
+ :params => build_params(node.args),
70
+ }
71
+ else
72
+ # Default to property like in Js::Parser.
73
+ return {:tagname => :property}
100
74
  end
101
75
  end
102
76
 
103
- # Matches all arguments, returns the value of last match
104
- # When the whole sequence doesn't match, throws exception
105
- def match(*args)
106
- if look(*args)
107
- last = nil
108
- args.length.times { last = @lex.next }
109
- last
110
- else
111
- throw "Expected: " + args.join(", ")
77
+ def build_params(mixin_args)
78
+ mixin_args.map do |arg|
79
+ {
80
+ :name => "$" + arg[0].name,
81
+ :default => arg[1] ? arg[1].to_s : nil,
82
+ :type => arg[1] ? TYPE.detect(arg[1]) : nil,
83
+ }
112
84
  end
113
85
  end
114
86
 
115
- def look(*args)
116
- @lex.look(*args)
117
- end
118
87
  end
119
88
 
120
89
  end
@@ -0,0 +1,55 @@
1
+ require 'sass'
2
+
3
+ module JsDuck
4
+ module Css
5
+
6
+ class Type
7
+ # Given SASS expression node, determines its type.
8
+ # When unknown, return nil.
9
+ def detect(node)
10
+ if LITERAL_TYPES[node.class]
11
+ LITERAL_TYPES[node.class]
12
+ elsif node.class == Sass::Script::Funcall && COLOR_FUNCTIONS[node.name]
13
+ "color"
14
+ else
15
+ nil
16
+ end
17
+ end
18
+
19
+ LITERAL_TYPES = {
20
+ Sass::Script::Number => "number",
21
+ Sass::Script::String => "string",
22
+ Sass::Script::Color => "color",
23
+ Sass::Script::Bool => "boolean",
24
+ Sass::Script::List => "list",
25
+ }
26
+
27
+ COLOR_FUNCTIONS = {
28
+ # CSS3 builtins
29
+ "rgb" => true,
30
+ "rgba" => true,
31
+ "hsl" => true,
32
+ "hsla" => true,
33
+ # SASS builtins
34
+ "mix" => true,
35
+ "adjust-hue" => true,
36
+ "lighten" => true,
37
+ "darken" => true,
38
+ "saturate" => true,
39
+ "desaturate" => true,
40
+ "grayscale" => true,
41
+ "complement" => true,
42
+ "invert" => true,
43
+ "opacify" => true,
44
+ "fade-in" => true,
45
+ "transparentize" => true,
46
+ "fade-out" => true,
47
+ "adjust-color" => true,
48
+ "scale-color" => true,
49
+ "change-color" => true,
50
+ }
51
+
52
+ end
53
+
54
+ end
55
+ end
@@ -102,7 +102,7 @@ module JsDuck
102
102
 
103
103
  skip_white
104
104
  else
105
- warn(:tag, "Unsupported tag: @#{name}")
105
+ warn(:tag, "Unsupported tag: @#{name}", [name.to_sym])
106
106
  @multiline_tag[:doc] += "@"
107
107
  end
108
108
  end
@@ -73,8 +73,8 @@ module JsDuck
73
73
  end
74
74
 
75
75
  # Prints a warning message
76
- def warn(type, msg)
77
- Logger.warn(type, msg, @position)
76
+ def warn(type, msg, params=[])
77
+ Logger.warn(type, msg, @position, params)
78
78
  end
79
79
 
80
80
  end
@@ -61,7 +61,7 @@ module JsDuck
61
61
 
62
62
  def warn(name, pos)
63
63
  parent = name.sub(/\.[^.]*$/, '')
64
- msg = "Ignoring subproperty '#{name}' not parent found with name '#{parent}'."
64
+ msg = "Ignoring subproperty '#{name}' no parent found with name '#{parent}'."
65
65
  Logger.warn(:subproperty, msg, pos)
66
66
  end
67
67
 
@@ -20,19 +20,19 @@ module JsDuck
20
20
  def write
21
21
  format_classes
22
22
 
23
- clean_output_dir unless @opts.output_dir == :stdout
23
+ clean_output_dir unless @opts.output == :stdout
24
24
 
25
25
  export_classes
26
26
  export_examples_in_guides if @opts.export == :examples
27
27
 
28
- Util::Stdout.flush if @opts.output_dir == :stdout
28
+ Util::Stdout.flush if @opts.output == :stdout
29
29
  end
30
30
 
31
31
  private
32
32
 
33
33
  def export_classes
34
34
  cw = ClassWriter.new(get_exporter, @relations, @opts)
35
- cw.write(@opts.output_dir, ".json")
35
+ cw.write(@opts.output, ".json")
36
36
  end
37
37
 
38
38
  def get_exporter
@@ -45,7 +45,7 @@ module JsDuck
45
45
 
46
46
  def export_examples_in_guides
47
47
  gw = GuideWriter.new(Exporter::Examples, @assets.guides, @opts)
48
- gw.write(@opts.output_dir, ".json")
48
+ gw.write(@opts.output, ".json")
49
49
  end
50
50
 
51
51
  # -- util routines --
@@ -1,6 +1,7 @@
1
1
  require 'jsduck/render/class'
2
2
  require 'jsduck/exporter/full'
3
3
  require 'jsduck/tag_registry'
4
+ require 'jsduck/web/class_icons'
4
5
 
5
6
  module JsDuck
6
7
  module Exporter
@@ -18,7 +19,7 @@ module JsDuck
18
19
  def export(cls)
19
20
  data = @full_exporter.export(cls)
20
21
 
21
- data[:component] = cls.inherits_from?("Ext.Component")
22
+ data[:classIcon] = Web::ClassIcons.get(cls)
22
23
  data[:superclasses] = cls.superclasses.collect {|c| c[:name] }
23
24
  data[:subclasses] = @relations.subclasses(cls).collect {|c| c[:name] }.sort
24
25
  data[:mixedInto] = @relations.mixed_into(cls).collect {|c| c[:name] }.sort