ruby2js 1.0.0 → 1.1.0

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.
Files changed (50) hide show
  1. checksums.yaml +8 -8
  2. data/lib/ruby2js.rb +2 -2
  3. data/lib/ruby2js/converter.rb +68 -474
  4. data/lib/ruby2js/converter/andasgn.rb +12 -0
  5. data/lib/ruby2js/converter/arg.rb +14 -0
  6. data/lib/ruby2js/converter/args.rb +13 -0
  7. data/lib/ruby2js/converter/array.rb +33 -0
  8. data/lib/ruby2js/converter/begin.rb +13 -0
  9. data/lib/ruby2js/converter/block.rb +16 -0
  10. data/lib/ruby2js/converter/blockpass.rb +11 -0
  11. data/lib/ruby2js/converter/boolean.rb +11 -0
  12. data/lib/ruby2js/converter/break.rb +12 -0
  13. data/lib/ruby2js/converter/case.rb +23 -0
  14. data/lib/ruby2js/converter/casgn.rb +16 -0
  15. data/lib/ruby2js/converter/class.rb +75 -0
  16. data/lib/ruby2js/converter/const.rb +10 -0
  17. data/lib/ruby2js/converter/def.rb +91 -0
  18. data/lib/ruby2js/converter/defined.rb +15 -0
  19. data/lib/ruby2js/converter/dstr.rb +16 -0
  20. data/lib/ruby2js/converter/for.rb +19 -0
  21. data/lib/ruby2js/converter/hash.rb +24 -0
  22. data/lib/ruby2js/converter/if.rb +34 -0
  23. data/lib/ruby2js/converter/ivar.rb +10 -0
  24. data/lib/ruby2js/converter/ivasgn.rb +11 -0
  25. data/lib/ruby2js/converter/kwbegin.rb +44 -0
  26. data/lib/ruby2js/converter/literal.rb +12 -0
  27. data/lib/ruby2js/converter/logical.rb +43 -0
  28. data/lib/ruby2js/converter/masgn.rb +20 -0
  29. data/lib/ruby2js/converter/next.rb +12 -0
  30. data/lib/ruby2js/converter/nil.rb +10 -0
  31. data/lib/ruby2js/converter/opasgn.rb +20 -0
  32. data/lib/ruby2js/converter/orasgn.rb +12 -0
  33. data/lib/ruby2js/converter/regexp.rb +21 -0
  34. data/lib/ruby2js/converter/return.rb +15 -0
  35. data/lib/ruby2js/converter/self.rb +10 -0
  36. data/lib/ruby2js/converter/send.rb +98 -0
  37. data/lib/ruby2js/converter/sym.rb +10 -0
  38. data/lib/ruby2js/converter/undef.rb +12 -0
  39. data/lib/ruby2js/converter/until.rb +12 -0
  40. data/lib/ruby2js/converter/untilpost.rb +13 -0
  41. data/lib/ruby2js/converter/var.rb +11 -0
  42. data/lib/ruby2js/converter/vasgn.rb +41 -0
  43. data/lib/ruby2js/converter/while.rb +12 -0
  44. data/lib/ruby2js/converter/whilepost.rb +14 -0
  45. data/lib/ruby2js/converter/xstr.rb +16 -0
  46. data/lib/ruby2js/filter/angularrb.rb +1 -1
  47. data/lib/ruby2js/filter/jquery.rb +95 -1
  48. data/lib/ruby2js/version.rb +1 -1
  49. data/ruby2js.gemspec +3 -3
  50. metadata +44 -2
