jsduck 3.2.1 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -163,12 +163,14 @@ class JsDuckRunner
163
163
  end
164
164
 
165
165
  # Enables comments when CORS is supported by browser.
166
- # This excludes Opera and IE < 8
166
+ # This excludes Opera and IE < 8.
167
+ # We check explicitly for IE version to make sure the code works the
168
+ # same way in both real IE7 and IE7-mode of IE8/9.
167
169
  def add_comments(db_name)
168
170
  comments_base_url = "http://projects.sencha.com/auth"
169
171
  @options += ["--head-html", <<-EOHTML]
170
172
  <script type="text/javascript">
171
- Docs.enableComments = ("withCredentials" in new XMLHttpRequest()) || (typeof XDomainRequest !== "undefined");
173
+ Docs.enableComments = ("withCredentials" in new XMLHttpRequest()) || (Ext.ieVersion >= 8);
172
174
  Docs.baseUrl = "#{comments_base_url}";
173
175
  Docs.commentsDb = "#{db_name}";
174
176
  </script>
@@ -220,10 +222,10 @@ class JsDuckRunner
220
222
 
221
223
  def set_touch2_src
222
224
  relative_touch_path = "../"
223
- system("cp", "-r", "opt/touch-welcome.html", "template-min/touch-welcome.html")
224
- system("cp", "-r", "opt/touch-iframe.html", "template-min/touch-iframe.html")
225
+ system("cp", "-r", "#{@sdk_dir}/touch/docs/welcome.html", "template-min/welcome.html")
226
+ system("cp", "-r", "#{@sdk_dir}/touch/docs/eg-iframe.html", "template-min/eg-iframe.html")
225
227
 
226
- ["template-min/touch-iframe.html", "template-min/touch-welcome.html"].each do |file|
228
+ ["template-min/eg-iframe.html", "template-min/welcome.html"].each do |file|
227
229
  html = IO.read(file);
228
230
 
229
231
  touch_src_re = /((src|href)="touch)/m
@@ -245,8 +247,8 @@ class JsDuckRunner
245
247
 
246
248
  @options += [
247
249
  "--body-html", head_html,
248
- "--welcome", "template-min/touch-welcome.html",
249
- "--eg-iframe", "template-min/touch-iframe.html"
250
+ "--welcome", "template-min/welcome.html",
251
+ "--eg-iframe", "template-min/eg-iframe.html"
250
252
  ]
251
253
  end
252
254
 
data/bin/compare CHANGED
@@ -32,9 +32,9 @@ end
32
32
  def compare_classes(cls1, cls2)
33
33
  diff = []
34
34
  cls1["members"].each_pair do |group_name, group_items|
35
- group_items.find_all {|m1| !m1["private"] && !m1["protected"] && m1["owner"] == cls1["name"] }.each do |m1|
35
+ group_items.find_all {|m1| !m1["private"] && !m1["meta"]["protected"] && m1["owner"] == cls1["name"] }.each do |m1|
36
36
  match = cls2["members"][group_name].find do |m2|
37
- m2["name"] == m1["name"] && !m2["protected"] && !m2["private"]
37
+ m2["name"] == m1["name"] && !m2["meta"]["protected"] && !m2["private"]
38
38
  end
39
39
  if !match && m1["name"] != "constructor" && m1["name"] != ""
40
40
  other = nil
@@ -47,9 +47,9 @@ def compare_classes(cls1, cls2)
47
47
  :name => m1["name"],
48
48
  :other => other ? {
49
49
  :type => other["tagname"],
50
- :static => other["static"],
50
+ :static => other["meta"]["static"],
51
51
  :private => other["private"],
52
- :protected => other["protected"],
52
+ :protected => other["meta"]["protected"],
53
53
  } : nil
54
54
  }
55
55
  end
data/js-classes/Date.js CHANGED
@@ -227,7 +227,7 @@
227
227
  * @param {Number} min An integer between 0 and 59 representing the minutes.
228
228
  * @param {Number} sec An integer between 0 and 59 representing the seconds.
