ruby2js 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +28 -20
- data/lib/ruby2js.rb +7 -1
- data/lib/ruby2js/converter.rb +1 -2
- data/lib/ruby2js/converter/break.rb +1 -0
- data/lib/ruby2js/converter/class.rb +3 -0
- data/lib/ruby2js/converter/def.rb +8 -3
- data/lib/ruby2js/converter/for.rb +16 -11
- data/lib/ruby2js/converter/if.rb +16 -1
- data/lib/ruby2js/converter/logical.rb +4 -4
- data/lib/ruby2js/converter/next.rb +1 -1
- data/lib/ruby2js/converter/opasgn.rb +31 -0
- data/lib/ruby2js/converter/send.rb +23 -8
- data/lib/ruby2js/converter/while.rb +6 -1
- data/lib/ruby2js/converter/whilepost.rb +6 -1
- data/lib/ruby2js/filter/angular-route.rb +5 -19
- data/lib/ruby2js/filter/angularrb.rb +134 -29
- data/lib/ruby2js/filter/functions.rb +54 -23
- data/lib/ruby2js/filter/jquery.rb +8 -8
- data/lib/ruby2js/version.rb +1 -1
- data/ruby2js.gemspec +3 -3
- metadata +2 -4
- data/lib/ruby2js/converter/andasgn.rb +0 -12
- data/lib/ruby2js/converter/orasgn.rb +0 -12
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZGIyMDBkZWFkNDE5ZDFlOTliNDE0MDMwMjgwMmNlYWZkZDcxOWNiMg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NzIxOTk3NjM1YzRkMDA1NTI3ZThiMTI0MzE3NzIyYWFhNmE3MmIwMA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjRmNDE4NWQxN2MxNTAxOThkZTUzYzFiMGU0ZDZiM2EwNTI3ZDZlYmQyY2Fh
|
10
|
+
MDg4MGM3YjVlMWI4NGQwMWY0ODhmMjQ5YTE1ZjdmN2JmOWRiYWI5ZDdjNzM0
|
11
|
+
ZDM0NWExNWFjZjg1NzQ1MTNhNWNkMGMwYjg1MjIxMDdkYjI3NDU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OGYxYTNmNjNjNWY5OTkxYmQ0YTljNDhkM2JmZmU0NmY5ZTMzNTZhZjc3OWVi
|
14
|
+
NjcxZDQ3NmQ2N2Y1M2QzNTNmYjE5ODZjNTNmZDc2YTM0MGVhOTAzZWE4YTc0
|
15
|
+
NDFiOGU4NjU2YjA1MGYzOGE3Mjk2ODM5Y2IzNTc2MjdjNDFkMGY=
|
data/README.md
CHANGED
@@ -61,7 +61,7 @@ quite different if `a` is a Hash.
|
|
61
61
|
|
62
62
|
One way to resolve this is to change the way indexing operators are evaluated,
|
63
63
|
and to provide a runtime library that adds properties to global JavaScript
|
64
|
-
objects to handle this.
|
64
|
+
objects to handle this. This is the approach that [Opal](http://opalrb.org/)
|
65
65
|
takes. It is a fine approach, with a number of benefits. It also has some
|
66
66
|
notable drawbacks. For example,
|
67
67
|
[readability](http://opalrb.org/try/#code:a%20%3D%20%22abc%22%3B%20puts%20a[-1])
|
@@ -76,11 +76,11 @@ A third approach would be to do static transformations on the source in order
|
|
76
76
|
to address common usage patterns or idioms. These transformations can even be
|
77
77
|
occasionally unsafe, as long as the transformations themselves are opt-in.
|
78
78
|
ruby2js provides a number of such filters, including one that handles negative
|
79
|
-
indexes when
|
79
|
+
indexes when passed as a literal. As indicated above, this is unsafe in that
|
80
80
|
it will do the wrong thing when it encounters a hash index which is expressed
|
81
81
|
as a literal constant negative one. My experience is that such is rare enough
|
82
82
|
to be safely ignored, but YMMV. More troublesome, this also won’t work when
|
83
|
-
the index is not a literal (e.g., `a[n]`)
|
83
|
+
the index is not a literal (e.g., `a[n]`) and the index happens to be
|
84
84
|
negative at runtime.
|
85
85
|
|
86
86
|
This quickly gets into gray areas. `each` in Ruby is a common method that
|
@@ -104,9 +104,9 @@ includes three such integrations:
|
|
104
104
|
* [Sinatra](https://github.com/rubys/ruby2js/blob/master/lib/ruby2js/sinatra.rb)
|
105
105
|
* [Rails](https://github.com/rubys/ruby2js/blob/master/lib/ruby2js/rails.rb)
|
106
106
|
|
107
|
-
As you might expect, CGI is a bit sluggish. By constrast, Sinatra
|
108
|
-
speedy as the bulk of the time is spend on the initial load of the
|
109
|
-
libraries.
|
107
|
+
As you might expect, CGI is a bit sluggish. By constrast, Sinatra and Rails
|
108
|
+
are quite speedy as the bulk of the time is spend on the initial load of the
|
109
|
+
required libraries.
|
110
110
|
|
111
111
|
Filters
|
112
112
|
---
|
@@ -123,24 +123,29 @@ the script.
|
|
123
123
|
|
124
124
|
* [functions](https://github.com/rubys/ruby2js/blob/master/lib/ruby2js/filter/functions.rb)
|
125
125
|
|
126
|
-
*
|
127
|
-
* `
|
128
|
-
* `
|
129
|
-
* `
|
130
|
-
* `
|
131
|
-
* `
|
132
|
-
* `
|
126
|
+
* `.to_s` becomes `to_String`
|
127
|
+
* `.to_a` becomes `to_Array`
|
128
|
+
* `.to_i` becomes `parseInt`
|
129
|
+
* `.to_f` becomes `parseFloat`
|
130
|
+
* `.sub` becomes `replace`
|
131
|
+
* `.ord` becomes `charCodeAt(0)`
|
132
|
+
* `.chr` becomes `fromCharCode`
|
133
|
+
* `.gsub` becomes `replace //g`
|
134
|
+
* `.first` becomes `[0]`
|
135
|
+
* `.last` becomes `[*.length-1]`
|
133
136
|
* `[-n]` becomes `[*.length-n]` for literal values of `n`
|
134
|
-
* `[n..m]` becomes
|
135
|
-
* `[n...m]` becomes
|
137
|
+
* `[n..m]` becomes `.slice(n,m+1)`
|
138
|
+
* `[n...m]` becomes `.slice(n,m)`
|
139
|
+
* `[/r/, n]` becomes `.match(/r/)[n]`
|
136
140
|
* `.empty?` becomes `.length == 0`
|
137
141
|
* `.clear!` becomes `.length = 0`
|
142
|
+
* `.replace!` becomes `.length = 0; ...push.apply(*)`
|
138
143
|
* `.include?` becomes `.indexOf() != -1`
|
139
144
|
* `.any?` becomes `.some`
|
140
145
|
* `.all?` becomes `.every`
|
141
146
|
* `puts` becomes `console.log`
|
142
|
-
*
|
143
|
-
*
|
147
|
+
* `.each` becomes `forEach` unless jquery is included
|
148
|
+
* `.each_with_index` becomes `forEach`
|
144
149
|
* `setInterval` and `setTimeout` allow block to be treated as the
|
145
150
|
first parameter on the call
|
146
151
|
|
@@ -149,7 +154,7 @@ the script.
|
|
149
154
|
* maps Ruby unary operator `~` to jQuery `$` function
|
150
155
|
* maps Ruby attribute syntax to jquery attribute syntax
|
151
156
|
* maps `$$` to jQuery `$` function
|
152
|
-
* defaults fourth parameter of $$.post to :jquery, allowing Ruby block
|
157
|
+
* defaults the fourth parameter of $$.post to :jquery, allowing Ruby block
|
153
158
|
syntax to be used for the success function.
|
154
159
|
|
155
160
|
* [angularrb](https://github.com/rubys/ruby2js/blob/master/lib/ruby2js/filter/angularrb.rb)
|
@@ -159,6 +164,7 @@ the script.
|
|
159
164
|
angular module functions.
|
160
165
|
* maps `use` statements to formal arguments or array values (as
|
161
166
|
appropriate) depending on the module function.
|
167
|
+
* maps `watch` statments to calls to `$scope.$watch`.
|
162
168
|
* tracks globals variable and constant references and adds additional
|
163
169
|
implicit `use` statements
|
164
170
|
* maps constant assignments in an angular module to a filter
|
@@ -178,7 +184,9 @@ the script.
|
|
178
184
|
|
179
185
|
[Wunderbar](https://github.com/rubys/wunderbar) includes additional demos:
|
180
186
|
|
181
|
-
* [
|
187
|
+
* [chat](https://github.com/rubys/wunderbar/blob/master/demo/chat.rb),
|
188
|
+
[diskusage](https://github.com/rubys/wunderbar/blob/master/demo/diskusage.rb),
|
189
|
+
and [wiki](https://github.com/rubys/wunderbar/blob/master/demo/wiki.rb) make
|
182
190
|
use of the jquery filter.
|
183
191
|
|
184
192
|
* [angularjs](https://github.com/rubys/wunderbar/blob/master/demo/angularjs.rb)
|
@@ -197,7 +205,7 @@ framework, and only use one of the many integrations that
|
|
197
205
|
[Opal](http://opalrb.org/) provides, then Opal is the way to go right now.
|
198
206
|
|
199
207
|
ruby2js is for those that want to produce JavaScript that looks like it
|
200
|
-
wasn’t machine generated, and
|
208
|
+
wasn’t machine generated, and want the absolute bare minimum in terms of
|
201
209
|
limitations as to what JavaScript can be produced.
|
202
210
|
|
203
211
|
[Try](http://intertwingly.net/projects/ruby2js/all) for yourself.
|
data/lib/ruby2js.rb
CHANGED
@@ -11,6 +11,12 @@ module Ruby2JS
|
|
11
11
|
Parser::AST::Node.new type, args
|
12
12
|
end
|
13
13
|
end
|
14
|
+
|
15
|
+
class Processor < Parser::AST::Processor
|
16
|
+
def on_attr(node)
|
17
|
+
node.updated nil, [process(node.children.first), node.children.last]
|
18
|
+
end
|
19
|
+
end
|
14
20
|
end
|
15
21
|
|
16
22
|
def self.convert(source, options={})
|
@@ -29,7 +35,7 @@ module Ruby2JS
|
|
29
35
|
filters = options[:filters] || Filter::DEFAULTS
|
30
36
|
|
31
37
|
unless filters.empty?
|
32
|
-
filter =
|
38
|
+
filter = Filter::Processor
|
33
39
|
filters.reverse.each do |mod|
|
34
40
|
filter = Class.new(filter) {include mod}
|
35
41
|
end
|
data/lib/ruby2js/converter.rb
CHANGED
@@ -15,6 +15,7 @@ module Ruby2JS
|
|
15
15
|
@ws = ' '
|
16
16
|
@varstack = []
|
17
17
|
@width = 80
|
18
|
+
@next_token = :return
|
18
19
|
|
19
20
|
@handlers = {}
|
20
21
|
@@handlers.each do |name|
|
@@ -94,7 +95,6 @@ end
|
|
94
95
|
|
95
96
|
# see https://github.com/whitequark/parser/blob/master/doc/AST_FORMAT.md
|
96
97
|
|
97
|
-
require 'ruby2js/converter/andasgn'
|
98
98
|
require 'ruby2js/converter/arg'
|
99
99
|
require 'ruby2js/converter/args'
|
100
100
|
require 'ruby2js/converter/array'
|
@@ -126,7 +126,6 @@ require 'ruby2js/converter/module'
|
|
126
126
|
require 'ruby2js/converter/next'
|
127
127
|
require 'ruby2js/converter/nil'
|
128
128
|
require 'ruby2js/converter/opasgn'
|
129
|
-
require 'ruby2js/converter/orasgn'
|
130
129
|
require 'ruby2js/converter/prototype'
|
131
130
|
require 'ruby2js/converter/regexp'
|
132
131
|
require 'ruby2js/converter/return'
|
@@ -38,6 +38,9 @@ module Ruby2JS
|
|
38
38
|
elsif m.type == :cvasgn
|
39
39
|
# class variable
|
40
40
|
s(:send, name, "_#{m.children[0][2..-1]}=", *m.children[1..-1])
|
41
|
+
elsif m.type == :send and m.children[0].type == :cvar
|
42
|
+
s(:send, s(:attr, name, "_#{m.children[0].children[0][2..-1]}"),
|
43
|
+
*m.children[1..-1])
|
41
44
|
elsif m.type == :casgn and m.children[0] == nil
|
42
45
|
# class constant
|
43
46
|
s(:send, name, "#{m.children[1]}=", *m.children[2..-1])
|
@@ -83,9 +83,14 @@ module Ruby2JS
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
|
86
|
+
nl = @nl unless body == s(:begin)
|
87
|
+
begin
|
88
|
+
next_token, @next_token = @next_token, :return
|
89
|
+
"function#{ " #{name}" if name }(#{ parse args }) " +
|
90
|
+
"{#{nl}#{ scope body, vars}#{nl}}"
|
91
|
+
ensure
|
92
|
+
@next_token = next_token
|
93
|
+
end
|
89
94
|
end
|
90
95
|
end
|
91
96
|
end
|
@@ -10,17 +10,22 @@ module Ruby2JS
|
|
10
10
|
# (...)
|
11
11
|
|
12
12
|
handle :for do |var, expression, block|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
"#{
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
"#{
|
21
|
-
|
22
|
-
|
23
|
-
|
13
|
+
begin
|
14
|
+
next_token, @next_token = @next_token, :continue
|
15
|
+
if expression.type == :irange
|
16
|
+
"for (var #{parse var} = #{ parse expression.children.first }; " +
|
17
|
+
"#{ parse var } <= #{ parse expression.children.last }; " +
|
18
|
+
"#{ parse var }++) {#@nl#{ scope block }#@nl}"
|
19
|
+
elsif expression.type == :erange
|
20
|
+
"for (var #{parse var} = #{ parse expression.children.first }; " +
|
21
|
+
"#{ parse var } < #{ parse expression.children.last }; " +
|
22
|
+
"#{ parse var }++) {#@nl#{ scope block }#@nl}"
|
23
|
+
else
|
24
|
+
"for (var #{parse var} in #{ parse expression }) " +
|
25
|
+
"{#@nl#{ scope block }#@nl}"
|
26
|
+
end
|
27
|
+
ensure
|
28
|
+
@next_token = next_token
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
data/lib/ruby2js/converter/if.rb
CHANGED
@@ -6,10 +6,25 @@ module Ruby2JS
|
|
6
6
|
# (...)
|
7
7
|
# (...))
|
8
8
|
|
9
|
+
INVERT_OP = {
|
10
|
+
:< => :>=,
|
11
|
+
:<= => :>,
|
12
|
+
:== => :!=,
|
13
|
+
:!= => :==,
|
14
|
+
:> => :<=,
|
15
|
+
:>= => :<
|
16
|
+
}
|
17
|
+
|
9
18
|
handle :if do |condition, then_block, else_block|
|
10
19
|
# return parse condition if not else_block and not then_block
|
11
20
|
if else_block and not then_block
|
12
|
-
|
21
|
+
if condition.type == :send and INVERT_OP.include? condition.children[1]
|
22
|
+
return parse(s(:if, s(:send, condition.children[0],
|
23
|
+
INVERT_OP[condition.children[1]], condition.children[2]),
|
24
|
+
else_block,nil), @state)
|
25
|
+
else
|
26
|
+
return parse(s(:if, s(:send, condition, :!), else_block, nil), @state)
|
27
|
+
end
|
13
28
|
end
|
14
29
|
|
15
30
|
then_block ||= s(:nil)
|
@@ -16,16 +16,16 @@ module Ruby2JS
|
|
16
16
|
type = @ast.type
|
17
17
|
op_index = operator_index type
|
18
18
|
|
19
|
-
left = left.children.first if left and left.type == :begin
|
20
19
|
lgroup = LOGICAL.include?( left.type ) &&
|
21
|
-
op_index
|
20
|
+
op_index < operator_index( left.type )
|
21
|
+
lgroup = true if left and left.type == :begin
|
22
22
|
left = parse left
|
23
23
|
left = "(#{ left })" if lgroup
|
24
24
|
|
25
25
|
if right
|
26
|
-
right = right.children.first if right.type == :begin
|
27
26
|
rgroup = LOGICAL.include?( right.type ) &&
|
28
|
-
op_index
|
27
|
+
op_index < operator_index( right.type )
|
28
|
+
rgroup = true if right.type == :begin
|
29
29
|
right = parse right
|
30
30
|
right = "(#{ right })" if rgroup
|
31
31
|
end
|
@@ -5,7 +5,13 @@ module Ruby2JS
|
|
5
5
|
# (lvasgn :a) :+
|
6
6
|
# (int 1))
|
7
7
|
|
8
|
+
# NOTE: and-asgn and or_asgn handled below
|
9
|
+
|
8
10
|
handle :op_asgn do |var, op, value|
|
11
|
+
var = s(:ivar, var.children.first) if var.type == :ivasgn
|
12
|
+
var = s(:lvar, var.children.first) if var.type == :lvasgn
|
13
|
+
var = s(:cvar, var.children.first) if var.type == :cvasgn
|
14
|
+
|
9
15
|
if [:+, :-].include?(op) and value.type==:int and value.children==[1]
|
10
16
|
if @state == :statement
|
11
17
|
"#{ parse var }#{ op }#{ op }"
|
@@ -16,5 +22,30 @@ module Ruby2JS
|
|
16
22
|
"#{ parse var } #{ op }= #{ parse value }"
|
17
23
|
end
|
18
24
|
end
|
25
|
+
|
26
|
+
# (or-asgn
|
27
|
+
# (lvasgn :a)
|
28
|
+
# (int 1))
|
29
|
+
|
30
|
+
# (and-asgn
|
31
|
+
# (lvasgn :a)
|
32
|
+
# (int 1))
|
33
|
+
|
34
|
+
handle :or_asgn, :and_asgn do |asgn, value|
|
35
|
+
type = (@ast.type == :and_asgn ? :and : :or)
|
36
|
+
|
37
|
+
vtype = nil
|
38
|
+
vtype = :lvar if asgn.type == :lvasgn
|
39
|
+
vtype = :ivar if asgn.type == :ivasgn
|
40
|
+
vtype = :cvar if asgn.type == :cvasgn
|
41
|
+
|
42
|
+
if vtype
|
43
|
+
parse s(asgn.type, asgn.children.first, s(type,
|
44
|
+
s(vtype, asgn.children.first), value))
|
45
|
+
else
|
46
|
+
parse s(:send, asgn.children.first, "#{asgn.children[1]}=",
|
47
|
+
s(type, asgn, value))
|
48
|
+
end
|
49
|
+
end
|
19
50
|
end
|
20
51
|
end
|
@@ -4,12 +4,20 @@ module Ruby2JS
|
|
4
4
|
# (send nil :puts
|
5
5
|
# (int 1))
|
6
6
|
|
7
|
-
# (attr nil :puts
|
7
|
+
# (attr nil :puts)
|
8
|
+
|
9
|
+
# (sendw nil :puts
|
8
10
|
# (int 1))
|
9
11
|
|
10
|
-
|
12
|
+
# Note: attr and sendw are only generated by filters. Attr forces
|
13
|
+
# interpretation as an attribute vs a function call with zero parameters.
|
14
|
+
# Sendw forces parameters to be placed on separate lines.
|
15
|
+
|
16
|
+
handle :send, :sendw, :attr do |receiver, method, *args|
|
11
17
|
ast = @ast
|
12
18
|
|
19
|
+
width = ((ast.type == :sendw && !@nl.empty?) ? 0 : @width)
|
20
|
+
|
13
21
|
if method =~ /\w[!?]$/
|
14
22
|
raise NotImplementedError, "invalid method name #{ method }"
|
15
23
|
end
|
@@ -30,15 +38,22 @@ module Ruby2JS
|
|
30
38
|
end
|
31
39
|
end
|
32
40
|
|
33
|
-
op_index
|
41
|
+
op_index = operator_index method
|
34
42
|
if op_index != -1
|
35
43
|
target = args.first
|
36
|
-
target = target.children.first if target and target.type == :begin
|
37
|
-
receiver = receiver.children.first if receiver.type == :begin
|
38
44
|
end
|
39
45
|
|
40
|
-
|
41
|
-
|
46
|
+
if receiver
|
47
|
+
group_receiver = receiver.type == :send &&
|
48
|
+
op_index < operator_index( receiver.children[1] ) if receiver
|
49
|
+
group_receiver ||= (receiver.type == :begin)
|
50
|
+
end
|
51
|
+
|
52
|
+
if target
|
53
|
+
group_target = target.type == :send &&
|
54
|
+
op_index < operator_index( target.children[1] )
|
55
|
+
group_target ||= (target.type == :begin)
|
56
|
+
end
|
42
57
|
|
43
58
|
if method == :!
|
44
59
|
if receiver.type == :defined?
|
@@ -129,7 +144,7 @@ module Ruby2JS
|
|
129
144
|
args = args.map {|a| parse a}
|
130
145
|
if args.any? {|arg| arg.to_s.include? "\n"}
|
131
146
|
"#{ call }(#{ args.join(', ') })"
|
132
|
-
elsif args.map {|arg| arg.length+2}.reduce(&:+).to_i <
|
147
|
+
elsif args.map {|arg| arg.length+2}.reduce(&:+).to_i < width-10
|
133
148
|
"#{ call }(#{ args.join(', ') })"
|
134
149
|
else
|
135
150
|
"#{ call }(#@nl#{ args.join(",#@ws") }#@nl)"
|
@@ -6,7 +6,12 @@ module Ruby2JS
|
|
6
6
|
# (...))
|
7
7
|
|
8
8
|
handle :while do |condition, block|
|
9
|
-
|
9
|
+
begin
|
10
|
+
next_token, @next_token = @next_token, :continue
|
11
|
+
"while (#{ parse condition }) {#@nl#{ scope block }#@nl}"
|
12
|
+
ensure
|
13
|
+
@next_token = next_token
|
14
|
+
end
|
10
15
|
end
|
11
16
|
end
|
12
17
|
end
|
@@ -8,7 +8,12 @@ module Ruby2JS
|
|
8
8
|
|
9
9
|
handle :while_post do |condition, block|
|
10
10
|
block = block.updated(:begin) if block.type == :kwbegin
|
11
|
-
|
11
|
+
begin
|
12
|
+
next_token, @next_token = @next_token, :continue
|
13
|
+
"do {#@nl#{ scope block }#@nl} while (#{ parse condition })"
|
14
|
+
ensure
|
15
|
+
@next_token = next_token
|
16
|
+
end
|
12
17
|
end
|
13
18
|
end
|
14
19
|
end
|
@@ -25,31 +25,17 @@ module Ruby2JS
|
|
25
25
|
@ngAppUses << :ngRoute
|
26
26
|
code = s(:lvar, rp)
|
27
27
|
|
28
|
-
hash = proc do |pairs|
|
29
|
-
if pairs.length == 1 and pairs.first.type == :begin
|
30
|
-
pairs = pairs.first.children
|
31
|
-
end
|
32
|
-
s(:hash, *pairs.map {|pair|
|
33
|
-
if pair.type == :send
|
34
|
-
s(:pair, s(:sym, pair.children[1]), pair.children[2])
|
35
|
-
else
|
36
|
-
s(:pair, s(:sym, pair.children[0]), pair.children[1])
|
37
|
-
end
|
38
|
-
})
|
39
|
-
end
|
40
|
-
|
41
28
|
node.children[1..-2].each do |child|
|
42
|
-
code = s(:
|
43
|
-
hash
|
29
|
+
code = s(:sendw, code, :when, child.children.first,
|
30
|
+
AngularRB.hash(child.children[1..-1]))
|
44
31
|
end
|
45
32
|
|
46
33
|
if node.children.last
|
47
|
-
code = s(:
|
48
|
-
hash
|
34
|
+
code = s(:sendw, code, :otherwise,
|
35
|
+
AngularRB.hash(node.children[-1..-1]))
|
49
36
|
end
|
50
37
|
|
51
|
-
s(:send,
|
52
|
-
s(:block,
|
38
|
+
s(:send, @ngApp, :config, s(:array, s(:str, rp.to_s), s(:block,
|
53
39
|
s(:send, nil, :proc), s(:args, s(:arg, rp)), code)))
|
54
40
|
end
|
55
41
|
end
|
@@ -6,8 +6,36 @@ module Ruby2JS
|
|
6
6
|
module AngularRB
|
7
7
|
include SEXP
|
8
8
|
|
9
|
+
def self.s(type, *args)
|
10
|
+
Parser::AST::Node.new type, args
|
11
|
+
end
|
12
|
+
|
13
|
+
Angular = s(:const, nil, :Angular)
|
14
|
+
|
15
|
+
# convert simple assignments, simple method calls, and simple method
|
16
|
+
# definitions into a hash when possible; return false otherwise
|
17
|
+
def self.hash(pairs)
|
18
|
+
if pairs.length == 1 and pairs.first.type == :begin
|
19
|
+
pairs = pairs.first.children
|
20
|
+
end
|
21
|
+
|
22
|
+
s(:hash, *pairs.map {|pair|
|
23
|
+
if pair.type == :send and pair.children[0] == nil
|
24
|
+
s(:pair, s(:sym, pair.children[1]), pair.children[2])
|
25
|
+
elsif pair.type == :lvasgn
|
26
|
+
s(:pair, s(:sym, pair.children[0]), pair.children[1])
|
27
|
+
elsif pair.type == :def
|
28
|
+
s(:pair, s(:sym, pair.children[0]), s(:block, s(:send, nil, :proc),
|
29
|
+
*pair.children[1..-1]))
|
30
|
+
else
|
31
|
+
return false
|
32
|
+
end
|
33
|
+
})
|
34
|
+
end
|
35
|
+
|
9
36
|
def initialize(*args)
|
10
37
|
@ngApp = nil
|
38
|
+
@ngContext = nil
|
11
39
|
@ngAppUses = []
|
12
40
|
@ngClassUses = []
|
13
41
|
@ngClassOmit = []
|
@@ -28,10 +56,9 @@ module Ruby2JS
|
|
28
56
|
module_name = node.children[0]
|
29
57
|
parent_name = module_name.children[0]
|
30
58
|
|
31
|
-
return super unless parent_name
|
32
|
-
return super unless parent_name.children == [nil, :Angular]
|
59
|
+
return super unless parent_name == Angular
|
33
60
|
|
34
|
-
@ngApp = module_name.children[1]
|
61
|
+
@ngApp = s(:lvar, module_name.children[1])
|
35
62
|
@ngChildren = node.children[1..-1]
|
36
63
|
while @ngChildren.length == 1 and @ngChildren.first and @ngChildren.first.type == :begin
|
37
64
|
@ngChildren = @ngChildren.first.children.dup
|
@@ -45,11 +72,12 @@ module Ruby2JS
|
|
45
72
|
depends = depends.map {|node| node.children.first.to_s}.uniq.
|
46
73
|
map {|sym| s(:str, sym)}
|
47
74
|
|
48
|
-
|
75
|
+
ngApp, @ngApp, @ngChildren = @ngApp, nil, nil
|
76
|
+
name = module_name.children[1].to_s
|
49
77
|
|
50
78
|
# construct app
|
51
|
-
app = s(:send, s(:lvar, :angular), :module,
|
52
|
-
s(:array, *depends.uniq))
|
79
|
+
app = s(:send, s(:lvar, :angular), :module,
|
80
|
+
s(:str, name), s(:array, *depends.uniq))
|
53
81
|
|
54
82
|
# return a single chained statement when there is only one call
|
55
83
|
block.compact!
|
@@ -57,9 +85,9 @@ module Ruby2JS
|
|
57
85
|
return app
|
58
86
|
elsif block.length == 1
|
59
87
|
call = block.first.children.first
|
60
|
-
if block.first.type == :send and call ==
|
88
|
+
if block.first.type == :send and call == ngApp
|
61
89
|
return block.first.updated nil, [app, *block.first.children[1..-1]]
|
62
|
-
elsif block.first.type == :block and call.children.first ==
|
90
|
+
elsif block.first.type == :block and call.children.first == ngApp
|
63
91
|
call = call.updated nil, [app, *call.children[1..-1]]
|
64
92
|
return block.first.updated nil, [call, *block.first.children[1..-1]]
|
65
93
|
end
|
@@ -82,6 +110,7 @@ module Ruby2JS
|
|
82
110
|
return super unless @ngApp and @ngChildren.include? node
|
83
111
|
name = node.children.first
|
84
112
|
if name.children.first == nil
|
113
|
+
@ngClassUses, @ngClassOmit = [], []
|
85
114
|
block = [node.children.last]
|
86
115
|
uses = extract_uses(block)
|
87
116
|
node = s(:class, name, node.children[1],
|
@@ -93,7 +122,7 @@ module Ruby2JS
|
|
93
122
|
map {|sym| s(:arg, sym)}
|
94
123
|
@ngClassUses, @ngClassOmit = [], []
|
95
124
|
|
96
|
-
s(:block, s(:send,
|
125
|
+
s(:block, s(:send, @ngApp, :factory,
|
97
126
|
s(:sym, name.children.last)), s(:args, *args),
|
98
127
|
s(:begin, node, s(:return, s(:const, nil, name.children.last))))
|
99
128
|
else
|
@@ -108,21 +137,38 @@ module Ruby2JS
|
|
108
137
|
# directive :name { ... }
|
109
138
|
|
110
139
|
def on_block(node)
|
111
|
-
|
140
|
+
ngApp = @ngApp
|
112
141
|
call = node.children.first
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
ng_controller(node)
|
118
|
-
when :factory
|
119
|
-
ng_factory(node)
|
120
|
-
when :filter
|
121
|
-
ng_filter(node)
|
122
|
-
when :directive
|
123
|
-
ng_controller(node) # reuse template
|
142
|
+
target = call.children.first
|
143
|
+
if target and target.type == :const and target.children.first == Angular
|
144
|
+
@ngApp = s(:send, s(:lvar, :angular), :module, s(:str,
|
145
|
+
target.children.last.to_s))
|
124
146
|
else
|
125
|
-
super
|
147
|
+
return super if target
|
148
|
+
return super unless @ngApp
|
149
|
+
end
|
150
|
+
|
151
|
+
begin
|
152
|
+
case call.children[1]
|
153
|
+
when :controller
|
154
|
+
ng_controller(node, :controller)
|
155
|
+
when :factory
|
156
|
+
ng_factory(node)
|
157
|
+
when :filter
|
158
|
+
ng_filter(node)
|
159
|
+
when :directive
|
160
|
+
hash = AngularRB.hash(node.children[2..-1])
|
161
|
+
if hash
|
162
|
+
node = node.updated nil, [*node.children[0..1], s(:return, hash)]
|
163
|
+
end
|
164
|
+
ng_controller(node, :directive)
|
165
|
+
when :watch
|
166
|
+
ng_watch(node)
|
167
|
+
else
|
168
|
+
super
|
169
|
+
end
|
170
|
+
ensure
|
171
|
+
@ngApp = ngApp
|
126
172
|
end
|
127
173
|
end
|
128
174
|
|
@@ -131,10 +177,15 @@ module Ruby2JS
|
|
131
177
|
# ...
|
132
178
|
# end
|
133
179
|
#
|
134
|
-
|
180
|
+
# output:
|
181
|
+
# AppName.controller("name", do |uses|
|
182
|
+
# ...
|
183
|
+
# end
|
184
|
+
def ng_controller(node, scope)
|
185
|
+
ngContext, @ngContext = @ngContext, scope
|
186
|
+
@ngClassUses, @ngClassOmit = [], []
|
135
187
|
target = node.children.first
|
136
|
-
target = target.updated(nil, [
|
137
|
-
*target.children[1..-1]])
|
188
|
+
target = target.updated(nil, [@ngApp, *target.children[1..-1]])
|
138
189
|
|
139
190
|
block = process_all(node.children[2..-1])
|
140
191
|
|
@@ -144,9 +195,11 @@ module Ruby2JS
|
|
144
195
|
args += @ngClassUses.map {|sym| s(:arg, sym)} + extract_uses(block)
|
145
196
|
args = args.map {|node| node.children.first.to_sym}.uniq.
|
146
197
|
map {|sym| s(:arg, sym)}
|
147
|
-
@ngClassUses, @ngClassOmit = [], []
|
148
198
|
|
149
199
|
node.updated :block, [target, s(:args, *args), s(:begin, *block)]
|
200
|
+
ensure
|
201
|
+
@ngClassUses, @ngClassOmit = [], []
|
202
|
+
@ngContext = ngContext
|
150
203
|
end
|
151
204
|
|
152
205
|
# input:
|
@@ -163,12 +216,13 @@ module Ruby2JS
|
|
163
216
|
:or, :regexp, :self, :send, :str, :sym, :true, :undefined?, :xstr ]
|
164
217
|
|
165
218
|
def ng_filter(node)
|
219
|
+
@ngClassUses, @ngClassOmit = [], []
|
166
220
|
call = node.children.first
|
167
221
|
|
168
222
|
# insert return
|
169
223
|
args = process_all(node.children[1].children)
|
170
224
|
block = process_all(node.children[2..-1])
|
171
|
-
uses = @ngClassUses.uniq.map {|sym| s(:arg, sym)}
|
225
|
+
uses = (@ngClassUses - @ngClassOmit).uniq.map {|sym| s(:arg, sym)}
|
172
226
|
tail = [block.pop || s(:nil)]
|
173
227
|
while tail.length == 1 and tail.first.type == :begin
|
174
228
|
tail = tail.first.children.dup
|
@@ -178,7 +232,7 @@ module Ruby2JS
|
|
178
232
|
|
179
233
|
# construct a function returning a function
|
180
234
|
inner = s(:block, s(:send, nil, :lambda), s(:args, *args), *block)
|
181
|
-
outer = s(:send,
|
235
|
+
outer = s(:send, @ngApp, :filter, *call.children[2..-1])
|
182
236
|
|
183
237
|
node.updated nil, [outer, s(:args, *uses), s(:return, inner)]
|
184
238
|
end
|
@@ -192,7 +246,7 @@ module Ruby2JS
|
|
192
246
|
# AppName.factory :name, [uses, lambda {|uses| ...}]
|
193
247
|
def ng_factory(node)
|
194
248
|
call = node.children.first
|
195
|
-
call = call.updated(nil, [
|
249
|
+
call = call.updated(nil, [@ngApp, *call.children[1..-1]])
|
196
250
|
|
197
251
|
# insert return
|
198
252
|
block = process_all(node.children[2..-1])
|
@@ -230,6 +284,57 @@ module Ruby2JS
|
|
230
284
|
s(:args), process(node.children[2]))
|
231
285
|
end
|
232
286
|
|
287
|
+
# convert ivar referencess in controllers to $scope
|
288
|
+
def on_ivar(node)
|
289
|
+
if @ngContext == :controller
|
290
|
+
process s(:attr, s(:gvar, :$scope), node.children.first.to_s[1..-1])
|
291
|
+
else
|
292
|
+
super
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
# input:
|
297
|
+
# watch 'expression' do |oldvalue, newvalue|
|
298
|
+
# ...
|
299
|
+
# end
|
300
|
+
#
|
301
|
+
# output:
|
302
|
+
# $scope.$watch 'expression' do |oldvalue, newvalue|
|
303
|
+
# ...
|
304
|
+
# end
|
305
|
+
def ng_watch(node)
|
306
|
+
call = node.children.first
|
307
|
+
if @ngContext == :controller and call.children.first == nil
|
308
|
+
call = s(:send, s(:gvar, :$scope), :$watch, *call.children[2..-1])
|
309
|
+
node = node.updated nil, [call, *node.children[1..-1]]
|
310
|
+
end
|
311
|
+
return process node
|
312
|
+
end
|
313
|
+
|
314
|
+
# convert ivar assignments in controllers to $scope
|
315
|
+
def on_ivasgn(node)
|
316
|
+
if @ngContext == :controller
|
317
|
+
if node.children.length == 1
|
318
|
+
process s(:attr, s(:gvar, :$scope),
|
319
|
+
"#{node.children.first.to_s[1..-1]}")
|
320
|
+
else
|
321
|
+
process s(:send, s(:gvar, :$scope),
|
322
|
+
"#{node.children.first.to_s[1..-1]}=", node.children.last)
|
323
|
+
end
|
324
|
+
else
|
325
|
+
super
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
# convert instance method definitions in controllers to $scope
|
330
|
+
def on_def(node)
|
331
|
+
if @ngContext == :controller
|
332
|
+
process s(:defs, s(:gvar, :$scope), *node.children)
|
333
|
+
else
|
334
|
+
super
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
233
338
|
def on_gvar(node)
|
234
339
|
if @ngClassUses
|
235
340
|
@ngClassUses << node.children.first
|
@@ -12,36 +12,56 @@ module Ruby2JS
|
|
12
12
|
if node.children[1] == :to_s
|
13
13
|
s(:send, target, :toString, *args)
|
14
14
|
|
15
|
+
elsif node.children[1] == :to_a
|
16
|
+
s(:send, target, :toArray, *args)
|
17
|
+
|
15
18
|
elsif node.children[1] == :to_i
|
16
19
|
node.updated nil, [nil, :parseInt, target, *args]
|
17
20
|
|
18
21
|
elsif node.children[1] == :to_f
|
19
|
-
node.updated nil, [nil, :parseFloat, target, *args]
|
22
|
+
process node.updated nil, [nil, :parseFloat, target, *args]
|
20
23
|
|
21
24
|
elsif node.children[1] == :sub and node.children.length == 4
|
22
25
|
source, method, before, after = node.children
|
23
|
-
node.updated nil, [source, :replace, before, after]
|
26
|
+
process node.updated nil, [source, :replace, before, after]
|
24
27
|
|
25
28
|
elsif node.children[1] == :gsub and node.children.length == 4
|
26
29
|
source, method, before, after = node.children
|
27
30
|
if before.type == :regexp
|
28
|
-
before = s(:regexp, before.children
|
29
|
-
s(:regopt, :g, *before.children
|
31
|
+
before = s(:regexp, *before.children[0...-1],
|
32
|
+
s(:regopt, :g, *before.children.last))
|
30
33
|
elsif before.type == :str
|
31
34
|
before = s(:regexp, s(:str, Regexp.escape(before.children.first)),
|
32
35
|
s(:regopt, :g))
|
33
36
|
end
|
34
|
-
node.updated nil, [source, :replace, before, after]
|
37
|
+
process node.updated nil, [source, :replace, before, after]
|
38
|
+
|
39
|
+
elsif node.children[1] == :ord and node.children.length == 2
|
40
|
+
if target.type == :str
|
41
|
+
s(:int, target.children.last.ord)
|
42
|
+
else
|
43
|
+
node.updated nil, [target, :charCodeAt, s(:int, 0)]
|
44
|
+
end
|
45
|
+
|
46
|
+
elsif node.children[1] == :chr and node.children.length == 2
|
47
|
+
if target.type == :int
|
48
|
+
s(:str, target.children.last.chr)
|
49
|
+
else
|
50
|
+
node.updated nil, [s(:const, nil, :String), :fromCharCode, target]
|
51
|
+
end
|
35
52
|
|
36
53
|
elsif node.children[1] == :empty? and node.children.length == 2
|
37
|
-
s(:send, s(:attr,
|
54
|
+
s(:send, s(:attr, target, :length), :==, s(:int, 0))
|
38
55
|
|
39
56
|
elsif node.children[1] == :clear! and node.children.length == 2
|
40
|
-
s(:send,
|
57
|
+
s(:send, target, :length=, s(:int, 0))
|
58
|
+
|
59
|
+
elsif node.children[1] == :replace! and node.children.length == 3
|
60
|
+
s(:begin, s(:send, target, :length=, s(:int, 0)),
|
61
|
+
s(:send, target, :push, s(:splat, node.children[2])))
|
41
62
|
|
42
63
|
elsif node.children[1] == :include? and node.children.length == 3
|
43
|
-
s(:send, s(:send,
|
44
|
-
:!=, s(:int, -1))
|
64
|
+
s(:send, s(:send, target, :indexOf, args.first), :!=, s(:int, -1))
|
45
65
|
|
46
66
|
elsif node.children[1] == :each
|
47
67
|
if @each # disable `each` mapping, see jquery filter for an example
|
@@ -51,48 +71,54 @@ module Ruby2JS
|
|
51
71
|
end
|
52
72
|
|
53
73
|
elsif node.children[0..1] == [nil, :puts]
|
54
|
-
s(:send, s(:attr, nil, :console), :log, *
|
74
|
+
s(:send, s(:attr, nil, :console), :log, *args)
|
55
75
|
|
56
76
|
elsif node.children[1..-1] == [:first]
|
57
|
-
node.updated nil, [
|
77
|
+
node.updated nil, [target, :[], s(:int, 0)]
|
58
78
|
|
59
79
|
elsif node.children[1..-1] == [:last]
|
60
|
-
on_send node.updated nil, [
|
80
|
+
on_send node.updated nil, [target, :[], s(:int, -1)]
|
61
81
|
|
62
|
-
elsif node.children[1] == :[]
|
63
|
-
|
64
|
-
index = node.children[2]
|
82
|
+
elsif node.children[1] == :[]
|
83
|
+
index = args.first
|
65
84
|
|
66
85
|
# resolve negative literal indexes
|
67
86
|
i = proc do |index|
|
68
87
|
if index.type == :int and index.children.first < 0
|
69
|
-
s(:send, s(:attr,
|
88
|
+
s(:send, s(:attr, target, :length), :-,
|
70
89
|
s(:int, -index.children.first))
|
71
90
|
else
|
72
91
|
index
|
73
92
|
end
|
74
93
|
end
|
75
94
|
|
76
|
-
if index.type == :
|
77
|
-
|
95
|
+
if index.type == :regexp
|
96
|
+
s(:send, s(:send, target, :match, index), :[],
|
97
|
+
args[1] || s(:int, 0))
|
98
|
+
|
99
|
+
elsif node.children.length != 3
|
100
|
+
super
|
101
|
+
|
102
|
+
elsif index.type == :int and index.children.first < 0
|
103
|
+
node.updated nil, [target, :[], i.(index)]
|
78
104
|
|
79
105
|
elsif index.type == :erange
|
80
106
|
start, finish = index.children
|
81
|
-
node.updated nil, [
|
107
|
+
node.updated nil, [target, :slice, i.(start), i.(finish)]
|
82
108
|
|
83
109
|
elsif index.type == :irange
|
84
110
|
start, finish = index.children
|
85
111
|
start = i.(start)
|
86
112
|
if finish.type == :int
|
87
113
|
if finish.children.first == -1
|
88
|
-
finish = s(:attr,
|
114
|
+
finish = s(:attr, target, :length)
|
89
115
|
else
|
90
116
|
finish = i.(s(:int, finish.children.first+1))
|
91
117
|
end
|
92
118
|
else
|
93
119
|
finish = s(:send, finish, :+, s(:int, 1))
|
94
120
|
end
|
95
|
-
node.updated nil, [
|
121
|
+
node.updated nil, [target, :slice, start, finish]
|
96
122
|
|
97
123
|
else
|
98
124
|
super
|
@@ -113,11 +139,16 @@ module Ruby2JS
|
|
113
139
|
block = process s(:block, s(:send, nil, :proc), *node.children[1..-1])
|
114
140
|
call.updated nil, [*call.children[0..1], block, *call.children[2..-1]]
|
115
141
|
|
116
|
-
elsif [:
|
142
|
+
elsif [:sub, :gsub].include? call.children[1]
|
143
|
+
return super if call.children.first == nil
|
144
|
+
block = s(:block, s(:send, nil, :proc), *node.children[1..-1])
|
145
|
+
process call.updated(nil, [*call.children, block])
|
146
|
+
|
147
|
+
elsif call.children[1] == :any? and call.children.length == 2
|
117
148
|
call = call.updated nil, [call.children.first, :some]
|
118
149
|
node.updated nil, [call, *node.children[1..-1]]
|
119
150
|
|
120
|
-
elsif
|
151
|
+
elsif call.children[1] == :all? and call.children.length == 2
|
121
152
|
call = call.updated nil, [call.children.first, :every]
|
122
153
|
node.updated nil, [call, *node.children[1..-1]]
|
123
154
|
|
@@ -119,17 +119,17 @@ module Ruby2JS
|
|
119
119
|
if node.children[1] == :~ and node.children[0].children[1] == :~
|
120
120
|
# consecutive tildes
|
121
121
|
if node.children[0].children[0].children[1] == :~
|
122
|
-
result =
|
122
|
+
result = node.children[0].children[0].children[0]
|
123
123
|
else
|
124
|
-
result = s(:
|
124
|
+
result = s(:attr, node.children[0].children[0], :~)
|
125
125
|
end
|
126
|
-
s(:
|
126
|
+
s(:attr, s(:attr, process(result), :~), :~)
|
127
127
|
else
|
128
128
|
# possible getter/setter
|
129
129
|
method = node.children[1]
|
130
130
|
method = method.to_s.chomp('=') if method =~ /=$/
|
131
131
|
rewrite = [rewrite_tilda[node.children[0]],
|
132
|
-
method, *
|
132
|
+
method, *node.children[2..-1]]
|
133
133
|
if props.include? node.children[1]
|
134
134
|
node.updated nil, rewrite
|
135
135
|
elsif domprops.include? method.to_s
|
@@ -142,17 +142,17 @@ module Ruby2JS
|
|
142
142
|
elsif node.type == :block
|
143
143
|
# method call with a block parameter
|
144
144
|
node.updated nil, [rewrite_tilda[node.children[0]],
|
145
|
-
*
|
145
|
+
*node.children[1..-1]]
|
146
146
|
elsif node.type == :array
|
147
147
|
# innermost expression is an array
|
148
|
-
s(:send, nil, '$', *
|
148
|
+
s(:send, nil, '$', *node)
|
149
149
|
else
|
150
150
|
# innermost expression is a scalar
|
151
|
-
s(:send, nil, '$',
|
151
|
+
s(:send, nil, '$', node)
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
155
|
-
rewrite_tilda[node].children[0]
|
155
|
+
process rewrite_tilda[node].children[0]
|
156
156
|
else
|
157
157
|
super
|
158
158
|
end
|
data/lib/ruby2js/version.rb
CHANGED
data/ruby2js.gemspec
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "ruby2js"
|
5
|
-
s.version = "1.
|
5
|
+
s.version = "1.3.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Sam Ruby"]
|
9
|
-
s.date = "
|
9
|
+
s.date = "2014-01-07"
|
10
10
|
s.description = " The base package maps Ruby syntax to JavaScript semantics.\n Filters may be provided to add Ruby-specific or framework specific\n behavior.\n"
|
11
11
|
s.email = "rubys@intertwingly.net"
|
12
|
-
s.files = ["ruby2js.gemspec", "README.md", "lib/ruby2js", "lib/ruby2js/rails.rb", "lib/ruby2js/version.rb", "lib/ruby2js/converter", "lib/ruby2js/converter/
|
12
|
+
s.files = ["ruby2js.gemspec", "README.md", "lib/ruby2js", "lib/ruby2js/rails.rb", "lib/ruby2js/version.rb", "lib/ruby2js/converter", "lib/ruby2js/converter/kwbegin.rb", "lib/ruby2js/converter/const.rb", "lib/ruby2js/converter/return.rb", "lib/ruby2js/converter/prototype.rb", "lib/ruby2js/converter/opasgn.rb", "lib/ruby2js/converter/xstr.rb", "lib/ruby2js/converter/args.rb", "lib/ruby2js/converter/defs.rb", "lib/ruby2js/converter/literal.rb", "lib/ruby2js/converter/array.rb", "lib/ruby2js/converter/if.rb", "lib/ruby2js/converter/nil.rb", "lib/ruby2js/converter/logical.rb", "lib/ruby2js/converter/next.rb", "lib/ruby2js/converter/while.rb", "lib/ruby2js/converter/whilepost.rb", "lib/ruby2js/converter/arg.rb", "lib/ruby2js/converter/case.rb", "lib/ruby2js/converter/break.rb", "lib/ruby2js/converter/hash.rb", "lib/ruby2js/converter/for.rb", "lib/ruby2js/converter/boolean.rb", "lib/ruby2js/converter/module.rb", "lib/ruby2js/converter/var.rb", "lib/ruby2js/converter/undef.rb", "lib/ruby2js/converter/blockpass.rb", "lib/ruby2js/converter/until.rb", "lib/ruby2js/converter/regexp.rb", "lib/ruby2js/converter/untilpost.rb", "lib/ruby2js/converter/masgn.rb", "lib/ruby2js/converter/cvasgn.rb", "lib/ruby2js/converter/block.rb", "lib/ruby2js/converter/ivar.rb", "lib/ruby2js/converter/send.rb", "lib/ruby2js/converter/vasgn.rb", "lib/ruby2js/converter/defined.rb", "lib/ruby2js/converter/def.rb", "lib/ruby2js/converter/sym.rb", "lib/ruby2js/converter/cvar.rb", "lib/ruby2js/converter/ivasgn.rb", "lib/ruby2js/converter/casgn.rb", "lib/ruby2js/converter/self.rb", "lib/ruby2js/converter/begin.rb", "lib/ruby2js/converter/dstr.rb", "lib/ruby2js/converter/class.rb", "lib/ruby2js/cgi.rb", "lib/ruby2js/converter.rb", "lib/ruby2js/filter", "lib/ruby2js/filter/return.rb", "lib/ruby2js/filter/strict.rb", "lib/ruby2js/filter/angularrb.rb", "lib/ruby2js/filter/angular-resource.rb", "lib/ruby2js/filter/functions.rb", "lib/ruby2js/filter/jquery.rb", "lib/ruby2js/filter/angular-route.rb", "lib/ruby2js/sinatra.rb", "lib/ruby2js.rb"]
|
13
13
|
s.homepage = "http://github.com/rubys/ruby2js"
|
14
14
|
s.licenses = ["MIT"]
|
15
15
|
s.require_paths = ["lib"]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby2js
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Ruby
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -35,7 +35,6 @@ files:
|
|
35
35
|
- README.md
|
36
36
|
- lib/ruby2js/rails.rb
|
37
37
|
- lib/ruby2js/version.rb
|
38
|
-
- lib/ruby2js/converter/orasgn.rb
|
39
38
|
- lib/ruby2js/converter/kwbegin.rb
|
40
39
|
- lib/ruby2js/converter/const.rb
|
41
40
|
- lib/ruby2js/converter/return.rb
|
@@ -78,7 +77,6 @@ files:
|
|
78
77
|
- lib/ruby2js/converter/ivasgn.rb
|
79
78
|
- lib/ruby2js/converter/casgn.rb
|
80
79
|
- lib/ruby2js/converter/self.rb
|
81
|
-
- lib/ruby2js/converter/andasgn.rb
|
82
80
|
- lib/ruby2js/converter/begin.rb
|
83
81
|
- lib/ruby2js/converter/dstr.rb
|
84
82
|
- lib/ruby2js/converter/class.rb
|