jsduck 4.0.1 → 4.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +14 -0
- data/esprima/esprima.js +210 -85
- data/jsduck.gemspec +3 -3
- data/lib/jsduck/accessors.rb +10 -8
- data/lib/jsduck/aggregator.rb +7 -7
- data/lib/jsduck/app.rb +24 -164
- data/lib/jsduck/app_data.rb +2 -4
- data/lib/jsduck/assets.rb +5 -2
- data/lib/jsduck/ast.rb +9 -4
- data/lib/jsduck/batch_formatter.rb +54 -0
- data/lib/jsduck/batch_parser.rb +106 -0
- data/lib/jsduck/categories.rb +5 -6
- data/lib/jsduck/class.rb +77 -239
- data/lib/jsduck/class_doc_expander.rb +0 -5
- data/lib/jsduck/class_formatter.rb +14 -10
- data/lib/jsduck/class_name.rb +23 -0
- data/lib/jsduck/class_writer.rb +9 -8
- data/lib/jsduck/doc_ast.rb +5 -6
- data/lib/jsduck/doc_formatter.rb +61 -272
- data/lib/jsduck/enum.rb +4 -4
- data/lib/jsduck/esprima.rb +10 -4
- data/lib/jsduck/examples.rb +5 -5
- data/lib/jsduck/export_writer.rb +62 -0
- data/lib/jsduck/exporter/app.rb +62 -0
- data/lib/jsduck/exporter/examples.rb +58 -0
- data/lib/jsduck/exporter/full.rb +60 -0
- data/lib/jsduck/file_categories.rb +7 -4
- data/lib/jsduck/function_ast.rb +99 -0
- data/lib/jsduck/grouped_asset.rb +27 -16
- data/lib/jsduck/guide_writer.rb +8 -7
- data/lib/jsduck/guides.rb +31 -29
- data/lib/jsduck/icons.rb +12 -1
- data/lib/jsduck/images.rb +3 -3
- data/lib/jsduck/importer.rb +7 -7
- data/lib/jsduck/index_html.rb +20 -6
- data/lib/jsduck/inherit_doc.rb +9 -12
- data/lib/jsduck/inline/example.rb +42 -0
- data/lib/jsduck/inline/img.rb +55 -0
- data/lib/jsduck/inline/link.rb +227 -0
- data/lib/jsduck/inline/video.rb +67 -0
- data/lib/jsduck/inline_examples.rb +7 -7
- data/lib/jsduck/js_parser.rb +5 -4
- data/lib/jsduck/lint.rb +14 -2
- data/lib/jsduck/logger.rb +5 -6
- data/lib/jsduck/members_index.rb +132 -0
- data/lib/jsduck/merger.rb +3 -9
- data/lib/jsduck/options.rb +39 -41
- data/lib/jsduck/override.rb +3 -7
- data/lib/jsduck/relations.rb +9 -9
- data/lib/jsduck/renderer.rb +3 -3
- data/lib/jsduck/return_values.rb +72 -0
- data/lib/jsduck/search_data.rb +16 -20
- data/lib/jsduck/shortener.rb +58 -0
- data/lib/jsduck/signature_renderer.rb +1 -2
- data/lib/jsduck/source/file.rb +98 -0
- data/lib/jsduck/source/file_parser.rb +72 -0
- data/lib/jsduck/source/writer.rb +89 -0
- data/lib/jsduck/tag/aside.rb +1 -1
- data/lib/jsduck/tag/since.rb +1 -1
- data/lib/jsduck/template_dir.rb +2 -2
- data/lib/jsduck/util/html.rb +27 -0
- data/lib/jsduck/util/io.rb +32 -0
- data/lib/jsduck/util/json.rb +60 -0
- data/lib/jsduck/util/null_object.rb +23 -0
- data/lib/jsduck/util/os.rb +14 -0
- data/lib/jsduck/util/parallel.rb +34 -0
- data/lib/jsduck/util/singleton.rb +35 -0
- data/lib/jsduck/util/stdout.rb +33 -0
- data/lib/jsduck/videos.rb +5 -5
- data/lib/jsduck/web_writer.rb +79 -0
- data/lib/jsduck/welcome.rb +6 -6
- data/spec/class_factory.rb +20 -0
- metadata +32 -20
- data/lib/jsduck/api_exporter.rb +0 -48
- data/lib/jsduck/app_exporter.rb +0 -60
- data/lib/jsduck/examples_exporter.rb +0 -56
- data/lib/jsduck/full_exporter.rb +0 -35
- data/lib/jsduck/html.rb +0 -25
- data/lib/jsduck/inline_img.rb +0 -53
- data/lib/jsduck/inline_video.rb +0 -58
- data/lib/jsduck/io.rb +0 -30
- data/lib/jsduck/json_duck.rb +0 -52
- data/lib/jsduck/lexer.rb +0 -251
- data/lib/jsduck/null_object.rb +0 -19
- data/lib/jsduck/os.rb +0 -11
- data/lib/jsduck/parallel_wrap.rb +0 -32
- data/lib/jsduck/source_file.rb +0 -97
- data/lib/jsduck/source_file_parser.rb +0 -70
- data/lib/jsduck/source_writer.rb +0 -87
- data/lib/jsduck/stats.rb +0 -103
- data/lib/jsduck/stdout.rb +0 -31
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 = '4.
|
6
|
-
s.date = '2012-
|
5
|
+
s.version = '4.1.1'
|
6
|
+
s.date = '2012-09-14'
|
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"
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.rubyforge_project = s.name
|
13
13
|
|
14
14
|
s.files = `git ls-files`.split("\n").find_all do |file|
|
15
|
-
file !~ /spec.rb$/ && file !~ /benchmark/ && file !~ /template\// && file !~ /opt\//
|
15
|
+
file !~ /spec.rb$/ && file !~ /benchmark/ && file !~ /template\// && file !~ /opt\// && file !~ /comments\//
|
16
16
|
end
|
17
17
|
# Add files not in git
|
18
18
|
s.files += Dir['template-min/**/*']
|
data/lib/jsduck/accessors.rb
CHANGED
@@ -9,37 +9,39 @@ module JsDuck
|
|
9
9
|
# not added.
|
10
10
|
def create(cls)
|
11
11
|
# Grab all configs tagged as @accessor
|
12
|
-
accessors = cls[:members]
|
12
|
+
accessors = cls[:members].find_all {|m| m[:tagname] == :cfg && m[:accessor] }
|
13
13
|
|
14
14
|
# Build lookup tables of method and event names
|
15
|
-
methods = build_lookup_table(cls[:members]
|
16
|
-
events = build_lookup_table(cls[:members]
|
15
|
+
methods = build_lookup_table(cls[:members], :method)
|
16
|
+
events = build_lookup_table(cls[:members], :event)
|
17
17
|
|
18
18
|
accessors.each do |cfg|
|
19
19
|
# add getter if no method with same name exists
|
20
20
|
get = create_getter(cfg)
|
21
21
|
if !methods[get[:name]]
|
22
|
-
cls[:members]
|
22
|
+
cls[:members] << get
|
23
23
|
end
|
24
24
|
# add setter if no method with same name exists
|
25
25
|
set = create_setter(cfg)
|
26
26
|
if !methods[set[:name]]
|
27
|
-
cls[:members]
|
27
|
+
cls[:members] << set
|
28
28
|
end
|
29
29
|
# for evented accessors
|
30
30
|
if cfg[:evented]
|
31
31
|
# add event if no event with same name exists
|
32
32
|
ev = create_event(cfg)
|
33
33
|
if !events[ev[:name]]
|
34
|
-
cls[:members]
|
34
|
+
cls[:members] << ev
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
def build_lookup_table(members)
|
40
|
+
def build_lookup_table(members, tagname)
|
41
41
|
map = {}
|
42
|
-
members.each
|
42
|
+
members.each do |m|
|
43
|
+
map[m[:name]] = m if m[:tagname] == tagname
|
44
|
+
end
|
43
45
|
map
|
44
46
|
end
|
45
47
|
|
data/lib/jsduck/aggregator.rb
CHANGED
@@ -81,7 +81,7 @@ module JsDuck
|
|
81
81
|
def warn_alt_name(cls)
|
82
82
|
file = cls[:files][0][:filename]
|
83
83
|
line = cls[:files][0][:linenr]
|
84
|
-
Logger.
|
84
|
+
Logger.warn(:alt_name, "Name #{cls[:name]} used as both classname and alternate classname", file, line)
|
85
85
|
end
|
86
86
|
|
87
87
|
# Merges new class-doc into old one.
|
@@ -106,8 +106,7 @@ module JsDuck
|
|
106
106
|
end
|
107
107
|
old[:doc] = old[:doc].length > 0 ? old[:doc] : new[:doc]
|
108
108
|
# Additionally the doc-comment can contain configs and constructor
|
109
|
-
old[:members]
|
110
|
-
old[:members][:method] += new[:members][:method]
|
109
|
+
old[:members] += new[:members]
|
111
110
|
end
|
112
111
|
|
113
112
|
# Tries to place members into classes where they belong.
|
@@ -138,7 +137,7 @@ module JsDuck
|
|
138
137
|
end
|
139
138
|
|
140
139
|
def add_to_class(cls, member)
|
141
|
-
cls[
|
140
|
+
cls[:members] << member
|
142
141
|
end
|
143
142
|
|
144
143
|
def add_orphan(node)
|
@@ -188,8 +187,7 @@ module JsDuck
|
|
188
187
|
:doc => doc,
|
189
188
|
:mixins => [],
|
190
189
|
:alternateClassNames => [],
|
191
|
-
:members =>
|
192
|
-
:statics => Class.default_members_hash,
|
190
|
+
:members => [],
|
193
191
|
:aliases => {},
|
194
192
|
:meta => {},
|
195
193
|
:files => [{:filename => "", :linenr => 0, :href => ""}],
|
@@ -215,7 +213,9 @@ module JsDuck
|
|
215
213
|
:doc => "The options object passed to {@link Ext.util.Observable#addListener}."
|
216
214
|
}
|
217
215
|
@classes.each_value do |cls|
|
218
|
-
cls[:members]
|
216
|
+
cls[:members].each do |m|
|
217
|
+
m[:params] << options if m[:tagname] == :event
|
218
|
+
end
|
219
219
|
end
|
220
220
|
end
|
221
221
|
|
data/lib/jsduck/app.rb
CHANGED
@@ -1,31 +1,8 @@
|
|
1
|
-
require '
|
2
|
-
require 'jsduck/aggregator'
|
3
|
-
require 'jsduck/source_file'
|
4
|
-
require 'jsduck/doc_formatter'
|
5
|
-
require 'jsduck/class_formatter'
|
6
|
-
require 'jsduck/class'
|
7
|
-
require 'jsduck/relations'
|
8
|
-
require 'jsduck/inherit_doc'
|
9
|
-
require 'jsduck/parallel_wrap'
|
10
|
-
require 'jsduck/logger'
|
1
|
+
require 'jsduck/batch_parser'
|
11
2
|
require 'jsduck/assets'
|
12
|
-
require 'jsduck/
|
13
|
-
require 'jsduck/
|
14
|
-
require 'jsduck/
|
15
|
-
require 'jsduck/lint'
|
16
|
-
require 'jsduck/template_dir'
|
17
|
-
require 'jsduck/class_writer'
|
18
|
-
require 'jsduck/source_writer'
|
19
|
-
require 'jsduck/app_data'
|
20
|
-
require 'jsduck/index_html'
|
21
|
-
require 'jsduck/api_exporter'
|
22
|
-
require 'jsduck/full_exporter'
|
23
|
-
require 'jsduck/app_exporter'
|
24
|
-
require 'jsduck/examples_exporter'
|
25
|
-
require 'jsduck/inline_examples'
|
26
|
-
require 'jsduck/guide_writer'
|
27
|
-
require 'jsduck/stdout'
|
28
|
-
require 'fileutils'
|
3
|
+
require 'jsduck/meta_tag_registry'
|
4
|
+
require 'jsduck/export_writer'
|
5
|
+
require 'jsduck/web_writer'
|
29
6
|
|
30
7
|
module JsDuck
|
31
8
|
|
@@ -34,159 +11,42 @@ module JsDuck
|
|
34
11
|
# Initializes app with JsDuck::Options object
|
35
12
|
def initialize(opts)
|
36
13
|
@opts = opts
|
37
|
-
# Sets the nr of parallel processes to use.
|
38
|
-
# Set to 0 to disable parallelization completely.
|
39
|
-
ParallelWrap.in_processes = @opts.processes
|
40
|
-
# Turn JSON pretty-printing on/off
|
41
|
-
JsonDuck.pretty = @opts.pretty_json
|
42
14
|
end
|
43
15
|
|
44
|
-
#
|
16
|
+
# Main App logic.
|
45
17
|
def run
|
46
|
-
|
47
|
-
result = aggregate(parsed_files)
|
48
|
-
@relations = filter_classes(result)
|
49
|
-
InheritDoc.new(@relations).resolve_all
|
50
|
-
Importer.import(@opts.imports, @relations, @opts.new_since)
|
51
|
-
Lint.new(@relations).run
|
18
|
+
parse
|
52
19
|
|
53
|
-
|
54
|
-
@assets = Assets.new(@relations, @opts)
|
55
|
-
|
56
|
-
# Give access to assets from all meta-tags
|
57
|
-
MetaTagRegistry.instance.assets = @assets
|
20
|
+
init_assets
|
58
21
|
|
59
22
|
if @opts.export
|
60
|
-
|
61
|
-
FileUtils.rm_rf(@opts.output_dir) unless @opts.output_dir == :stdout
|
62
|
-
exporters = {
|
63
|
-
:full => FullExporter,
|
64
|
-
:api => ApiExporter,
|
65
|
-
:examples => ExamplesExporter,
|
66
|
-
}
|
67
|
-
cw = ClassWriter.new(exporters[@opts.export], @relations, @opts)
|
68
|
-
cw.write(@opts.output_dir, ".json")
|
69
|
-
if @opts.export == :examples
|
70
|
-
gw = GuideWriter.new(exporters[@opts.export], @assets.guides, @opts)
|
71
|
-
gw.write(@opts.output_dir, ".json")
|
72
|
-
end
|
73
|
-
Stdout.instance.flush
|
23
|
+
generate_export
|
74
24
|
else
|
75
|
-
|
76
|
-
TemplateDir.new(@opts).write
|
77
|
-
|
78
|
-
IndexHtml.new(@assets, @opts).write
|
79
|
-
|
80
|
-
AppData.new(@relations, @assets, @opts).write(@opts.output_dir+"/data.js")
|
81
|
-
|
82
|
-
# class-formatting is done in parallel which breaks the links
|
83
|
-
# between source files and classes. Therefore it MUST to be done
|
84
|
-
# after writing sources which needs the links to work.
|
85
|
-
if @opts.source
|
86
|
-
source_writer = SourceWriter.new(parsed_files)
|
87
|
-
source_writer.write(@opts.output_dir + "/source")
|
88
|
-
end
|
89
|
-
format_classes
|
90
|
-
|
91
|
-
if @opts.tests
|
92
|
-
examples = InlineExamples.new
|
93
|
-
examples.add_classes(@relations)
|
94
|
-
examples.add_guides(@assets.guides)
|
95
|
-
examples.write(@opts.output_dir+"/inline-examples.js")
|
96
|
-
end
|
97
|
-
|
98
|
-
cw = ClassWriter.new(AppExporter, @relations, @opts)
|
99
|
-
cw.write(@opts.output_dir+"/output", ".js")
|
100
|
-
|
101
|
-
@assets.write
|
25
|
+
generate_web_page
|
102
26
|
end
|
103
27
|
end
|
104
28
|
|
105
|
-
|
106
|
-
def parallel_parse(filenames)
|
107
|
-
ParallelWrap.map(filenames) do |fname|
|
108
|
-
Logger.instance.log("Parsing", fname)
|
109
|
-
begin
|
110
|
-
SourceFile.new(JsDuck::IO.read(fname), fname, @opts)
|
111
|
-
rescue
|
112
|
-
Logger.instance.fatal_backtrace("Error while parsing #{fname}", $!)
|
113
|
-
exit(1)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
29
|
+
private
|
117
30
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
parsed_files.each do |file|
|
122
|
-
Logger.instance.log("Aggregating", file.filename)
|
123
|
-
agr.aggregate(file)
|
124
|
-
end
|
125
|
-
agr.classify_orphans
|
126
|
-
agr.create_global_class
|
127
|
-
agr.remove_ignored_classes
|
128
|
-
agr.create_accessors
|
129
|
-
if @opts.ext4_events == true || (@opts.ext4_events == nil && agr.ext4?)
|
130
|
-
agr.append_ext4_event_options
|
131
|
-
end
|
132
|
-
agr.process_enums
|
133
|
-
# Ignore override classes after applying them to actual classes
|
134
|
-
@opts.external_classes += agr.process_overrides.map {|o| o[:name] }
|
135
|
-
agr.result
|
31
|
+
def parse
|
32
|
+
@batch_parser = BatchParser.new(@opts)
|
33
|
+
@relations = @batch_parser.run
|
136
34
|
end
|
137
35
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
# but of course can be turned off using --warnings=-global
|
142
|
-
def filter_classes(docs)
|
143
|
-
classes = []
|
144
|
-
docs.each do |d|
|
145
|
-
cls = Class.new(d)
|
146
|
-
if d[:name] != "global"
|
147
|
-
classes << cls
|
148
|
-
else
|
149
|
-
# add global class only if --ignore-global not specified
|
150
|
-
classes << cls unless @opts.ignore_global
|
36
|
+
def init_assets
|
37
|
+
# Initialize guides, videos, examples, ...
|
38
|
+
@assets = Assets.new(@relations, @opts)
|
151
39
|
|
152
|
-
|
153
|
-
|
154
|
-
type = m[:tagname].to_s
|
155
|
-
name = m[:name]
|
156
|
-
file = m[:files][0]
|
157
|
-
Logger.instance.warn(:global, "Global #{type}: #{name}", file[:filename], file[:linenr])
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
Relations.new(classes, @opts.external_classes)
|
40
|
+
# Give access to assets from all meta-tags
|
41
|
+
MetaTagRegistry.instance.assets = @assets
|
162
42
|
end
|
163
43
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
class_formatter.include_types = !@opts.export
|
171
|
-
# Format all doc-objects in parallel
|
172
|
-
formatted_classes = ParallelWrap.map(@relations.classes) do |cls|
|
173
|
-
files = cls[:files].map {|f| f[:filename] }.join(" ")
|
174
|
-
Logger.instance.log("Markdown formatting #{cls[:name]}", files)
|
175
|
-
begin
|
176
|
-
{
|
177
|
-
:doc => class_formatter.format(cls.internal_doc),
|
178
|
-
:images => doc_formatter.images
|
179
|
-
}
|
180
|
-
rescue
|
181
|
-
Logger.instance.fatal_backtrace("Error while formatting #{cls[:name]} #{files}", $!)
|
182
|
-
exit(1)
|
183
|
-
end
|
184
|
-
end
|
185
|
-
# Then merge the data back to classes sequentially
|
186
|
-
formatted_classes.each do |cls|
|
187
|
-
@relations[cls[:doc][:name]].internal_doc = cls[:doc]
|
188
|
-
cls[:images].each {|img| @assets.images.add(img) }
|
189
|
-
end
|
44
|
+
def generate_export
|
45
|
+
ExportWriter.new(@relations, @assets, @opts).write
|
46
|
+
end
|
47
|
+
|
48
|
+
def generate_web_page
|
49
|
+
WebWriter.new(@relations, @assets, @batch_parser.parsed_files, @opts).write
|
190
50
|
end
|
191
51
|
|
192
52
|
end
|
data/lib/jsduck/app_data.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
require 'jsduck/
|
1
|
+
require 'jsduck/util/json'
|
2
2
|
require 'jsduck/icons'
|
3
3
|
require 'jsduck/search_data'
|
4
|
-
require 'jsduck/stats'
|
5
4
|
require 'jsduck/meta_tag_registry'
|
6
5
|
|
7
6
|
module JsDuck
|
@@ -16,14 +15,13 @@ module JsDuck
|
|
16
15
|
|
17
16
|
# Writes classes, guides, videos, and search data to one big .js file
|
18
17
|
def write(filename)
|
19
|
-
js = "Docs = " +
|
18
|
+
js = "Docs = " + Util::Json.generate({
|
20
19
|
:data => {
|
21
20
|
:classes => Icons.new.create(@relations.classes),
|
22
21
|
:guides => @assets.guides.to_array,
|
23
22
|
:videos => @assets.videos.to_array,
|
24
23
|
:examples => @assets.examples.to_array,
|
25
24
|
:search => SearchData.new.create(@relations.classes, @assets),
|
26
|
-
:stats => @opts.stats ? Stats.new.create(@relations.classes) : [],
|
27
25
|
:tests => @opts.tests,
|
28
26
|
:signatures => MetaTagRegistry.instance.signatures,
|
29
27
|
:localStorageDb => @opts.local_storage_db,
|
data/lib/jsduck/assets.rb
CHANGED
@@ -26,12 +26,15 @@ module JsDuck
|
|
26
26
|
@relations = relations
|
27
27
|
@opts = opts
|
28
28
|
|
29
|
+
doc_formatter = DocFormatter.new(@opts)
|
30
|
+
doc_formatter.relations = @relations
|
31
|
+
|
29
32
|
@images = Images.new(@opts.images)
|
30
33
|
@welcome = Welcome.create(@opts.welcome)
|
31
|
-
@guides = Guides.create(@opts.guides,
|
34
|
+
@guides = Guides.create(@opts.guides, doc_formatter, @opts)
|
32
35
|
@videos = Videos.create(@opts.videos)
|
33
36
|
@examples = Examples.create(@opts.examples, @opts)
|
34
|
-
@categories = Categories.create(@opts.categories_path,
|
37
|
+
@categories = Categories.create(@opts.categories_path, doc_formatter, @relations)
|
35
38
|
end
|
36
39
|
|
37
40
|
# Writes out the assets that can be written out separately:
|
data/lib/jsduck/ast.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "jsduck/serializer"
|
2
2
|
require "jsduck/evaluator"
|
3
|
+
require "jsduck/function_ast"
|
3
4
|
|
4
5
|
module JsDuck
|
5
6
|
|
@@ -224,7 +225,6 @@ module JsDuck
|
|
224
225
|
cls[:mixins] = []
|
225
226
|
cls[:aliases] = []
|
226
227
|
cls[:members] = []
|
227
|
-
cls[:statics] = []
|
228
228
|
cls[:code_type] = :ext_define
|
229
229
|
|
230
230
|
each_pair_in_object_expression(ast["arguments"][1]) do |key, value, pair|
|
@@ -254,9 +254,9 @@ module JsDuck
|
|
254
254
|
when "eventedConfig"
|
255
255
|
cls[:members] += make_configs(value, {:accessor => true, :evented => true})
|
256
256
|
when "statics"
|
257
|
-
cls[:
|
257
|
+
cls[:members] += make_statics(value)
|
258
258
|
when "inheritableStatics"
|
259
|
-
cls[:
|
259
|
+
cls[:members] += make_statics(value, {:inheritable => true})
|
260
260
|
else
|
261
261
|
detect_method_or_property(cls, key, value, pair)
|
262
262
|
end
|
@@ -393,7 +393,8 @@ module JsDuck
|
|
393
393
|
return {
|
394
394
|
:tagname => :method,
|
395
395
|
:name => name,
|
396
|
-
:params => make_params(ast)
|
396
|
+
:params => make_params(ast),
|
397
|
+
:chainable => chainable?(ast) && name != "constructor",
|
397
398
|
}
|
398
399
|
end
|
399
400
|
|
@@ -405,6 +406,10 @@ module JsDuck
|
|
405
406
|
end
|
406
407
|
end
|
407
408
|
|
409
|
+
def chainable?(ast)
|
410
|
+
FunctionAst.chainable?(ast)
|
411
|
+
end
|
412
|
+
|
408
413
|
def make_property(name=nil, ast=nil, tagname=:property)
|
409
414
|
return {
|
410
415
|
:tagname => tagname,
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'jsduck/util/parallel'
|
2
|
+
require 'jsduck/class_formatter'
|
3
|
+
require 'jsduck/doc_formatter'
|
4
|
+
require 'jsduck/logger'
|
5
|
+
|
6
|
+
module JsDuck
|
7
|
+
|
8
|
+
# Performs the formatting of the doc-object of all classes.
|
9
|
+
class BatchFormatter
|
10
|
+
|
11
|
+
# Formats all classes.
|
12
|
+
# Also registers found images in assets.
|
13
|
+
def self.format_all!(relations, assets, opts)
|
14
|
+
# Format all doc-objects in parallel
|
15
|
+
formatted_classes = Util::Parallel.map(relations.classes) do |cls|
|
16
|
+
|
17
|
+
files = cls[:files].map {|f| f[:filename] }.join(" ")
|
18
|
+
Logger.log("Markdown formatting #{cls[:name]}", files)
|
19
|
+
|
20
|
+
formatter = create_class_formatter(relations, opts)
|
21
|
+
begin
|
22
|
+
{
|
23
|
+
:doc => formatter.format(cls.internal_doc),
|
24
|
+
:images => formatter.images
|
25
|
+
}
|
26
|
+
rescue
|
27
|
+
Logger.fatal_backtrace("Error while formatting #{cls[:name]} #{files}", $!)
|
28
|
+
exit(1)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Then merge the data back to classes sequentially
|
33
|
+
formatted_classes.each do |cls|
|
34
|
+
relations[cls[:doc][:name]].internal_doc = cls[:doc]
|
35
|
+
cls[:images].each {|img| assets.images.add(img) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Factory method to create new ClassFormatter instances.
|
40
|
+
def self.create_class_formatter(relations, opts)
|
41
|
+
doc_formatter = DocFormatter.new(opts)
|
42
|
+
doc_formatter.relations = relations
|
43
|
+
doc_formatter.img_path = "images"
|
44
|
+
|
45
|
+
class_formatter = ClassFormatter.new(relations, doc_formatter)
|
46
|
+
# Don't format types when exporting
|
47
|
+
class_formatter.include_types = !opts.export
|
48
|
+
|
49
|
+
class_formatter
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|