229
229
  * @param {Number} ms An integer between 0 and 999 representing the milliseconds.
230
- * @return {Date} Number of milliseconds since January 1, 1970, 00:00:00, universal time.
230
+ * @return {Number} Number of milliseconds since January 1, 1970, 00:00:00, universal time.
231
231
  */
232
232
 
233
233
  //Methods
data/jsduck.gemspec CHANGED
@@ -2,8 +2,8 @@ Gem::Specification.new do |s|
2
2
  s.required_rubygems_version = ">= 1.3.5"
3
3
 
4
4
  s.name = 'jsduck'
5
- s.version = '3.2.1'
6
- s.date = '2011-12-07'
5
+ s.version = '3.3.0'
6
+ s.date = '2012-01-04'
7
7
  s.summary = "Simple JavaScript Duckumentation generator"
8
8
  s.description = "Documentation generator for Sencha JS frameworks"
9
9
  s.homepage = "https://github.com/senchalabs/jsduck"
@@ -9,7 +9,7 @@ module JsDuck
9
9
  # not added.
10
10
  def create(cls)
11
11
  # Grab all configs tagged as @accessor
12
- accessors = cls[:members][:cfg].find_all {|cfg| cfg[:accessor] && !cfg[:private] }
12
+ accessors = cls[:members][:cfg].find_all {|cfg| cfg[:accessor] }
13
13
 
14
14
  # Build lookup tables of method and event names
15
15
  methods = build_lookup_table(cls[:members][:method])
@@ -45,7 +45,7 @@ module JsDuck
45
45
 
46
46
  def create_getter(cfg)
47
47
  name = "get" + upcase_first(cfg[:name])
48
- return {
48
+ return add_shared({
49
49
  :tagname => :method,
50
50
  :name => name,
51
51
  :doc => "Returns the value of {@link #cfg-#{cfg[:name]}}.",
@@ -54,16 +54,13 @@ module JsDuck
54
54
  :type => cfg[:type],
55
55
  :doc => "",
56
56
  },
57
- :owner => cfg[:owner],
58
- :files => cfg[:files],
59
57
  :id => "method-" + name,
60
- :meta => clone_meta(cfg),
61
- }
58
+ }, cfg)
62
59
  end
63
60
 
64
61
  def create_setter(cfg)
65
62
  name = "set" + upcase_first(cfg[:name]);
66
- return {
63
+ return add_shared({
67
64
  :tagname => :method,
68
65
  :name => name,
69
66
  :doc => "Sets the value of {@link #cfg-#{cfg[:name]}}.",
@@ -76,17 +73,14 @@ module JsDuck
76
73
  :type => "undefined",
77
74
  :doc => "",
78
75
  },
79
- :owner => cfg[:owner],
80
- :files => cfg[:files],
81
76
  :id => "method-" + name,
82
- :meta => clone_meta(cfg),
83
- }
77
+ }, cfg)
84
78
  end
85
79
 
86
80
  def create_event(cfg)
87
81
  name = cfg[:name].downcase + "change"
88
82
  setter_name = "set" + upcase_first(cfg[:name]);
89
- return {
83
+ return add_shared({
90
84
  :tagname => :event,
91
85
  :name => name,
92
86
  :doc =>
@@ -112,11 +106,17 @@ module JsDuck
112
106
  :doc => "The existing value."
113
107
  },
114
108
  ],
109
+ :id => "event-" + name,
110
+ }, cfg)
111
+ end
112
+
113
+ def add_shared(hash, cfg)
114
+ hash.merge!({
115
115
  :owner => cfg[:owner],
116
116
  :files => cfg[:files],
117
- :id => "event-" + name,
117
+ :private => cfg[:private],
118
118
  :meta => clone_meta(cfg),
119
- }
119
+ })
120
120
  end
121
121
 
122
122
  def upcase_first(str)
@@ -129,7 +129,7 @@ module JsDuck
129
129
  def clone_meta(cfg)
130
130
  h = {}
131
131
  cfg[:meta].each_pair do |key, value|
