ruby2js 1.12.2 → 1.13.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -46,6 +46,15 @@ require 'ruby2js/filter/functions'
46
46
  puts Ruby2JS.convert('"2A".to_i(16)')
47
47
  ```
48
48
 
49
+ With [ExecJS](https://github.com/sstephenson/execjs):
50
+ ```ruby
51
+ require 'ruby2js/execjs'
52
+ require 'date'
53
+
54
+ context = Ruby2JS.compile(Date.today.strftime('d = new Date(%Y, %-m, %-d)'))
55
+ puts context.eval('d.getYear()')+1900
56
+ ```
57
+
49
58
  Conversions can be explored interactively using the
50
59
  [demo](https://github.com/rubys/ruby2js/blob/master/demo/ruby2js.rb) provided.
51
60
 
@@ -95,6 +95,7 @@ module Ruby2JS
95
95
  body = scope body, vars
96
96
  if @block_this and @block_depth == 1
97
97
  body = "var self = this#{@sep}#{body}"
98
+ @block_this = false
98
99
  end
99
100
 
100
101
  "function#{ " #{name}" if name }(#{ parse args }) {#{nl}#{ body }#{nl}}"
@@ -11,10 +11,12 @@ module Ruby2JS
11
11
  raise NotImplementedError, "kwsplat" if node.type == :kwsplat
12
12
 
13
13
  begin
14
- block_depth = @block_depth
14
+ block_depth, block_this, block_hash = @block_depth, @block_this, false
15
15
  left, right = node.children
16
16
 
17
- @block_depth = 0 if Hash === right or right.type == :block
17
+ if Hash === right or right.type == :block
18
+ @block_depth, block_hash = 0, true
19
+ end
18
20
 
19
21
  if left.type == :prop
20
22
  result = []
@@ -34,7 +36,10 @@ module Ruby2JS
34
36
  end
35
37
 
36
38
  ensure
37
- @block_depth = block_depth
39
+ if block_hash
40
+ @block_depth = block_depth
41
+ @block_this = block_this
42
+ end
38
43
  end
39
44
  end
40
45
 
@@ -0,0 +1,16 @@
1
+ require 'ruby2js'
2
+ require 'execjs'
3
+
4
+ module Ruby2JS
5
+ def self.compile(source, options={})
6
+ ExecJS.compile(convert(source, options))
7
+ end
8
+
9
+ def self.eval(source, options={})
10
+ ExecJS.eval(convert(source, options))
11
+ end
12
+
13
+ def self.exec(source, options={})
14
+ ExecJS.exec(convert(source, options))
15
+ end
16
+ end
@@ -68,13 +68,19 @@ module Ruby2JS
68
68
  end
69
69
 
70
70
  def on_send(node)
71
- # enable React filtering within React class method calls
72
- if node.children.first == s(:const, nil, :React)
73
- begin
74
- react, @react = @react, true
75
- return super
76
- ensure
77
- @react = react
71
+ if not @react
72
+ # enable React filtering within React class method calls or
73
+ # React component calls
74
+ if
75
+ node.children.first == s(:const, nil, :React) or
76
+ node.children.first == nil and node.children[1] =~ /^_[A-Z]/
77
+ then
78
+ begin
79
+ @react = true
80
+ return on_send(node)
81
+ ensure
82
+ @react = false
83
+ end
78
84
  end
79
85
  end
80
86
 
@@ -216,6 +222,9 @@ module Ruby2JS
216
222
  params << process(text)
217
223
  end
218
224
 
225
+ # trim trailing null if no text or children
226
+ params.pop if params.last == s(:nil)
227
+
219
228
  # construct element using params
220
229
  element = s(:send, s(:const, nil, :React), :createElement, *params)
221
230
 
@@ -344,8 +353,36 @@ module Ruby2JS
344
353
 
345
354
  # convert blocks to proc arguments
346
355
  def on_block(node)
356
+ if not @react
357
+ # enable React filtering on React component calls
358
+ if
359
+ node.children[0].children[0] == nil and
360
+ node.children[0].children[1] =~ /^_[A-Z]/
361
+ then
362
+ begin
363
+ @react = true
364
+ return on_block(node)
365
+ ensure
366
+ @react = false
367
+ end
368
+ end
369
+ end
370
+
347
371
  return super unless @react
348
- return super unless node.children[1].children.empty?
372
+
373
+ # iterate over Enumerable arguments if (a) node is a createElement
374
+ # type of call, and (b) there are args present
375
+ if
376
+ node.children.first.children[0] == nil and
377
+ node.children.first.children[1] =~ /^_/ and
378
+ not node.children[1].children.empty?
379
+ then
380
+ send = node.children.first.children
381
+ return super if send.length < 3
382
+ return process s(:block, s(:send, *send[0..1], *send[3..-1]),
383
+ s(:args), s(:block, s(:send, send[2], :forEach),
384
+ *node.children[1..-1]))
385
+ end
349
386
 
350
387
  # traverse through potential "css proxy" style method calls
351
388
  child = node.children.first
@@ -356,8 +393,7 @@ module Ruby2JS
356
393
 
357
394
  # append block as a standalone proc to wunderbar style method call
358
395
  if child.children[0] == nil and child.children[1] =~ /^_\w/
359
- block = s(:block, s(:send, nil, :proc),
360
- s(:args, s(:arg, :_index), s(:arg, :_parent)),
396
+ block = s(:block, s(:send, nil, :proc), s(:args),
361
397
  *node.children[2..-1])
362
398
  return on_send s(:send, *node.children.first.children, block)
363
399
  end
@@ -1,8 +1,8 @@
1
1
  module Ruby2JS
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1
4
- MINOR = 12
5
- TINY = 2
4
+ MINOR = 13
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
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.12.2"
5
+ s.version = "1.13.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 = "2015-01-25"
9
+ s.date = "2015-02-02"
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/converter.rb", "lib/ruby2js/version.rb", "lib/ruby2js/filter", "lib/ruby2js/filter/jquery.rb", "lib/ruby2js/filter/return.rb", "lib/ruby2js/filter/underscore.rb", "lib/ruby2js/filter/angularrb.rb", "lib/ruby2js/filter/minitest-jasmine.rb", "lib/ruby2js/filter/camelCase.rb", "lib/ruby2js/filter/strict.rb", "lib/ruby2js/filter/functions.rb", "lib/ruby2js/filter/angular-resource.rb", "lib/ruby2js/filter/react.rb", "lib/ruby2js/filter/angular-route.rb", "lib/ruby2js/sinatra.rb", "lib/ruby2js/rails.rb", "lib/ruby2js/cgi.rb", "lib/ruby2js/converter", "lib/ruby2js/converter/self.rb", "lib/ruby2js/converter/arg.rb", "lib/ruby2js/converter/dstr.rb", "lib/ruby2js/converter/xstr.rb", "lib/ruby2js/converter/sym.rb", "lib/ruby2js/converter/return.rb", "lib/ruby2js/converter/break.rb", "lib/ruby2js/converter/for.rb", "lib/ruby2js/converter/defined.rb", "lib/ruby2js/converter/cvasgn.rb", "lib/ruby2js/converter/whilepost.rb", "lib/ruby2js/converter/logical.rb", "lib/ruby2js/converter/args.rb", "lib/ruby2js/converter/def.rb", "lib/ruby2js/converter/prototype.rb", "lib/ruby2js/converter/class.rb", "lib/ruby2js/converter/nthref.rb", "lib/ruby2js/converter/opasgn.rb", "lib/ruby2js/converter/module.rb", "lib/ruby2js/converter/kwbegin.rb", "lib/ruby2js/converter/send.rb", "lib/ruby2js/converter/boolean.rb", "lib/ruby2js/converter/masgn.rb", "lib/ruby2js/converter/hash.rb", "lib/ruby2js/converter/cvar.rb", "lib/ruby2js/converter/ivasgn.rb", "lib/ruby2js/converter/case.rb", "lib/ruby2js/converter/const.rb", "lib/ruby2js/converter/vasgn.rb", "lib/ruby2js/converter/untilpost.rb", "lib/ruby2js/converter/begin.rb", "lib/ruby2js/converter/ivar.rb", "lib/ruby2js/converter/while.rb", "lib/ruby2js/converter/next.rb", "lib/ruby2js/converter/nil.rb", "lib/ruby2js/converter/blockpass.rb", "lib/ruby2js/converter/super.rb", "lib/ruby2js/converter/defs.rb", "lib/ruby2js/converter/array.rb", "lib/ruby2js/converter/block.rb", "lib/ruby2js/converter/if.rb", "lib/ruby2js/converter/until.rb", "lib/ruby2js/converter/regexp.rb", "lib/ruby2js/converter/casgn.rb", "lib/ruby2js/converter/undef.rb", "lib/ruby2js/converter/literal.rb", "lib/ruby2js/converter/var.rb", "lib/ruby2js.rb"]
12
+ s.files = ["ruby2js.gemspec", "README.md", "lib/ruby2js", "lib/ruby2js/execjs.rb", "lib/ruby2js/converter.rb", "lib/ruby2js/version.rb", "lib/ruby2js/filter", "lib/ruby2js/filter/jquery.rb", "lib/ruby2js/filter/return.rb", "lib/ruby2js/filter/underscore.rb", "lib/ruby2js/filter/angularrb.rb", "lib/ruby2js/filter/minitest-jasmine.rb", "lib/ruby2js/filter/camelCase.rb", "lib/ruby2js/filter/strict.rb", "lib/ruby2js/filter/functions.rb", "lib/ruby2js/filter/angular-resource.rb", "lib/ruby2js/filter/react.rb", "lib/ruby2js/filter/angular-route.rb", "lib/ruby2js/sinatra.rb", "lib/ruby2js/rails.rb", "lib/ruby2js/cgi.rb", "lib/ruby2js/converter", "lib/ruby2js/converter/self.rb", "lib/ruby2js/converter/arg.rb", "lib/ruby2js/converter/dstr.rb", "lib/ruby2js/converter/xstr.rb", "lib/ruby2js/converter/sym.rb", "lib/ruby2js/converter/return.rb", "lib/ruby2js/converter/break.rb", "lib/ruby2js/converter/for.rb", "lib/ruby2js/converter/defined.rb", "lib/ruby2js/converter/cvasgn.rb", "lib/ruby2js/converter/whilepost.rb", "lib/ruby2js/converter/logical.rb", "lib/ruby2js/converter/args.rb", "lib/ruby2js/converter/def.rb", "lib/ruby2js/converter/prototype.rb", "lib/ruby2js/converter/class.rb", "lib/ruby2js/converter/nthref.rb", "lib/ruby2js/converter/opasgn.rb", "lib/ruby2js/converter/module.rb", "lib/ruby2js/converter/kwbegin.rb", "lib/ruby2js/converter/send.rb", "lib/ruby2js/converter/boolean.rb", "lib/ruby2js/converter/masgn.rb", "lib/ruby2js/converter/hash.rb", "lib/ruby2js/converter/cvar.rb", "lib/ruby2js/converter/ivasgn.rb", "lib/ruby2js/converter/case.rb", "lib/ruby2js/converter/const.rb", "lib/ruby2js/converter/vasgn.rb", "lib/ruby2js/converter/untilpost.rb", "lib/ruby2js/converter/begin.rb", "lib/ruby2js/converter/ivar.rb", "lib/ruby2js/converter/while.rb", "lib/ruby2js/converter/next.rb", "lib/ruby2js/converter/nil.rb", "lib/ruby2js/converter/blockpass.rb", "lib/ruby2js/converter/super.rb", "lib/ruby2js/converter/defs.rb", "lib/ruby2js/converter/array.rb", "lib/ruby2js/converter/block.rb", "lib/ruby2js/converter/if.rb", "lib/ruby2js/converter/until.rb", "lib/ruby2js/converter/regexp.rb", "lib/ruby2js/converter/casgn.rb", "lib/ruby2js/converter/undef.rb", "lib/ruby2js/converter/literal.rb", "lib/ruby2js/converter/var.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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby2js
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.2
4
+ version: 1.13.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-25 00:00:00.000000000 Z
12
+ date: 2015-02-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: parser
@@ -36,6 +36,7 @@ extra_rdoc_files: []
36
36
  files:
37
37
  - ruby2js.gemspec
38
38
  - README.md
39
+ - lib/ruby2js/execjs.rb
39
40
  - lib/ruby2js/converter.rb
40
41
  - lib/ruby2js/version.rb
41
42
  - lib/ruby2js/filter/jquery.rb