@@ -0,0 +1,34 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (if
5
+ # (true)
6
+ # (...)
7
+ # (...))
8
+
9
+ handle :if do |condition, then_block, else_block|
10
+ if else_block and not then_block
11
+ return parse(s(:if, s(:send, condition, :!), else_block, nil), @state)
12
+ end
13
+
14
+ if @state == :statement
15
+ output = "if (#{ parse condition }) {#@nl#{ scope then_block }#@nl}"
16
+ while else_block and else_block.type == :if
17
+ condition, then_block, else_block = else_block.children
18
+ output << " else if (#{ parse condition }) " +
19
+ "{#@nl#{ scope then_block }#@nl}"
20
+ end
21
+ output << " else {#@nl#{ scope else_block }#@nl}" if else_block
22
+
23
+ # use short form when appropriate
24
+ unless output.length > 72 or else_block or then_block.type == :begin
25
+ output = "if (#{ parse condition }) #{ scope then_block }"
26
+ end
27
+
28
+ output
29
+ else
30
+ "(#{ parse condition } ? #{ parse then_block } : #{ parse else_block })"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (ivar :@a)
5
+
6
+ handle :ivar do |var|
7
+ var.to_s.sub('@', 'this._')
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (ivasgn :@a
5
+ # (int 1))
6
+
7
+ handle :ivasgn do |var, expression|
8
+ "#{ var.to_s.sub('@', 'this._') } = #{ parse expression }"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,44 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (kwbegin
5
+ # (ensure
6
+ # (rescue
7
+ # (send nil :a)
8
+ # (resbody nil nil
9
+ # (send nil :b)) nil)
10
+ # (send nil :c)))
11
+
12
+ handle :kwbegin do |*children|
13
+ block = children.first
14
+ if block.type == :ensure
15
+ block, finally = block.children
16
+ else
17
+ finally = nil
18
+ end
19
+
20
+ if block and block.type == :rescue
21
+ body, recover, otherwise = block.children
22
+ raise NotImplementedError, "block else" if otherwise
23
+ exception, name, recovery = recover.children
24
+ raise NotImplementedError, parse(exception) if exception
25
+ else
26
+ body = block
27
+ end
28
+
29
+ output = "try {#@nl#{ parse body }#@nl}"
30
+
31
+ if recovery
32
+ output += " catch (#{ parse name }) {#@nl#{ parse recovery }#@nl}"
33
+ end
34
+
35
+ output += " finally {#@nl#{ parse finally }#@nl}" if finally
36
+
37
+ if recovery or finally
38
+ output
39
+ else
40
+ parse s(:begin, *children)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,12 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (int 1)
5
+ # (float 1.1)
6
+ # (str "1"))
7
+
8
+ handle :int, :float, :str do |value|
9
+ value.inspect
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,43 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (and
5
+ # (...)
6
+ # (...))
7
+
8
+ # (or
9
+ # (...)
10
+ # (...))
11
+
12
+ # (not
13
+ # (...))
14
+
15
+ handle :and, :or, :not do |left, right=nil|
16
+ type = @ast.type
17
+ op_index = operator_index type
18
+
19
+ left = left.children.first if left and left.type == :begin
20
+ lgroup = LOGICAL.include?( left.type ) &&
21
+ op_index <= operator_index( left.type )
22
+ left = parse left
23
+ left = "(#{ left })" if lgroup
24
+
25
+ if right
26
+ right = right.children.first if right.type == :begin
27
+ rgroup = LOGICAL.include?( right.type ) &&
28
+ op_index <= operator_index( right.type )
29
+ right = parse right
30
+ right = "(#{ right })" if rgroup
31
+ end
32
+
33
+ case type
34
+ when :and
35
+ "#{ left } && #{ right }"
36
+ when :or
37
+ "#{ left } || #{ right }"
38
+ else
39
+ "!#{ left }"
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,20 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (masgn
5
+ # (mlhs
6
+ # (lvasgn :a)
7
+ # (lvasgn :b))
8
+ # (array
9
+ # (int 1)
10
+ # (int 2)))
11
+
12
+ handle :masgn do |lhs, rhs|
13
+ block = []
14
+ lhs.children.zip rhs.children.zip do |var, val|
15
+ block << s(var.type, *var.children, *val)
16
+ end
17
+ parse s(:begin, *block), @state
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (next
5
+ # (int 1))
6
+
7
+ handle :next do |n=nil|
8
+ raise NotImplementedError, "next argument #{ n.inspect }" if n
9
+ 'continue'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (nil)
5
+
6
+ handle :nil do
7
+ 'null'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,20 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (op-asgn
5
+ # (lvasgn :a) :+
6
+ # (int 1))
7
+
8
+ handle :op_asgn do |var, op, value|
9
+ if [:+, :-].include?(op) and value.type==:int and value.children==[1]
10
+ if @state == :statement
11
+ "#{ parse var }#{ op }#{ op }"
12
+ else
13
+ "#{ op }#{ op }#{ parse var }"
14
+ end
15
+ else
16
+ "#{ parse var } #{ op }= #{ parse value }"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (or-asgn
5
+ # (lvasgn :a
6
+ # (int 1))
7
+
8
+ handle :or_asgn do |var, value|
9
+ "#{ parse var } = #{parse var} || #{ parse value }"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (regexp
5
+ # (str "x")
6
+ # (regopt :i))
7
+
8
+ handle :regexp do |str, opt|
9
+ str = str.children.first
10
+ if str.include? '/'
11
+ if opt.children.empty?
12
+ "new RegExp(#{ str.inspect })"
13
+ else
14
+ "new RegExp(#{ str.inspect }, #{ opt.children.join.inspect})"
15
+ end
16
+ else
17
+ "/#{ str }/#{ opt.children.join }"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (return
5
+ # (int 1))
6
+
7
+ handle :return do |value=nil|
8
+ if value
9
+ "return #{ parse value }"
10
+ else
11
+ "return"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (self)
5
+
6
+ handle :self do
7
+ 'this'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,98 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (send nil :puts
5
+ # (int 1))
6
+
7
+ # (attr nil :puts
8
+ # (int 1))
9
+
10
+ handle :send, :attr do |receiver, method, *args|
11
+ ast = @ast
12
+
13
+ if method =~ /\w[!?]$/
14
+ raise NotImplementedError, "invalid method name #{ method }"
15
+ end
16
+
17
+ if method == :new and receiver and receiver.children == [nil, :Proc]
18
+ return parse args.first
19
+ elsif not receiver and [:lambda, :proc].include? method
20
+ return parse args.first
21
+ end
22
+
23
+ op_index = operator_index method
24
+ if op_index != -1
25
+ target = args.first
26
+ target = target.children.first if target and target.type == :begin
27
+ receiver = receiver.children.first if receiver.type == :begin
28
+ end
29
+
30
+ group_receiver = receiver.type == :send && op_index <= operator_index( receiver.children[1] ) if receiver
31
+ group_target = target.type == :send && op_index <= operator_index( target.children[1] ) if target
32
+
33
+ if method == :!
34
+ if receiver.type == :defined?
35
+ parse s(:undefined?, *receiver.children)
36
+ else
37
+ group_receiver ||= (receiver.type != :send && receiver.children.length > 1)
38
+ "!#{ group_receiver ? group(receiver) : parse(receiver) }"
39
+ end
40
+
41
+ elsif method == :[]
42
+ "#{ parse receiver }[#{ args.map {|arg| parse arg}.join(', ') }]"
43
+
44
+ elsif method == :[]=
45
+ "#{ parse receiver }[#{ args[0..-2].map {|arg| parse arg}.join(', ') }] = #{ parse args[-1] }"
46
+
47
+ elsif [:-@, :+@, :~].include? method
48
+ "#{ method.to_s[0] }#{ parse receiver }"
49
+
50
+ elsif method == :=~
51
+ "#{ parse args.first }.test(#{ parse receiver })"
52
+
53
+ elsif method == :!~
54
+ "!#{ parse args.first }.test(#{ parse receiver })"
55
+
56
+ elsif OPERATORS.flatten.include? method
57
+ "#{ group_receiver ? group(receiver) : parse(receiver) } #{ method } #{ group_target ? group(target) : parse(target) }"
58
+
59
+ elsif method =~ /=$/
60
+ "#{ parse receiver }#{ '.' if receiver }#{ method.to_s.sub(/=$/, ' =') } #{ parse args.first }"
61
+
62
+ elsif method == :new and receiver
63
+ args = args.map {|a| parse a}.join(', ')
64
+ if args.length > 0 or is_method?(ast)
65
+ "new #{ parse receiver }(#{ args })"
66
+ else
67
+ "new #{ parse receiver }"
68
+ end
69
+
70
+ elsif method == :raise and receiver == nil
71
+ if args.length == 1
72
+ "throw #{ parse args.first }"
73
+ else
74
+ "throw new #{ parse args.first }(#{ parse args[1] })"
75
+ end
76
+
77
+ elsif method == :typeof and receiver == nil
78
+ "typeof #{ parse args.first }"
79
+
80
+ else
81
+ if args.length == 0 and not is_method?(ast)
82
+ if receiver
83
+ "#{ parse receiver }.#{ method }"
84
+ else
85
+ parse s(:lvasgn, method), @state
86
+ end
87
+ elsif args.length > 0 and args.last.type == :splat
88
+ parse s(:send, s(:attr, receiver, method), :apply, receiver,
89
+ s(:send, s(:array, *args[0..-2]), :concat,
90
+ args[-1].children.first))
91
+ else
92
+ args = args.map {|a| parse a}.join(', ')
93
+ "#{ parse receiver }#{ '.' if receiver }#{ method }(#{ args })"
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,10 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (sym :sym))
5
+
6
+ handle :sym do |sym|
7
+ sym.to_s.inspect
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (undef
5
+ # (sym :foo)
6
+ # (sym :bar))
7
+
8
+ handle :undef do |*syms|
9
+ syms.map {|sym| "delete #{sym.children.last}"}.join @sep
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (until
5
+ # (true)
6
+ # (...))
7
+
8
+ handle :until do |condition, block|
9
+ parse s(:while, s(:send, condition, :!), block)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module Ruby2JS
2
+ class Converter
3
+
4
+ # (until-post
5
+ # (true)
6
+ # (kwbegin
7
+ # (...)))
8
+
9
+ handle :until_post do |condition, block|
10
+ parse s(:while_post, s(:send, condition, :!), block)
11
+ end
12
+ end
13
+ end