132
- h[:key] = value unless key == :required
132
+ h[key] = value unless key == :required
133
133
  end
134
134
  h
135
135
  end
@@ -156,10 +156,9 @@ module JsDuck
156
156
  if orph[:owner]
157
157
  class_name = orph[:owner]
158
158
  if !@classes[class_name]
159
+ # this will add the class and add all orphans to it
159
160
  add_empty_class(class_name)
160
161
  end
161
- add_member(orph)
162
- @orphans.delete(orph)
163
162
  end
164
163
  end
165
164
  end
@@ -19,7 +19,7 @@ module JsDuck
19
19
  # }
20
20
  #
21
21
  class ApiExporter
22
- def initialize(relations, opts)
22
+ def initialize(relations)
23
23
  # All params ignored, they're present to be compatible with
24
24
  # other exporters.
25
25
  end
@@ -1,19 +1,14 @@
1
1
  require 'jsduck/full_exporter'
2
2
  require 'jsduck/renderer'
3
3
  require 'jsduck/doc_formatter'
4
- require 'jsduck/meta_tag_registry'
5
4
 
6
5
  module JsDuck
7
6
 
8
7
  # Exports data for Docs app.
9
8
  class AppExporter < FullExporter
10
- def initialize(relations, opts)
11
- super(relations, opts)
12
-
9
+ def initialize(relations)
10
+ super(relations)
13
11
  @renderer = Renderer.new
14
- # Inject formatter to all meta-tags.
15
- doc_formatter = DocFormatter.new(relations, opts)
16
- MetaTagRegistry.instance.formatter = doc_formatter
17
12
  end
18
13
 
19
14
  # Returns compacted class data hash which contains an additional
data/lib/jsduck/class.rb CHANGED
@@ -124,7 +124,7 @@ module JsDuck
124
124
  all_members = parent ? parent.members_hash(type, context) : {}
125
125
 
126
126
  mixins.each do |mix|
127
- all_members.merge!(mix.members_hash(type, context))
127
+ all_members.merge!(mix.members_hash(type, context)) {|k,o,n| store_overrides(k,o,n)}
128
128
  end
129
129
 
130
130
  # For static members, exclude everything not explicitly marked as inheritable
@@ -132,19 +132,38 @@ module JsDuck
132
132
  all_members.delete_if {|key, member| !member[:inheritable] }
133
133
  end
134
134
 
135
- all_members.merge!(local_members_hash(type, context))
135
+ all_members.merge!(local_members_hash(type, context)) {|k,o,n| store_overrides(k,o,n)}
136
136
 
137
137
  # If singleton has static members, include them as if they were
138
138
  # instance members. Otherwise they will be completely excluded
139
139
  # from the docs, as the static members block is not created for
140
140
  # singletons.
141
141
  if @doc[:singleton] && @doc[:statics][type].length > 0
142
- all_members.merge!(local_members_hash(type, :statics))
142
+ all_members.merge!(local_members_hash(type, :statics)) {|k,o,n| store_overrides(k,o,n)}
143
143
  end
144
144
 
145
145
  all_members
146
146
  end
147
147
 
148
+ # Invoked when merge! finds two members with the same name.
149
+ # New member always overrides the old, but inside new we keep
150
+ # a list of members it overrides. Normally one member will
151
+ # override one other member, but a member from mixin can override
152
+ # multiple members - although there's not a single such case in
153
+ # ExtJS, we have to handle it.
154
+ #
155
+ # Every overridden member is listed just once.
156
+ def store_overrides(key, old, new)
157
+ # Sometimes a class is included multiple times (like Ext.Base)
158
+ # resulting in its members overriding themselves. Because of
159
+ # this, ignore overriding itself.
160
+ if new[:owner] != old[:owner]
161
+ new[:overrides] = [] unless new[:overrides]
162
+ new[:overrides] << old unless new[:overrides].any? {|m| m[:owner] == old[:owner] }
163
+ end
164
+ new
165
+ end
166
+
148
167
  # Helper method to get the direct members of this class
149
168
  def local_members_hash(type, context)
150
169
  local_members = {}
