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 +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
|