jsduck 3.2.1 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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