@@ -1,5 +1,6 @@
1
1
  require 'jsduck/type_parser'
2
2
  require 'jsduck/logger'
3
+ require 'jsduck/meta_tag_registry'
3
4
 
4
5
  module JsDuck
5
6
 
@@ -13,6 +14,8 @@ module JsDuck
13
14
  def initialize(relations, formatter)
14
15
  @relations = relations
15
16
  @formatter = formatter
17
+ # inject formatter to all meta-tags
18
+ MetaTagRegistry.instance.formatter = formatter
16
19
  @include_types = true
17
20
  end
18
21
 
@@ -23,12 +26,15 @@ module JsDuck
23
26
  @formatter.class_context = cls[:name]
24
27
  @formatter.doc_context = cls[:files][0]
25
28
  cls[:doc] = @formatter.format(cls[:doc]) if cls[:doc]
26
- cls[:members].each_pair do |type, members|
27
- cls[:members][type] = members.reject {|m| m[:private] }.map {|m| format_member(m) }
28
- end
29
- cls[:statics].each_pair do |type, members|
30
- cls[:statics][type] = members.reject {|m| m[:private] }.map {|m| format_member(m) }
29
+ [:members, :statics].each do |group|
30
+ cls[group].each_pair do |type, members|
31
+ # format all public members, but keep the private members
32
+ # too - some of them might override public members and we
33
+ # don't want to lose this information.
34
+ cls[group][type] = members.map {|m| m[:private] ? m : format_member(m) }
35
+ end
31
36
  end
37
+ cls[:html_meta] = format_meta_data(cls[:meta])
32
38
  cls
33
39
  end
34
40
 
@@ -46,6 +52,7 @@ module JsDuck
46
52
  m[:params] = m[:params].map {|p| format_item(p, is_css_tag) } if m[:params]
47
53
  m[:return] = format_item(m[:return], is_css_tag) if m[:return]
48
54
  m[:properties] = m[:properties].map {|b| format_item(b, is_css_tag) } if m[:properties]
55
+ m[:html_meta] = format_meta_data(m[:meta])
49
56
  m
50
57
  end
51
58
 
@@ -75,6 +82,14 @@ module JsDuck
75
82
  end
76
83
  end
77
84
 
85
+ def format_meta_data(meta_data)
86
+ result = {}
87
+ meta_data.each_pair do |key, value|
88
+ result[key] = MetaTagRegistry.instance[key].to_html(value) if value
89
+ end
90
+ result
91
+ end
92
+
78
93
  end
79
94
 
80
95
  end
@@ -9,7 +9,7 @@ module JsDuck
9
9
  class ClassWriter
10
10
  def initialize(exporter_class, relations, opts)
11
11
  @relations = relations
12
- @exporter = exporter_class.new(relations, opts)
12
+ @exporter = exporter_class.new(relations)
13
13
  @parallel = ParallelWrap.new(:in_processes => opts.processes)
14
14
  end
15
15
 
@@ -4,7 +4,7 @@ module JsDuck
4
4
 
5
5
  # Exporter for all the class docs.
6
6
  class FullExporter
7
- def initialize(relations, opts)
7
+ def initialize(relations)
8
8
  @relations = relations
9
9
  end
10
10
 
@@ -73,9 +73,9 @@ module JsDuck
73
73
  # <code-block> := <function> | <var-declaration> | <ext-define> |
74
74
  # <assignment> | <property-literal>
75
75
  def code_block
76
- if look("function")
76
+ if look(:function)
77
77
  function
78
- elsif look("var")
78
+ elsif look(:var)
79
79
  var_declaration
80
80
  elsif ext_look(:ns, ".", "define", "(", :string)
81
81
  ext_define
@@ -86,7 +86,7 @@ module JsDuck
86
86
  elsif look(",", :ident, ":") || look(",", :string, ":")
87
87
  match(",")
88
88
  property_literal
89
- elsif look(:ident) || look("this")
89
+ elsif look(:ident) || look(:this)
90
90
  maybe_assignment
91
91
  elsif look(:string)
