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 +9 -7
- data/bin/compare +4 -4
- data/js-classes/Date.js +1 -1
- data/jsduck.gemspec +2 -2
- data/lib/jsduck/accessors.rb +15 -15
- data/lib/jsduck/aggregator.rb +1 -2
- data/lib/jsduck/api_exporter.rb +1 -1
- data/lib/jsduck/app_exporter.rb +2 -7
- data/lib/jsduck/class.rb +22 -3
- data/lib/jsduck/class_formatter.rb +20 -5
- data/lib/jsduck/class_writer.rb +1 -1
- data/lib/jsduck/full_exporter.rb +1 -1
- data/lib/jsduck/js_parser.rb +23 -10
- data/lib/jsduck/lexer.rb +32 -29
- data/lib/jsduck/lint.rb +20 -0
- data/lib/jsduck/logger.rb +2 -1
- data/lib/jsduck/merger.rb +3 -0
- data/lib/jsduck/options.rb +1 -1
- data/lib/jsduck/renderer.rb +12 -17
- data/lib/jsduck/tag/template.rb +2 -1
- metadata +5 -5
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()) || (
|
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", "
|
224
|
-
system("cp", "-r", "
|
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/
|
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/
|
249
|
-
"--eg-iframe", "template-min/
|
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 {
|
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.
|
6
|
-
s.date = '
|
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"
|
data/lib/jsduck/accessors.rb
CHANGED
@@ -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]
|
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
|
-
|
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
|
-
|
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
|
-
:
|
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[
|
132
|
+
h[key] = value unless key == :required
|
133
133
|
end
|
134
134
|
h
|
135
135
|
end
|
data/lib/jsduck/aggregator.rb
CHANGED
@@ -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
|
data/lib/jsduck/api_exporter.rb
CHANGED
data/lib/jsduck/app_exporter.rb
CHANGED
@@ -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
|
11
|
-
super(relations
|
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
|
-
|
27
|
-
cls[
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
data/lib/jsduck/class_writer.rb
CHANGED
@@ -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
|
12
|
+
@exporter = exporter_class.new(relations)
|
13
13
|
@parallel = ParallelWrap.new(:in_processes => opts.processes)
|
14
14
|
end
|
15
15
|
|
data/lib/jsduck/full_exporter.rb
CHANGED
data/lib/jsduck/js_parser.rb
CHANGED
@@ -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(
|
76
|
+
if look(:function)
|
77
77
|
function
|
78
|
-
elsif look(
|
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(
|
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(
|
100
|
+
match(:function)
|
101
101
|
return {
|
102
102
|
:type => :function,
|
103
|
-
:name => look(:ident) ? match(:ident)[:value] :
|
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(
|
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(
|
148
|
-
|
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(
|
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 =>
|
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 == :
|
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" =>
|
221
|
-
"case" =>
|
222
|
-
"catch" =>
|
223
|
-
"continue" =>
|
224
|
-
"default" =>
|
225
|
-
"delete" =>
|
226
|
-
"do" =>
|
227
|
-
"else" =>
|
228
|
-
"finally" =>
|
229
|
-
"for" =>
|
230
|
-
"function" =>
|
231
|
-
"if" =>
|
232
|
-
"in" =>
|
233
|
-
"instanceof" =>
|
234
|
-
"new" =>
|
235
|
-
"return" =>
|
236
|
-
"switch" =>
|
237
|
-
"this" =>
|
238
|
-
"throw" =>
|
239
|
-
"try" =>
|
240
|
-
"typeof" =>
|
241
|
-
"var" =>
|
242
|
-
"void" =>
|
243
|
-
"while" =>
|
244
|
-
"with" =>
|
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])
|
data/lib/jsduck/options.rb
CHANGED
data/lib/jsduck/renderer.rb
CHANGED
@@ -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[:
|
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
|
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
|
-
|
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
|
-
|
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
|
|
data/lib/jsduck/tag/template.rb
CHANGED
@@ -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
|
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:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 3.
|
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:
|
19
|
+
date: 2012-01-04 00:00:00 +02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|