yard-js 0.1.1
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.
- checksums.yaml +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +138 -0
- data/lib/yard-js.rb +30 -0
- data/lib/yard-js/code_objects.rb +8 -0
- data/lib/yard-js/code_objects/event_object.rb +11 -0
- data/lib/yard-js/code_objects/property_object.rb +83 -0
- data/lib/yard-js/core_ext/parsejs.rb +13 -0
- data/lib/yard-js/core_ext/yard.rb +17 -0
- data/lib/yard-js/core_ext/yard/code_objects.rb +45 -0
- data/lib/yard-js/core_ext/yard/registry.rb +29 -0
- data/lib/yard-js/core_ext/yard/tags.rb +48 -0
- data/lib/yard-js/core_ext/yard/templates.rb +116 -0
- data/lib/yard-js/core_ext/yard/yardoc.rb +23 -0
- data/lib/yard-js/handlers.rb +7 -0
- data/lib/yard-js/handlers/base.rb +53 -0
- data/lib/yard-js/handlers/class_handler.rb +43 -0
- data/lib/yard-js/handlers/comment_handler.rb +33 -0
- data/lib/yard-js/handlers/constant_handler.rb +50 -0
- data/lib/yard-js/handlers/instance_method_handler.rb +26 -0
- data/lib/yard-js/handlers/mixin_handler.rb +18 -0
- data/lib/yard-js/handlers/module_handler.rb +33 -0
- data/lib/yard-js/parser.rb +23 -0
- data/lib/yard-js/plugin.rb +23 -0
- data/lib/yard-js/tags.rb +37 -0
- data/lib/yard-js/version.rb +3 -0
- data/templates/default/class/setup.rb +11 -0
- data/templates/default/fulldoc/html/css/highlight.github.css +127 -0
- data/templates/default/fulldoc/html/css/style.css +10 -0
- data/templates/default/fulldoc/html/full_list_property.erb +12 -0
- data/templates/default/fulldoc/html/js/highlight.pack.js +1 -0
- data/templates/default/fulldoc/html/setup.rb +18 -0
- data/templates/default/layout/html/headers.erb +17 -0
- data/templates/default/layout/html/setup.rb +14 -0
- data/templates/default/method_details/setup.rb +13 -0
- data/templates/default/module/html/constructor_summary.erb +9 -0
- data/templates/default/module/html/events_details.erb +8 -0
- data/templates/default/module/html/events_summary.erb +20 -0
- data/templates/default/module/html/inherited_methods.erb +8 -0
- data/templates/default/module/html/inherited_properties.erb +8 -0
- data/templates/default/module/html/item_summary.erb +38 -0
- data/templates/default/module/html/method_summary.erb +11 -0
- data/templates/default/module/html/methods_details.erb +8 -0
- data/templates/default/module/html/properties_details.erb +8 -0
- data/templates/default/module/html/properties_summary.erb +11 -0
- data/templates/default/module/setup.rb +75 -0
- data/templates/default/tags/callback.erb +21 -0
- data/templates/default/tags/setup.rb +24 -0
- data/templates/default/tags/value.erb +6 -0
- data/yard-js.gemspec +15 -0
- metadata +92 -0
@@ -0,0 +1,116 @@
|
|
1
|
+
module YARD
|
2
|
+
module Templates
|
3
|
+
module Helpers
|
4
|
+
module HtmlHelper
|
5
|
+
def link_object(obj, otitle = nil, anchor = nil, relative = true)
|
6
|
+
return otitle if obj.nil?
|
7
|
+
obj = Registry.resolve(object, obj, true, true) if obj.is_a?(String)
|
8
|
+
if !otitle && obj.root?
|
9
|
+
title = "Top Level Namespace"
|
10
|
+
elsif otitle
|
11
|
+
title = otitle.to_s
|
12
|
+
elsif object.is_a?(CodeObjects::Base)
|
13
|
+
# Check if we're linking to a class method in the current
|
14
|
+
# object. If we are, create a title in the format of
|
15
|
+
# "CurrentClass.method_name"
|
16
|
+
title = h(object.relative_path(obj))
|
17
|
+
if obj.is_a?(YARDJS::CodeObjects::PropertyObject) && obj.property_type == :function
|
18
|
+
title += '()'
|
19
|
+
elsif obj.title != obj.path
|
20
|
+
title = h(obj.title)
|
21
|
+
end
|
22
|
+
else
|
23
|
+
title = h(obj.to_s)
|
24
|
+
end
|
25
|
+
return title unless serializer
|
26
|
+
return title if obj.is_a?(CodeObjects::Proxy)
|
27
|
+
|
28
|
+
link = url_for(obj, anchor, relative)
|
29
|
+
link = link ? link_url(link, title, :title => h("#{obj.title} (#{obj.type})")) : title
|
30
|
+
"<span class='object_link'>" + link + "</span>"
|
31
|
+
end
|
32
|
+
|
33
|
+
def signature_types(meth, link = true)
|
34
|
+
meth = convert_method_to_overload(meth)
|
35
|
+
if meth.respond_to?(:object) && !meth.has_tag?(:return)
|
36
|
+
meth = meth.object
|
37
|
+
end
|
38
|
+
return unless meth
|
39
|
+
|
40
|
+
type = options.default_return || ""
|
41
|
+
if meth.tag(:return) && meth.tag(:return).types
|
42
|
+
types = meth.tags(:return).map {|t| t.types ? t.types : [] }.flatten.uniq
|
43
|
+
first = link ? h(types.first) : format_types([types.first], false)
|
44
|
+
if types.size == 2 && types.last == 'null'
|
45
|
+
type = first + '<sup>?</sup>'
|
46
|
+
elsif types.size == 2 && types.last =~ /^(Array)?<#{Regexp.quote types.first}>$/
|
47
|
+
type = first + '<sup>+</sup>'
|
48
|
+
elsif types.size > 2
|
49
|
+
type = [first, '...'].join(', ')
|
50
|
+
elsif types == ['void'] && options.hide_void_return
|
51
|
+
type = ""
|
52
|
+
else
|
53
|
+
type = link ? h(types.join(", ")) : format_types(types, false)
|
54
|
+
end
|
55
|
+
elsif !type.empty?
|
56
|
+
type = link ? h(type) : format_types([type], false)
|
57
|
+
end
|
58
|
+
type = "(#{type}) " unless type.empty?
|
59
|
+
type
|
60
|
+
end
|
61
|
+
|
62
|
+
def signature(meth, link = true, show_extras = true, full_attr_name = true)
|
63
|
+
meth = convert_method_to_overload(meth)
|
64
|
+
|
65
|
+
small_type = true
|
66
|
+
type = signature_types(meth, link)
|
67
|
+
args = ''
|
68
|
+
name = meth.name.to_s
|
69
|
+
|
70
|
+
if meth.constructor?
|
71
|
+
type, name = 'new ', meth.namespace.path.gsub(/_\d+/, '')
|
72
|
+
end
|
73
|
+
|
74
|
+
if meth.property_type == :function
|
75
|
+
if meth.parameters
|
76
|
+
args = meth.parameters.map {|n, v| v ? "#{n} = #{v}" : n.to_s }.join(", ")
|
77
|
+
end
|
78
|
+
args = "(#{args})"
|
79
|
+
end
|
80
|
+
|
81
|
+
if YARDJS::Tags::CallbackTag === meth
|
82
|
+
small_type = false
|
83
|
+
type = ''
|
84
|
+
args += ' { ... }'
|
85
|
+
end
|
86
|
+
|
87
|
+
extras = []
|
88
|
+
extras_text = ''
|
89
|
+
if show_extras
|
90
|
+
extras << 'static' if meth.tag(:static)
|
91
|
+
extras << 'readonly' if meth.tag(:readonly)
|
92
|
+
extras << 'writeonly' if meth.tag(:writeonly)
|
93
|
+
extras << 'readwrite' if !meth.tag(:readonly) && !meth.tag(:writeonly) && meth.property_type != :function
|
94
|
+
extras << meth.visibility if meth.visibility != :public
|
95
|
+
extras_text = ' <span class="extras">(' + extras.join(", ") + ')</span>' unless extras.empty?
|
96
|
+
end
|
97
|
+
|
98
|
+
if small_type
|
99
|
+
title = "<small>%s</small><strong>%s</strong>%s" % [type, h(name), args]
|
100
|
+
else
|
101
|
+
title = "%s<strong>%s</strong>%s" % [type, h(name), args]
|
102
|
+
end
|
103
|
+
|
104
|
+
if link
|
105
|
+
link_title = h(name)
|
106
|
+
obj = meth.respond_to?(:object) ? meth.object : meth
|
107
|
+
url = url_for(object, obj)
|
108
|
+
link_url(url, title, :title => link_title) + extras_text
|
109
|
+
else
|
110
|
+
title + extras_text
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module YARD
|
2
|
+
module CLI
|
3
|
+
class Yardoc
|
4
|
+
def general_options_yardjs(opts)
|
5
|
+
general_options_orig(opts)
|
6
|
+
|
7
|
+
opts.on('--define-class-expr EXPR') do |expr|
|
8
|
+
YARDJS.options.define_class_expression = expr
|
9
|
+
end
|
10
|
+
|
11
|
+
opts.on('--update-class-expr EXPR') do |expr|
|
12
|
+
YARDJS.options.update_class_expression = expr
|
13
|
+
end
|
14
|
+
|
15
|
+
opts.on('--mixin-module-expr EXPR') do |expr|
|
16
|
+
YARDJS.options.mixin_module_expression = expr
|
17
|
+
end
|
18
|
+
end
|
19
|
+
alias general_options_orig general_options
|
20
|
+
alias general_options general_options_yardjs
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
require_relative 'handlers/base'
|
2
|
+
require_relative 'handlers/class_handler'
|
3
|
+
require_relative 'handlers/comment_handler'
|
4
|
+
require_relative 'handlers/constant_handler'
|
5
|
+
require_relative 'handlers/instance_method_handler'
|
6
|
+
require_relative 'handlers/mixin_handler'
|
7
|
+
require_relative 'handlers/module_handler'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative '../core_ext/yard'
|
2
|
+
require_relative '../core_ext/parsejs'
|
3
|
+
|
4
|
+
module YARDJS
|
5
|
+
module Handlers
|
6
|
+
class Base < YARD::Handlers::Base
|
7
|
+
include ParseJS::AST
|
8
|
+
|
9
|
+
def self.handles?(node)
|
10
|
+
handlers.any? {|h| node.is_a?(h) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def call_params; [] end
|
14
|
+
def caller_method; nil end
|
15
|
+
|
16
|
+
def parse_block(inner_node, opts = {})
|
17
|
+
push_state(opts) { parser.process([inner_node].flatten) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def handle_default_comments(comments = statement.comments)
|
21
|
+
return if comments.size == 1
|
22
|
+
comments[0...-1].each do |comment|
|
23
|
+
register_docstring(nil, clean_comment(comment.body))
|
24
|
+
end
|
25
|
+
|
26
|
+
if parser.extra_state.ignore_next_statement
|
27
|
+
parser.extra_state.ignore_next_statement = nil
|
28
|
+
abort!
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def clean_comment(comment)
|
33
|
+
comment = comment.body if comment.respond_to?(:body)
|
34
|
+
return "" if comment.nil?
|
35
|
+
comment.gsub(/^[ \t]*\*[ \t]{0,1}/, '')
|
36
|
+
end
|
37
|
+
|
38
|
+
def register_docstring(object, docstring = statement.comments, stmt = statement)
|
39
|
+
docstring = docstring.last if Array === docstring
|
40
|
+
docstring = clean_comment(docstring) if docstring
|
41
|
+
docstring.force_encoding('utf-8') if docstring
|
42
|
+
|
43
|
+
super(object, docstring, stmt)
|
44
|
+
end
|
45
|
+
|
46
|
+
def register_source(object, source = statement.source, type = parser.parser_type)
|
47
|
+
return unless object.is_a?(CodeObjects::PropertyObject)
|
48
|
+
object.source ||= source
|
49
|
+
object.source_type = type
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module YARDJS
|
4
|
+
module Handlers
|
5
|
+
class ClassHandler < Base
|
6
|
+
handles AssignmentExpression
|
7
|
+
handles Property
|
8
|
+
|
9
|
+
process do
|
10
|
+
statement.comments ||= parser.extra_state.comments
|
11
|
+
handle_default_comments
|
12
|
+
|
13
|
+
if statement.is_a?(AssignmentExpression)
|
14
|
+
left, right = statement.left, statement.right
|
15
|
+
else
|
16
|
+
left, right = statement.key, statement.value
|
17
|
+
end
|
18
|
+
|
19
|
+
return unless right.is_a?(CallExpression) &&
|
20
|
+
right.callee.source =~ YARDJS.options.define_class_expression
|
21
|
+
|
22
|
+
obj = register YARD::CodeObjects::ClassObject.new(namespace, left.source)
|
23
|
+
obj.superclass = right.args.first.source if right.args.size > 1
|
24
|
+
|
25
|
+
defs = right.args.last.properties
|
26
|
+
parse_block(defs, :namespace => obj)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class UpdateClassHandler < Base
|
31
|
+
handles CallExpression
|
32
|
+
|
33
|
+
process do
|
34
|
+
return unless statement.callee.source =~
|
35
|
+
YARDJS.options.update_class_expression
|
36
|
+
|
37
|
+
ns = P(statement.args.first.source.gsub(/\.prototype/, ''))
|
38
|
+
ensure_loaded!(ns)
|
39
|
+
parse_block(statement.args.last.properties, :namespace => ns)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module YARDJS
|
4
|
+
module Handlers
|
5
|
+
class CommentedStatementHandler < Base
|
6
|
+
handles CommentedStatement
|
7
|
+
|
8
|
+
process do
|
9
|
+
parser.extra_state.comments = statement.comments
|
10
|
+
parse_block(statement.statement)
|
11
|
+
parser.extra_state.comments = nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class ExpressionStatementHandler < Base
|
16
|
+
handles ExpressionStatement
|
17
|
+
process { parse_block statement.expression }
|
18
|
+
end
|
19
|
+
|
20
|
+
class SequenceExpressionStatementHandler < Base
|
21
|
+
handles SequenceExpression
|
22
|
+
process { parse_block statement.expressions }
|
23
|
+
end
|
24
|
+
|
25
|
+
class CommentHandler < Base
|
26
|
+
handles Comment
|
27
|
+
|
28
|
+
process do
|
29
|
+
register_docstring(nil)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module YARDJS
|
4
|
+
module Handlers
|
5
|
+
class ConstantHandler < Base
|
6
|
+
handles AssignmentExpression
|
7
|
+
handles Property
|
8
|
+
|
9
|
+
process do
|
10
|
+
if statement.is_a?(AssignmentExpression)
|
11
|
+
name, value = statement.left.source, statement.right
|
12
|
+
else
|
13
|
+
name, value = statement.key.val, statement.value
|
14
|
+
end
|
15
|
+
|
16
|
+
return if value.is_a?(FunctionExpression)
|
17
|
+
return if value.is_a?(ObjectExpression)
|
18
|
+
return if value.is_a?(CallExpression)
|
19
|
+
|
20
|
+
handle_default_comments
|
21
|
+
|
22
|
+
obj = register CodeObjects::PropertyObject.new(namespace, name)
|
23
|
+
if value.is_a?(Literal)
|
24
|
+
obj.property_type = :literal
|
25
|
+
if type = parse_type(value.val)
|
26
|
+
obj.docstring.add_tag(YARD::Tags::Tag.new(:return, '', [type]))
|
27
|
+
end
|
28
|
+
else
|
29
|
+
obj.property_type = :object
|
30
|
+
end
|
31
|
+
|
32
|
+
unless obj.has_tag?(:value)
|
33
|
+
obj.docstring.add_tag(YARD::Tags::Tag.new(:value, value.source))
|
34
|
+
end
|
35
|
+
|
36
|
+
unless obj.has_tag?(:static)
|
37
|
+
obj.docstring.add_tag(YARD::Tags::Tag.new(:static, ''))
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def parse_type(type)
|
42
|
+
case type
|
43
|
+
when Node; type.class.to_s[/::([^:]+)$/, 1]
|
44
|
+
when FalseClass, TrueClass; 'Boolean'
|
45
|
+
when NilClass; 'null'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module YARDJS
|
4
|
+
module Handlers
|
5
|
+
class InstanceMethodHandler < Base
|
6
|
+
handles Property
|
7
|
+
|
8
|
+
process do
|
9
|
+
return unless statement.value.is_a?(FunctionExpression)
|
10
|
+
|
11
|
+
handle_default_comments
|
12
|
+
|
13
|
+
name = statement.key.val
|
14
|
+
params = statement.value.params.list.map {|t| [t.val, nil]}
|
15
|
+
|
16
|
+
obj = register CodeObjects::PropertyObject.new(namespace, name)
|
17
|
+
obj.property_type = :function
|
18
|
+
obj.parameters = params
|
19
|
+
obj.signature = "#{name}(#{params.join(', ')})"
|
20
|
+
unless obj.has_tag?(:return)
|
21
|
+
obj.docstring.add_tag(YARD::Tags::Tag.new(:return, '', ['void']))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module YARDJS
|
4
|
+
module Handlers
|
5
|
+
class MixinHandler < Base
|
6
|
+
handles CallExpression
|
7
|
+
|
8
|
+
process do
|
9
|
+
return unless statement.callee.source =~ YARDJS.options.mixin_module_expression
|
10
|
+
|
11
|
+
obj = YARD::CodeObjects::ClassObject.new(:root, statement.args.first.source)
|
12
|
+
obj.instance_mixins.push(*statement.args[1..-1].map do |arg|
|
13
|
+
YARD::CodeObjects::ClassObject.new(:root, arg.source)
|
14
|
+
end)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module YARDJS
|
4
|
+
module Handlers
|
5
|
+
class ModuleHandler < Base
|
6
|
+
handles AssignmentExpression
|
7
|
+
handles VariableDeclaration
|
8
|
+
handles Property
|
9
|
+
|
10
|
+
process do
|
11
|
+
case statement
|
12
|
+
when VariableDeclaration
|
13
|
+
left = statement.declarations.first.id
|
14
|
+
right = statement.declarations.first.init
|
15
|
+
when AssignmentExpression
|
16
|
+
left = statement.left
|
17
|
+
right = statement.right
|
18
|
+
when Property
|
19
|
+
left = statement.key
|
20
|
+
right = statement.value
|
21
|
+
end
|
22
|
+
|
23
|
+
return unless ObjectExpression === right
|
24
|
+
|
25
|
+
statement.comments ||= parser.extra_state.comments
|
26
|
+
handle_default_comments
|
27
|
+
|
28
|
+
obj = register YARD::CodeObjects::ModuleObject.new(namespace, left.source)
|
29
|
+
parse_block(right.properties, :namespace => obj)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'core_ext/yard'
|
2
|
+
|
3
|
+
module YARDJS
|
4
|
+
module Parser
|
5
|
+
class JavaScriptParser < YARD::Parser::Base
|
6
|
+
attr_accessor :file, :source, :ast
|
7
|
+
|
8
|
+
def initialize(source, filename)
|
9
|
+
self.source = source
|
10
|
+
self.file = filename
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse
|
14
|
+
self.ast = ParseJS.parse(source)
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def enumerator
|
19
|
+
ast.elements
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'core_ext/yard'
|
2
|
+
require_relative 'code_objects'
|
3
|
+
require_relative 'handlers'
|
4
|
+
require_relative 'tags'
|
5
|
+
require_relative 'parser'
|
6
|
+
|
7
|
+
YARD::Parser::SourceParser.register_parser_type(:js, YARDJS::Parser::JavaScriptParser, ['js'])
|
8
|
+
YARD::Handlers::Processor.register_handler_namespace(:js, YARDJS::Handlers)
|
9
|
+
|
10
|
+
YARD::Templates::Engine.register_template_path(File.dirname(__FILE__) + '/../../templates')
|
11
|
+
|
12
|
+
[:readonly, :writeonly, :static].each do |tag|
|
13
|
+
YARD::Tags::Library.define_tag(tag.to_s.capitalize, tag)
|
14
|
+
end
|
15
|
+
YARD::Tags::Library.define_tag 'Default Value', :default, :with_name
|
16
|
+
YARD::Tags::Library.define_tag 'Default Value', :value
|
17
|
+
YARD::Tags::Library.define_tag 'Constant', :constant
|
18
|
+
YARD::Tags::Library.define_tag 'Context (<tt>this</tt>)', :context, :with_types
|
19
|
+
YARD::Tags::Library.define_tag 'Callback', :callback, YARDJS::Tags::CallbackTag
|
20
|
+
YARD::Tags::Library.visible_tags.unshift(:value, :context)
|
21
|
+
|
22
|
+
YARD::Tags::Library.define_directive(:ignore, YARDJS::Tags::IgnoreDirective)
|
23
|
+
YARD::Tags::Library.define_directive(:event, :with_title_and_text, YARDJS::Tags::EventDirective)
|