92
92
  {:type => :assignment, :left => [match(:string)[:value]]}
@@ -97,15 +97,25 @@ module JsDuck
97
97
 
98
98
  # <function> := "function" [ <ident> ] <function-parameters> <function-body>
99
99
  def function
100
- match("function")
100
+ match(:function)
101
101
  return {
102
102
  :type => :function,
103
- :name => look(:ident) ? match(:ident)[:value] : nil,
103
+ :name => look(:ident) ? match(:ident)[:value] : "",
104
104
  :params => function_parameters,
105
105
  :body => function_body,
106
106
  }
107
107
  end
108
108
 
109
+ # <ext-emptyfn> := "Ext" "." "emptyFn"
110
+ def ext_emptyfn
111
+ match(:ident, ".", "emptyFn")
112
+ return {
113
+ :type => :function,
114
+ :name => "",
115
+ :params => [],
116
+ }
117
+ end
118
+
109
119
  # <function-parameters> := "(" [ <ident> [ "," <ident> ]* ] ")"
110
120
  def function_parameters
111
121
  match("(")
@@ -124,7 +134,7 @@ module JsDuck
124
134
 
125
135
  # <var-declaration> := "var" <assignment>
126
136
  def var_declaration
127
- match("var")
137
+ match(:var)
128
138
  maybe_assignment
129
139
  end
130
140
 
@@ -144,8 +154,9 @@ module JsDuck
144
154
 
145
155
  # <ident-chain> := [ "this" | <ident> ] [ "." <ident> ]*
146
156
  def ident_chain
147
- if look("this")
148
- chain = [match("this")[:value]]
157
+ if look(:this)
158
+ match(:this)
159
+ chain = ["this"]
149
160
  else
150
161
  chain = [match(:ident)[:value]]
151
162
  end
@@ -156,12 +167,14 @@ module JsDuck
156
167
  return chain
157
168
  end
158
169
 
159
- # <expression> := <function> | <ext-extend> | <ext-base-css-prefix> | <literal>
170
+ # <expression> := <function> | <ext-extend> | <ext-emptyfn> | <ext-base-css-prefix> | <literal>
160
171
  def expression
161
- if look("function")
172
+ if look(:function)
162
173
  function
163
174
  elsif ext_look(:ns, ".", "extend")
164
175
  ext_extend
176
+ elsif ext_look(:ns, ".", "emptyFn")
177
+ ext_emptyfn
165
178
  elsif ext_look(:ns, ".", "baseCSSPrefix", "+", :string)
166
179
  ext_base_css_prefix
167
180
  else
data/lib/jsduck/lexer.rb CHANGED
@@ -9,12 +9,14 @@ module JsDuck
9
9
  #
10
10
  # - :number -- 25
11
11
  # - :string -- "Hello world"
12
- # - :keyword -- "typeof"
13
12
  # - :ident -- "foo"
14
13
  # - :regex -- "/abc/i"
15
14
  # - :operator -- "+"
16
15
  # - :doc_comment -- "/** My comment */"
17
16
  #
17
+ # Plus a separate types for all keywords: :if, :while, :function, ...
18
+ # For keywords the type and value are the same.
19
+ #
18
20
  # Notice that doc-comments are recognized as tokens while normal
19
21
  # comments are ignored just as whitespace.
20
22
  #
@@ -120,9 +122,10 @@ module JsDuck
120
122
  }
121
123
  elsif @input.check(/[a-zA-Z_$]/)
122
124
  value = @input.scan(/[$\w]+/)
125
+ kw = KEYWORDS[value]
123
126
  return {
124
- :type => KEYWORDS[value] ? :keyword : :ident,
125
- :value => value
127
+ :type => kw || :ident,
128
+ :value => kw || value
126
129
  }
