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/source_file.rb
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'jsduck/source_file_parser'
|
2
|
-
require 'jsduck/html'
|
3
|
-
|
4
|
-
module JsDuck
|
5
|
-
|
6
|
-
# Represents one JavaScript or CSS source file.
|
7
|
-
#
|
8
|
-
# The filename parameter determines whether it's parsed as
|
9
|
-
# JavaScript (the default) or CSS.
|
10
|
-
class SourceFile
|
11
|
-
attr_reader :filename
|
12
|
-
attr_reader :contents
|
13
|
-
attr_reader :docs
|
14
|
-
attr_reader :html_filename
|
15
|
-
|
16
|
-
def initialize(contents, filename="", options={})
|
17
|
-
@contents = contents
|
18
|
-
@filename = filename
|
19
|
-
@html_filename = ""
|
20
|
-
@links = {}
|
21
|
-
|
22
|
-
@docs = SourceFileParser.new.parse(@contents, @filename, options)
|
23
|
-
|
24
|
-
@docs.map do |docset|
|
25
|
-
link(docset[:linenr], docset)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# loops through each doc-object in file
|
30
|
-
def each(&block)
|
31
|
-
@docs.each(&block)
|
32
|
-
end
|
33
|
-
|
34
|
-
# Sets the html filename of this file,
|
35
|
-
# updating also all doc-objects linking this file
|
36
|
-
def html_filename=(html_filename)
|
37
|
-
@html_filename = html_filename
|
38
|
-
@links.each_value do |line|
|
39
|
-
line.each do |link|
|
40
|
-
link[:file][:html_filename] = @html_filename
|
41
|
-
link[:file][:href] = @html_filename + "#" + id(link[:doc])
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Returns source code as HTML with lines starting doc-comments specially marked.
|
47
|
-
def to_html
|
48
|
-
linenr = 0
|
49
|
-
lines = []
|
50
|
-
# Use #each_line instead of #lines to support Ruby 1.6
|
51
|
-
@contents.each_line do |line|
|
52
|
-
linenr += 1;
|
53
|
-
line = HTML.escape(line)
|
54
|
-
# wrap the line in as many spans as there are links to this line number.
|
55
|
-
if @links[linenr]
|
56
|
-
@links[linenr].each do |link|
|
57
|
-
line = "<span id='#{id(link[:doc])}'>#{line}</span>"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
lines << line
|
61
|
-
end
|
62
|
-
lines.join()
|
63
|
-
end
|
64
|
-
|
65
|
-
def id(doc)
|
66
|
-
if doc[:tagname] == :class
|
67
|
-
doc[:name].gsub(/\./, '-')
|
68
|
-
else
|
69
|
-
# when creation of global class is skipped,
|
70
|
-
# this owner property can be nil.
|
71
|
-
(doc[:owner] || "global").gsub(/\./, '-') + "-" + doc[:id]
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
# Creates two-way link between sourcefile and doc-object.
|
78
|
-
# If doc-object is class, links also the contained cfgs and constructor.
|
79
|
-
# Returns the modified doc-object after done.
|
80
|
-
def link(linenr, doc)
|
81
|
-
@links[linenr] = [] unless @links[linenr]
|
82
|
-
file = {
|
83
|
-
:filename => @filename,
|
84
|
-
:linenr => linenr,
|
85
|
-
}
|
86
|
-
@links[linenr] << {:doc => doc, :file => file}
|
87
|
-
doc[:files] = [file]
|
88
|
-
if doc[:tagname] == :class
|
89
|
-
doc[:members][:cfg].each {|cfg| link(linenr, cfg) }
|
90
|
-
doc[:members][:method].each {|method| link(linenr, method) }
|
91
|
-
end
|
92
|
-
doc
|
93
|
-
end
|
94
|
-
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
@@ -1,70 +0,0 @@
|
|
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
|
-
|
12
|
-
# Performs the actual parsing of CSS or JS source.
|
13
|
-
#
|
14
|
-
# This is the class that brings together all the different steps of
|
15
|
-
# parsing the source.
|
16
|
-
class SourceFileParser
|
17
|
-
|
18
|
-
def initialize
|
19
|
-
@doc_type = DocType.new
|
20
|
-
@doc_parser = DocParser.new
|
21
|
-
@class_doc_expander = ClassDocExpander.new
|
22
|
-
@doc_ast = DocAst.new
|
23
|
-
@merger = Merger.new
|
24
|
-
end
|
25
|
-
|
26
|
-
# Parses file into final docset that can be fed into Aggregator
|
27
|
-
def parse(contents, filename="", options={})
|
28
|
-
@doc_ast.filename = filename
|
29
|
-
|
30
|
-
parse_js_or_css(contents, filename, options).map do |docset|
|
31
|
-
expand(docset)
|
32
|
-
end.flatten.map do |docset|
|
33
|
-
merge(docset)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
# Parses the file depending on filename as JS or CSS
|
40
|
-
def parse_js_or_css(contents, filename, options)
|
41
|
-
if filename =~ /\.s?css$/
|
42
|
-
docs = CssParser.new(contents, options).parse
|
43
|
-
else
|
44
|
-
docs = JsParser.new(contents, options).parse
|
45
|
-
docs = Ast.new(docs, options).detect_all!
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# Parses the docs, detects tagname and expands class docset
|
50
|
-
def expand(docset)
|
51
|
-
docset[:comment] = @doc_parser.parse(docset[:comment])
|
52
|
-
docset[:tagname] = @doc_type.detect(docset[:comment], docset[:code])
|
53
|
-
|
54
|
-
if docset[:tagname] == :class
|
55
|
-
@class_doc_expander.expand(docset)
|
56
|
-
else
|
57
|
-
docset
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
# Merges comment and code parts of docset
|
62
|
-
def merge(docset)
|
63
|
-
@doc_ast.linenr = docset[:linenr]
|
64
|
-
docset[:comment] = @doc_ast.detect(docset[:tagname], docset[:comment])
|
65
|
-
|
66
|
-
@merger.merge(docset)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
data/lib/jsduck/source_writer.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'jsduck/logger'
|
2
|
-
require 'jsduck/parallel_wrap'
|
3
|
-
require 'fileutils'
|
4
|
-
|
5
|
-
module JsDuck
|
6
|
-
|
7
|
-
# Writes HTML JavaScript/CSS source into HTML files.
|
8
|
-
class SourceWriter
|
9
|
-
def initialize(source_files)
|
10
|
-
@source_files = source_files
|
11
|
-
end
|
12
|
-
|
13
|
-
# Writes all source files as HTML files into destination dir.
|
14
|
-
def write(destination)
|
15
|
-
generate_html_filenames
|
16
|
-
|
17
|
-
FileUtils.mkdir(destination)
|
18
|
-
ParallelWrap.each(@source_files) do |file|
|
19
|
-
Logger.instance.log("Writing source", file.html_filename)
|
20
|
-
write_single(destination + "/" + file.html_filename, file.to_html)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
# Generates unique HTML filenames for each file.
|
27
|
-
#
|
28
|
-
# Can't be done in parallel for obvious reasons, but also
|
29
|
-
# because file.html_filename= method updates all the doc-objects
|
30
|
-
# related to the file.
|
31
|
-
def generate_html_filenames
|
32
|
-
filenames = {}
|
33
|
-
@source_files.each do |file|
|
34
|
-
i = 0
|
35
|
-
begin
|
36
|
-
name = html_filename(file.filename, i)
|
37
|
-
ci_name = name.downcase # case insensitive name
|
38
|
-
i += 1
|
39
|
-
end while filenames.has_key?(ci_name)
|
40
|
-
filenames[ci_name] = true
|
41
|
-
file.html_filename = name
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# Returns HTML filename for n'th file with given name.
|
46
|
-
#
|
47
|
-
# html_filename("Foo.js", 0) => "Foo.html"
|
48
|
-
# html_filename("Foo.js", 1) => "Foo2.html"
|
49
|
-
# html_filename("Foo.js", 2) => "Foo3.html"
|
50
|
-
#
|
51
|
-
def html_filename(filename, nr=0)
|
52
|
-
File.basename(filename, ".js") + (nr > 0 ? (nr+1).to_s : "") + ".html"
|
53
|
-
end
|
54
|
-
|
55
|
-
def write_single(filename, source)
|
56
|
-
File.open(filename, 'w') {|f| f.write(wrap_page(source)) }
|
57
|
-
end
|
58
|
-
|
59
|
-
# Returns source wrapped inside HTML page
|
60
|
-
def wrap_page(source)
|
61
|
-
return <<-EOHTML
|
62
|
-
<!DOCTYPE html>
|
63
|
-
<html>
|
64
|
-
<head>
|
65
|
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
66
|
-
<title>The source code</title>
|
67
|
-
<link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
|
68
|
-
<script type="text/javascript" src="../resources/prettify/prettify.js"></script>
|
69
|
-
<style type="text/css">
|
70
|
-
.highlight { display: block; background-color: #ddd; }
|
71
|
-
</style>
|
72
|
-
<script type="text/javascript">
|
73
|
-
function highlight() {
|
74
|
-
document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
|
75
|
-
}
|
76
|
-
</script>
|
77
|
-
</head>
|
78
|
-
<body onload="prettyPrint(); highlight();">
|
79
|
-
<pre class="prettyprint lang-js">#{source}</pre>
|
80
|
-
</body>
|
81
|
-
</html>
|
82
|
-
EOHTML
|
83
|
-
end
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
data/lib/jsduck/stats.rb
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
|
2
|
-
module JsDuck
|
3
|
-
|
4
|
-
# Calculates all kinds of statistics for classes
|
5
|
-
class Stats
|
6
|
-
# Maps array of classes into array of stats per class
|
7
|
-
def create(classes)
|
8
|
-
@classes = classes
|
9
|
-
|
10
|
-
classes.map do |cls|
|
11
|
-
local_members = cls.all_local_members
|
12
|
-
total_members = cls.all_members
|
13
|
-
class_wc = wc(cls[:doc])
|
14
|
-
members_wc = members_wc(cls)
|
15
|
-
|
16
|
-
{
|
17
|
-
:name => cls[:name],
|
18
|
-
|
19
|
-
:local_cfgs => member_count(local_members, :cfg),
|
20
|
-
:local_properties => member_count(local_members, :property),
|
21
|
-
:local_methods => member_count(local_members, :method),
|
22
|
-
:local_events => member_count(local_members, :event),
|
23
|
-
:local_members => local_members.length,
|
24
|
-
|
25
|
-
:total_cfgs => member_count(total_members, :cfg),
|
26
|
-
:total_properties => member_count(total_members, :property),
|
27
|
-
:total_methods => member_count(total_members, :method),
|
28
|
-
:total_events => member_count(total_members, :event),
|
29
|
-
:total_members => total_members.length,
|
30
|
-
|
31
|
-
:fanIn => fan_in(cls),
|
32
|
-
:fanOut => fan_out(cls),
|
33
|
-
|
34
|
-
:class_wc => class_wc,
|
35
|
-
:members_wc => members_wc,
|
36
|
-
:wc_per_member => local_members.length > 0 ? (members_wc / local_members.length) : 0,
|
37
|
-
}
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def member_count(members, type)
|
42
|
-
members.find_all {|m| m[:tagname] == type }.length
|
43
|
-
end
|
44
|
-
|
45
|
-
# How many classes depend on this class
|
46
|
-
def fan_in(cls)
|
47
|
-
fan_in_table[cls[:name]] || 0
|
48
|
-
end
|
49
|
-
|
50
|
-
# On how many classes this class depends on
|
51
|
-
def fan_out(cls)
|
52
|
-
dependencies(cls).length
|
53
|
-
end
|
54
|
-
|
55
|
-
# list of class names the class depends on
|
56
|
-
def dependencies(cls)
|
57
|
-
[
|
58
|
-
cls[:extends],
|
59
|
-
cls[:mixins],
|
60
|
-
cls[:requires],
|
61
|
-
cls[:uses],
|
62
|
-
].compact.flatten.sort.uniq
|
63
|
-
end
|
64
|
-
|
65
|
-
# Returns map of class names to its fan-in number.
|
66
|
-
def fan_in_table
|
67
|
-
return @fi_table if @fi_table
|
68
|
-
|
69
|
-
@fi_table = {}
|
70
|
-
@classes.each do |cls|
|
71
|
-
dependencies(cls).each do |d|
|
72
|
-
@fi_table[d] = (@fi_table[d] || 0) + 1
|
73
|
-
end
|
74
|
-
end
|
75
|
-
@fi_table
|
76
|
-
end
|
77
|
-
|
78
|
-
# Counts nr of words in documentation of all members of class
|
79
|
-
def members_wc(cls)
|
80
|
-
cnt = 0
|
81
|
-
cls.all_local_members.each do |m|
|
82
|
-
cnt += wc(m[:doc])
|
83
|
-
(m[:params] || []).each {|p| cnt += property_wc(p) }
|
84
|
-
(m[:properties] || []).each {|p| cnt += property_wc(p) }
|
85
|
-
cnt += wc(m[:return][:doc]) if m[:return]
|
86
|
-
end
|
87
|
-
cnt
|
88
|
-
end
|
89
|
-
|
90
|
-
def property_wc(property)
|
91
|
-
cnt = wc(property[:doc] || "")
|
92
|
-
(property[:properties] || []).each {|p| cnt += property_wc(p) }
|
93
|
-
cnt
|
94
|
-
end
|
95
|
-
|
96
|
-
# Strips HTML and counts words in text
|
97
|
-
def wc(str)
|
98
|
-
str.gsub(/<\/?[^>]*>/, "").scan(/\w+/).length
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
data/lib/jsduck/stdout.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'jsduck/json_duck'
|
2
|
-
require 'singleton'
|
3
|
-
|
4
|
-
module JsDuck
|
5
|
-
|
6
|
-
# Central place for buffering JSON data that's meant to be written to STDOUT
|
7
|
-
class Stdout
|
8
|
-
include Singleton
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@data = nil
|
12
|
-
end
|
13
|
-
|
14
|
-
# Adds array of new data
|
15
|
-
def add(data)
|
16
|
-
if @data
|
17
|
-
@data += data
|
18
|
-
else
|
19
|
-
@data = data
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Writes data to STDOUT in JSON format,
|
24
|
-
# but only if some data was added.
|
25
|
-
def flush
|
26
|
-
puts JsonDuck.generate(@data) if @data
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|