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/lib/jsduck/override.rb
CHANGED
@@ -27,7 +27,7 @@ module JsDuck
|
|
27
27
|
target = @classes_hash[override[:override]]
|
28
28
|
unless target
|
29
29
|
ctx = override[:files][0]
|
30
|
-
return Logger.
|
30
|
+
return Logger.warn(:extend, "Class #{override[:override]} not found", ctx[:filename], ctx[:linenr])
|
31
31
|
end
|
32
32
|
|
33
33
|
# Combine comments of classes
|
@@ -64,15 +64,11 @@ module JsDuck
|
|
64
64
|
# helpers
|
65
65
|
|
66
66
|
def each_member(cls)
|
67
|
-
[:members
|
68
|
-
cls[category].each_pair do |key, members|
|
69
|
-
members.each {|m| yield m }
|
70
|
-
end
|
71
|
-
end
|
67
|
+
cls[:members].each {|m| yield m }
|
72
68
|
end
|
73
69
|
|
74
70
|
def add_member(cls, m)
|
75
|
-
cls[
|
71
|
+
cls[:members] << m
|
76
72
|
end
|
77
73
|
|
78
74
|
def add_doc(m, doc)
|
data/lib/jsduck/relations.rb
CHANGED
@@ -20,7 +20,7 @@ module JsDuck
|
|
20
20
|
# mixins and subclasses will depend on that.
|
21
21
|
@lookup = {}
|
22
22
|
@classes.each do |cls|
|
23
|
-
@lookup[cls
|
23
|
+
@lookup[cls[:name]] = cls
|
24
24
|
(cls[:alternateClassNames] || []).each do |alt_name|
|
25
25
|
@lookup[alt_name] = cls
|
26
26
|
end
|
@@ -58,31 +58,31 @@ module JsDuck
|
|
58
58
|
def reg_subclasses(cls)
|
59
59
|
if !cls.parent
|
60
60
|
# do nothing
|
61
|
-
elsif @subs[cls.parent
|
62
|
-
@subs[cls.parent
|
61
|
+
elsif @subs[cls.parent[:name]]
|
62
|
+
@subs[cls.parent[:name]] << cls
|
63
63
|
else
|
64
|
-
@subs[cls.parent
|
64
|
+
@subs[cls.parent[:name]] = [cls]
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
68
|
# Returns subclasses of particular class, empty array if none
|
69
69
|
def subclasses(cls)
|
70
|
-
@subs[cls
|
70
|
+
@subs[cls[:name]] || []
|
71
71
|
end
|
72
72
|
|
73
73
|
def reg_mixed_into(cls)
|
74
74
|
cls.mixins.each do |mix|
|
75
|
-
if @mixes[mix
|
76
|
-
@mixes[mix
|
75
|
+
if @mixes[mix[:name]]
|
76
|
+
@mixes[mix[:name]] << cls
|
77
77
|
else
|
78
|
-
@mixes[mix
|
78
|
+
@mixes[mix[:name]] = [cls]
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
83
|
# Returns classes having particular mixin, empty array if none
|
84
84
|
def mixed_into(cls)
|
85
|
-
@mixes[cls
|
85
|
+
@mixes[cls[:name]] || []
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
data/lib/jsduck/renderer.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'jsduck/html'
|
1
|
+
require 'jsduck/util/html'
|
2
2
|
require 'jsduck/meta_tag_renderer'
|
3
3
|
require 'jsduck/signature_renderer'
|
4
4
|
|
@@ -252,7 +252,7 @@ module JsDuck
|
|
252
252
|
doc << m[:doc]
|
253
253
|
|
254
254
|
if m[:default] && m[:default] != "undefined"
|
255
|
-
doc << "<p>Defaults to: <code>" + HTML.escape(m[:default]) + "</code></p>"
|
255
|
+
doc << "<p>Defaults to: <code>" + Util::HTML.escape(m[:default]) + "</code></p>"
|
256
256
|
end
|
257
257
|
|
258
258
|
doc << render_meta_data(m[:html_meta], :bottom)
|
@@ -318,7 +318,7 @@ module JsDuck
|
|
318
318
|
p[:optional] ? " (optional)" : "",
|
319
319
|
"<div class='sub-desc'>",
|
320
320
|
p[:doc],
|
321
|
-
p[:default] ? "<p>Defaults to: <code>#{HTML.escape(p[:default])}</code></p>" : "",
|
321
|
+
p[:default] ? "<p>Defaults to: <code>#{Util::HTML.escape(p[:default])}</code></p>" : "",
|
322
322
|
p[:properties] && p[:properties].length > 0 ? render_params_and_return(p) : "",
|
323
323
|
"</div>",
|
324
324
|
"</li>",
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module JsDuck
|
2
|
+
|
3
|
+
# Auto-detector return values and @chainable tags.
|
4
|
+
#
|
5
|
+
# Adds @chainable tag when doc-comment contains @return {OwnerClass}
|
6
|
+
# this. Also the other way around: when @chainable found, adds
|
7
|
+
# appropriate @return.
|
8
|
+
class ReturnValues
|
9
|
+
# Only this static method of this class should be called.
|
10
|
+
def self.auto_detect(relations)
|
11
|
+
ReturnValues.new(relations).process_all!
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(relations)
|
15
|
+
@relations = relations
|
16
|
+
@cls = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def process_all!
|
20
|
+
@relations.each do |cls|
|
21
|
+
@cls = cls
|
22
|
+
cls.find_members(:tagname => :method, :local => true, :static => false).each do |m|
|
23
|
+
process(m)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def process(m)
|
31
|
+
if constructor?(m)
|
32
|
+
add_return_new(m)
|
33
|
+
elsif chainable?(m)
|
34
|
+
add_return_this(m)
|
35
|
+
elsif returns_this?(m)
|
36
|
+
add_chainable(m)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def constructor?(m)
|
41
|
+
m[:name] == "constructor"
|
42
|
+
end
|
43
|
+
|
44
|
+
def chainable?(m)
|
45
|
+
m[:meta][:chainable]
|
46
|
+
end
|
47
|
+
|
48
|
+
def returns_this?(m)
|
49
|
+
m[:return] && m[:return][:type] == @cls[:name] && m[:return][:doc] =~ /\Athis\b/
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_chainable(m)
|
53
|
+
m[:meta][:chainable] = true
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_return_this(m)
|
57
|
+
if m[:return][:type] == "undefined" && m[:return][:doc] == ""
|
58
|
+
m[:return] = {:type => @cls[:name], :doc => "this"}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def add_return_new(m)
|
63
|
+
if m[:return][:type] == "undefined"
|
64
|
+
# Create a whole new :return hash.
|
65
|
+
# If we were to just change the :type field it would modify
|
66
|
+
# the type of all the inherited constructor docs.
|
67
|
+
m[:return] = {:type => @cls[:name], :doc => m[:return][:doc]}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
data/lib/jsduck/search_data.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'jsduck/icons'
|
2
|
+
require 'jsduck/class_name'
|
1
3
|
|
2
4
|
module JsDuck
|
3
5
|
|
@@ -22,15 +24,9 @@ module JsDuck
|
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
# skip inherited items and constructors
|
29
|
-
if m[:owner] == cls.full_name && m[:name] != cls.short_name
|
30
|
-
list << member_node(m, cls)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
27
|
+
# add all local members, but skip constructors
|
28
|
+
cls[:members].each do |m|
|
29
|
+
list << member_node(m, cls) unless m[:name] == ClassName.short(cls[:name])
|
34
30
|
end
|
35
31
|
end
|
36
32
|
|
@@ -49,8 +45,8 @@ module JsDuck
|
|
49
45
|
return {
|
50
46
|
:name => name,
|
51
47
|
:fullName => alias_display_name(key)+": "+name,
|
52
|
-
:icon => cls
|
53
|
-
:url => "#!/api/" + cls
|
48
|
+
:icon => Icons::class_icon(cls) + "-redirect",
|
49
|
+
:url => "#!/api/" + cls[:name],
|
54
50
|
:meta => cls[:meta],
|
55
51
|
:sort => 0,
|
56
52
|
}
|
@@ -58,10 +54,10 @@ module JsDuck
|
|
58
54
|
|
59
55
|
def class_node(cls)
|
60
56
|
return {
|
61
|
-
:name => cls
|
62
|
-
:fullName => cls
|
63
|
-
:icon => cls
|
64
|
-
:url => "#!/api/" + cls
|
57
|
+
:name => ClassName.short(cls[:name]),
|
58
|
+
:fullName => cls[:name],
|
59
|
+
:icon => Icons::class_icon(cls),
|
60
|
+
:url => "#!/api/" + cls[:name],
|
65
61
|
:meta => cls[:meta],
|
66
62
|
:sort => 1,
|
67
63
|
}
|
@@ -69,11 +65,11 @@ module JsDuck
|
|
69
65
|
|
70
66
|
def alt_node(name, cls)
|
71
67
|
return {
|
72
|
-
:name =>
|
68
|
+
:name => ClassName.short(name),
|
73
69
|
:fullName => name,
|
74
70
|
:type => :class,
|
75
|
-
:icon => cls
|
76
|
-
:url => "#!/api/" + cls
|
71
|
+
:icon => Icons::class_icon(cls) + "-redirect",
|
72
|
+
:url => "#!/api/" + cls[:name],
|
77
73
|
:meta => cls[:meta],
|
78
74
|
:sort => 2,
|
79
75
|
}
|
@@ -82,9 +78,9 @@ module JsDuck
|
|
82
78
|
def member_node(member, cls)
|
83
79
|
return {
|
84
80
|
:name => member[:name],
|
85
|
-
:fullName => cls
|
81
|
+
:fullName => cls[:name] + "." + member[:name],
|
86
82
|
:icon => "icon-" + member[:tagname].to_s,
|
87
|
-
:url => "#!/api/" + cls
|
83
|
+
:url => "#!/api/" + cls[:name] + "-" + member[:id],
|
88
84
|
:meta => member[:meta],
|
89
85
|
:sort => 3,
|
90
86
|
}
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'jsduck/util/html'
|
3
|
+
require 'jsduck/util/singleton'
|
4
|
+
|
5
|
+
module JsDuck
|
6
|
+
|
7
|
+
# Little helper for shortening text
|
8
|
+
class Shortener
|
9
|
+
include Util::Singleton
|
10
|
+
|
11
|
+
# Maximum length for text that doesn't get shortened.
|
12
|
+
# The accessor is used for testing purposes only.
|
13
|
+
attr_accessor :max_length
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@max_length = 120
|
17
|
+
end
|
18
|
+
|
19
|
+
# Shortens text
|
20
|
+
#
|
21
|
+
# 116 chars is also where ext-doc makes its cut, but unlike
|
22
|
+
# ext-doc we only make the cut when there's more than 120 chars.
|
23
|
+
#
|
24
|
+
# This way we don't get stupid expansions like:
|
25
|
+
#
|
26
|
+
# Blah blah blah some text...
|
27
|
+
#
|
28
|
+
# expanding to:
|
29
|
+
#
|
30
|
+
# Blah blah blah some text.
|
31
|
+
#
|
32
|
+
def shorten(input)
|
33
|
+
sent = first_sentence(Util::HTML.strip_tags(input).strip)
|
34
|
+
# Use u-modifier to correctly count multi-byte characters
|
35
|
+
chars = sent.scan(/./mu)
|
36
|
+
if chars.length > @max_length
|
37
|
+
chars[0..(@max_length-4)].join + "..."
|
38
|
+
else
|
39
|
+
sent + " ..."
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns the first sentence inside a string.
|
44
|
+
def first_sentence(str)
|
45
|
+
str.sub(/\A(.+?(\.|。))\s.*\Z/mu, "\\1")
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns true when input should get shortened.
|
49
|
+
def too_long?(input)
|
50
|
+
stripped = Util::HTML.strip_tags(input).strip
|
51
|
+
# for sentence v/s full - compare byte length
|
52
|
+
# for full v/s max - compare char length
|
53
|
+
first_sentence(stripped).length < stripped.length || stripped.scan(/./mu).length > @max_length
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'jsduck/source/file_parser'
|
2
|
+
require 'jsduck/util/html'
|
3
|
+
|
4
|
+
module JsDuck
|
5
|
+
module Source
|
6
|
+
|
7
|
+
# Represents one JavaScript or CSS source file.
|
8
|
+
#
|
9
|
+
# The filename parameter determines whether it's parsed as
|
10
|
+
# JavaScript (the default) or CSS.
|
11
|
+
class File
|
12
|
+
attr_reader :filename
|
13
|
+
attr_reader :contents
|
14
|
+
attr_reader :docs
|
15
|
+
attr_reader :html_filename
|
16
|
+
|
17
|
+
def initialize(contents, filename="", options={})
|
18
|
+
@contents = contents
|
19
|
+
@filename = filename
|
20
|
+
@html_filename = ""
|
21
|
+
@links = {}
|
22
|
+
|
23
|
+
@docs = Source::FileParser.new.parse(@contents, @filename, options)
|
24
|
+
|
25
|
+
@docs.map do |docset|
|
26
|
+
link(docset[:linenr], docset)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# loops through each doc-object in file
|
31
|
+
def each(&block)
|
32
|
+
@docs.each(&block)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Sets the html filename of this file,
|
36
|
+
# updating also all doc-objects linking this file
|
37
|
+
def html_filename=(html_filename)
|
38
|
+
@html_filename = html_filename
|
39
|
+
@links.each_value do |line|
|
40
|
+
line.each do |link|
|
41
|
+
link[:file][:html_filename] = @html_filename
|
42
|
+
link[:file][:href] = @html_filename + "#" + id(link[:doc])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns source code as HTML with lines starting doc-comments specially marked.
|
48
|
+
def to_html
|
49
|
+
linenr = 0
|
50
|
+
lines = []
|
51
|
+
# Use #each_line instead of #lines to support Ruby 1.6
|
52
|
+
@contents.each_line do |line|
|
53
|
+
linenr += 1;
|
54
|
+
line = Util::HTML.escape(line)
|
55
|
+
# wrap the line in as many spans as there are links to this line number.
|
56
|
+
if @links[linenr]
|
57
|
+
@links[linenr].each do |link|
|
58
|
+
line = "<span id='#{id(link[:doc])}'>#{line}</span>"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
lines << line
|
62
|
+
end
|
63
|
+
lines.join()
|
64
|
+
end
|
65
|
+
|
66
|
+
def id(doc)
|
67
|
+
if doc[:tagname] == :class
|
68
|
+
doc[:name].gsub(/\./, '-')
|
69
|
+
else
|
70
|
+
# when creation of global class is skipped,
|
71
|
+
# this owner property can be nil.
|
72
|
+
(doc[:owner] || "global").gsub(/\./, '-') + "-" + doc[:id]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
# Creates two-way link between sourcefile and doc-object.
|
79
|
+
# If doc-object is class, links also the contained cfgs and constructor.
|
80
|
+
# Returns the modified doc-object after done.
|
81
|
+
def link(linenr, doc)
|
82
|
+
@links[linenr] = [] unless @links[linenr]
|
83
|
+
file = {
|
84
|
+
:filename => @filename,
|
85
|
+
:linenr => linenr,
|
86
|
+
}
|
87
|
+
@links[linenr] << {:doc => doc, :file => file}
|
88
|
+
doc[:files] = [file]
|
89
|
+
if doc[:tagname] == :class
|
90
|
+
doc[:members].each {|m| link(linenr, m) }
|
91
|
+
end
|
92
|
+
doc
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'jsduck/js_parser'
|
2
|
+
require 'jsduck/css_parser'
|
3
|
+
require 'jsduck/doc_parser'
|
4
|
+
require 'jsduck/merger'
|
5
|
+
require 'jsduck/ast'
|
6
|
+
require 'jsduck/doc_type'
|
7
|
+
require 'jsduck/doc_ast'
|
8
|
+
require 'jsduck/class_doc_expander'
|
9
|
+
|
10
|
+
module JsDuck
|
11
|
+
module Source
|
12
|
+
|
13
|
+
# Performs the actual parsing of CSS or JS source.
|
14
|
+
#
|
15
|
+
# This is the class that brings together all the different steps of
|
16
|
+
# parsing the source.
|
17
|
+
class FileParser
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@doc_type = DocType.new
|
21
|
+
@doc_parser = DocParser.new
|
22
|
+
@class_doc_expander = ClassDocExpander.new
|
23
|
+
@doc_ast = DocAst.new
|
24
|
+
@merger = Merger.new
|
25
|
+
end
|
26
|
+
|
27
|
+
# Parses file into final docset that can be fed into Aggregator
|
28
|
+
def parse(contents, filename="", options={})
|
29
|
+
@doc_ast.filename = filename
|
30
|
+
|
31
|
+
parse_js_or_css(contents, filename, options).map do |docset|
|
32
|
+
expand(docset)
|
33
|
+
end.flatten.map do |docset|
|
34
|
+
merge(docset)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# Parses the file depending on filename as JS or CSS
|
41
|
+
def parse_js_or_css(contents, filename, options)
|
42
|
+
if filename =~ /\.s?css$/
|
43
|
+
docs = CssParser.new(contents, options).parse
|
44
|
+
else
|
45
|
+
docs = JsParser.new(contents, options).parse
|
46
|
+
docs = Ast.new(docs, options).detect_all!
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Parses the docs, detects tagname and expands class docset
|
51
|
+
def expand(docset)
|
52
|
+
docset[:comment] = @doc_parser.parse(docset[:comment])
|
53
|
+
docset[:tagname] = @doc_type.detect(docset[:comment], docset[:code])
|
54
|
+
|
55
|
+
if docset[:tagname] == :class
|
56
|
+
@class_doc_expander.expand(docset)
|
57
|
+
else
|
58
|
+
docset
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Merges comment and code parts of docset
|
63
|
+
def merge(docset)
|
64
|
+
@doc_ast.linenr = docset[:linenr]
|
65
|
+
docset[:comment] = @doc_ast.detect(docset[:tagname], docset[:comment])
|
66
|
+
|
67
|
+
@merger.merge(docset)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|