127
130
  elsif @input.check(/'/)
128
131
  return {
@@ -189,7 +192,7 @@ module JsDuck
189
192
  value = @previous_token[:value]
190
193
  if type == :ident || type == :number
191
194
  return false
192
- elsif type == :keyword && value == "this"
195
+ elsif type == :this
193
196
  return false
194
197
  elsif type == :operator && (value == ")" || value == "]")
195
198
  return false
@@ -217,31 +220,31 @@ module JsDuck
217
220
  }x
218
221
 
219
222
  KEYWORDS = {
220
- "break" => true,
221
- "case" => true,
222
- "catch" => true,
223
- "continue" => true,
224
- "default" => true,
225
- "delete" => true,
226
- "do" => true,
227
- "else" => true,
228
- "finally" => true,
229
- "for" => true,
230
- "function" => true,
231
- "if" => true,
232
- "in" => true,
233
- "instanceof" => true,
234
- "new" => true,
235
- "return" => true,
236
- "switch" => true,
237
- "this" => true,
238
- "throw" => true,
239
- "try" => true,
240
- "typeof" => true,
241
- "var" => true,
242
- "void" => true,
243
- "while" => true,
244
- "with" => true,
223
+ "break" => :break,
224
+ "case" => :case,
225
+ "catch" => :catch,
226
+ "continue" => :continue,
227
+ "default" => :default,
228
+ "delete" => :delete,
229
+ "do" => :do,
230
+ "else" => :else,
231
+ "finally" => :finally,
232
+ "for" => :for,
233
+ "function" => :function,
234
+ "if" => :if,
235
+ "in" => :in,
236
+ "instanceof" => :instanceof,
237
+ "new" => :new,
238
+ "return" => :return,
239
+ "switch" => :switch,
240
+ "this" => :this,
241
+ "throw" => :throw,
242
+ "try" => :try,
243
+ "typeof" => :typeof,
244
+ "var" => :var,
245
+ "void" => :void,
246
+ "while" => :while,
247
+ "with" => :with,
245
248
  }
246
249
  end
247
250
 
data/lib/jsduck/lint.rb CHANGED
@@ -17,6 +17,7 @@ module JsDuck
17
17
  warn_unnamed
18
18
  warn_optional_params
19
19
  warn_duplicate_params
20
+ warn_duplicate_members
20
21
  end
21
22
 
22
23
  # print warning for each global member
@@ -84,6 +85,25 @@ module JsDuck
84
85
  end
85
86
  end
86
87
 
88
+ # print warnings for duplicate member names
89
+ def warn_duplicate_members
90
+ @relations.each do |cls|
91
+ members = {:members => {}, :statics => {}}
92
+ cls.all_local_members.each do |m|
93
+ group = (m[:meta] && m[:meta][:static]) ? :statics : :members
94
+ type = m[:tagname]
95
+ name = m[:name]
96
+ hash = members[group][type] || {}
97
+ if hash[name]
98
+ warn(:dup_member, "Duplicate #{type} name #{name}", hash[name])
99
+ warn(:dup_member, "Duplicate #{type} name #{name}", m)
100
+ end
101
+ hash[name] = m
102
+ members[group][type] = hash
103
+ end
104
+ end
105
+ end
106
+
87
107
  # Loops through all members of all classes
88
108
  def each_member(&block)
89
109
  @relations.each {|cls| cls.all_local_members.each(&block) }
data/lib/jsduck/logger.rb CHANGED
@@ -24,7 +24,8 @@ module JsDuck
24
24
  [:alt_name, "Name used as both classname and alternate classname"],
25
25
  [:name_missing, "Member or parameter has no name"],
26
26
  [:no_doc, "Member or class without documentation"],
27
- [:dup_param, "Method has two parameters with same name"],
27
+ [:dup_param, "Method has two parameters with the same name"],
28
+ [:dup_member, "Class has two members with the same name"],
28
29
  [:req_after_opt, "Required parameter comes after optional"],
29
30
  [:subproperty, "@param foo.bar where foo param doesn't exist"],
30
31
  [:sing_static, "Singleton class member marked as @static"],
data/lib/jsduck/merger.rb CHANGED
@@ -52,6 +52,9 @@ module JsDuck
52
52
  :property
53
53
  elsif doc_map[:css_var]
54
54
  :css_var
55
+ elsif doc_map[:cfg] && doc_map[:cfg].length == 1
56
+ # When just one @cfg, avoid treating it as @class
57
+ :cfg
55
58
  elsif code[:type] == :ext_define
56
59
  :class
57
60
  elsif code[:type] == :assignment && class_name?(*code[:left])
@@ -71,7 +71,7 @@ module JsDuck
71
71
  ]
72
72
  @meta_tag_paths = []
73
73
 
74
- @version = "3.2.1"
74
+ @version = "3.3.0"
75
75
 
76
76
  # Customizing output
77
77
  @title = "Sencha Docs - Ext JS"
@@ -9,17 +9,13 @@ module JsDuck
9
9
  def render(cls)
10
10
  @cls = cls
11
11
 
12
- # Set doc-formatter context to this class
13
- MetaTagRegistry.instance.formatter.class_context = @cls[:name]
14
- MetaTagRegistry.instance.formatter.doc_context = @cls[:files][0]
15
-
16
12
  return [
17
13
  "<div>",
18
14
  render_sidebar,
19
15
  "<div class='doc-contents'>",
20
16
  render_private_class_notice,
21
17
  @cls[:doc],
22
- render_meta_data(@cls[:meta]),
18
+ render_meta_data(@cls[:html_meta]),
23
19
  "</div>",
24
20
  "<div class='members'>",
25
21
  render_member_sections,
@@ -40,14 +36,7 @@ module JsDuck
40
36
  def render_meta_data(meta_data)
41
37
  return if meta_data.size == 0
42
38
 
43
- MetaTagRegistry.instance.tags.map do |tag|
44
- contents = meta_data[tag.key]
45
- if contents
46
- tag.to_html(contents)
47
- else
48
- nil
49
- end
50
- end
39
+ MetaTagRegistry.instance.tags.map {|tag| meta_data[tag.key] }
51
40
  end
52
41
 
53
42
  def render_sidebar
@@ -120,8 +109,10 @@ module JsDuck
120
109
  ]
121
110
  end
122
111
 
123
- def render_link(cls_name)
124
- return "<a href='#!/api/#{cls_name}' rel='#{cls_name}' class='docClass'>#{cls_name}</a>"
112
+ def render_link(cls_name, member=nil)
113
+ id = member ? cls_name + "-" + member[:id] : cls_name
114
+ label = member ? cls_name + "." + member[:name] : cls_name
115
+ return "<a href='#!/api/#{id}' rel='#{id}' class='docClass'>#{label}</a>"
125
116
  end
126
117
 
127
118
  def render_member_sections
@@ -249,11 +240,15 @@ module JsDuck
249
240
  doc << "<p>Defaults to: <code>" + CGI.escapeHTML(m[:default]) + "</code></p>"
250
241
  end
251
242
 
252
- MetaTagRegistry.instance.formatter.doc_context = m[:files][0]
253
- doc << render_meta_data(m[:meta])
243
+ doc << render_meta_data(m[:html_meta])
254
244
 
255
245
  doc << render_params_and_return(m)
256
246
 
247
+ if m[:overrides]
248
+ overrides = m[:overrides].map {|o| render_link(o[:owner], o) }.join(", ")
249
+ doc << "<p>Overrides: #{overrides}</p>"
250
+ end
251
+
257
252
  doc
258
253
  end
259
254
 
@@ -13,7 +13,8 @@ module JsDuck::Tag
13
13
  def to_html(contents)
14
14
  <<-EOHTML
15
15
  <div class='signature-box template'>
16
- <p>This is a template method. A hook into the functionality of this class.
16
+ <p>This is a <a href="#!/guide/components">template method</a>.
17
+ a hook into the functionality of this class.
17
18
  Feel free to override it in child classes.</p>
18
19
  </div>
19
20
  EOHTML
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsduck
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 3
8
- - 2
9
- - 1
10
- version: 3.2.1
8
+ - 3
9
+ - 0
10
+ version: 3.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Rene Saarsoo
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-12-07 00:00:00 +02:00
19
+ date: 2012-01-04 00:00:00 +02:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency