ruby2js 2.0.9 → 2.0.10
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 +4 -4
- data/README.md +4 -1
- data/lib/ruby2js/filter/functions.rb +38 -5
- data/lib/ruby2js/filter/jquery.rb +4 -1
- data/lib/ruby2js/filter/react.rb +90 -48
- data/lib/ruby2js/version.rb +1 -1
- data/ruby2js.gemspec +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aaae5d4b63645e55ef04dfd1794a1a75672cf5f6
|
4
|
+
data.tar.gz: ac98b88a02cc47c452d4bd919cdcf5bad553e88a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4efbd1394b8f329e4208772589ed57ea15603df2f55b8addbf7a045d4872081897a4c18fb5759194da8e86d7facbc620ca6bc2dfbde9372e66d16a4f2edc769
|
7
|
+
data.tar.gz: aaef80bf7d518a15fe01fedfd8ced9c880b9f2027ff5f366d1c53aff2e0720180d176279005f636bad6782f106ffe48451160f095d1d63543aaba6f082072d62
|
data/README.md
CHANGED
@@ -184,7 +184,6 @@ the script.
|
|
184
184
|
* `.start_with?` becomes `.substring(0, arg.length) == arg`
|
185
185
|
* `.strip` becomes `.trim`
|
186
186
|
* `.sub` becomes `.replace`
|
187
|
-
* `.to_a` becomes `to_Array`
|
188
187
|
* `.to_f` becomes `parseFloat`
|
189
188
|
* `.to_i` becomes `parseInt`
|
190
189
|
* `.to_s` becomes `.to_String`
|
@@ -197,7 +196,10 @@ the script.
|
|
197
196
|
* `.sub!` and `.gsub!` become equivalent `x = x.replace` statements
|
198
197
|
* `.map!`, `.reverse!`, and `.select` become equivalent
|
199
198
|
`.splice(0, .length, *.method())` statements
|
199
|
+
* `@foo.call(args)` becomes `this._foo(args)`
|
200
|
+
* `@@foo.call(args)` becomes `this.constructor._foo(args)`
|
200
201
|
* `Array(x)` becomes `Array.prototype.slice.call(x)`
|
202
|
+
* `delete x` becomes `delete x` (note lack of parenthesis)
|
201
203
|
* `setInterval` and `setTimeout` allow block to be treated as the
|
202
204
|
first parameter on the call
|
203
205
|
* for the following methods, if the block consists entirely of a simple
|
@@ -311,6 +313,7 @@ the script.
|
|
311
313
|
|
312
314
|
* maps Ruby unary operator `~` to jQuery `$` function
|
313
315
|
* maps Ruby attribute syntax to jquery attribute syntax
|
316
|
+
* `.to_a` becomes `toArray`
|
314
317
|
* maps `$$` to jQuery `$` function
|
315
318
|
* defaults the fourth parameter of $$.post to `"json"`, allowing Ruby block
|
316
319
|
syntax to be used for the success function.
|
@@ -20,11 +20,25 @@ module Ruby2JS
|
|
20
20
|
process S(:send, s(:attr, s(:const, nil, :Math), node.children[1]),
|
21
21
|
:apply, s(:const, nil, :Math), target)
|
22
22
|
|
23
|
+
elsif method == :call and target and target.type == :ivar
|
24
|
+
process S(:send, s(:self), "_#{target.children.first.to_s[1..-1]}",
|
25
|
+
*args)
|
26
|
+
|
27
|
+
elsif method == :call and target and target.type == :cvar
|
28
|
+
process S(:send, s(:attr, s(:self), :constructor),
|
29
|
+
"_#{target.children.first.to_s[2..-1]}", *args)
|
30
|
+
|
23
31
|
elsif method == :keys and args.length == 0 and node.is_method?
|
24
32
|
process S(:send, s(:const, nil, :Object), :keys, target)
|
25
33
|
|
26
34
|
elsif method == :delete and args.length == 1
|
27
|
-
|
35
|
+
if not target
|
36
|
+
process S(:undef, args.first)
|
37
|
+
elsif args.first.type == :str
|
38
|
+
process S(:undef, S(:attr, target, args.first.children.first))
|
39
|
+
else
|
40
|
+
process S(:undef, S(:send, target, :[], args.first))
|
41
|
+
end
|
28
42
|
|
29
43
|
elsif method == :to_s
|
30
44
|
process S(:call, target, :toString, *args)
|
@@ -33,9 +47,6 @@ module Ruby2JS
|
|
33
47
|
process S(:send, s(:attr, s(:attr, s(:const, nil, :Array),
|
34
48
|
:prototype), :slice), :call, *args)
|
35
49
|
|
36
|
-
elsif method == :to_a
|
37
|
-
process S(:call, target, :toArray, *args)
|
38
|
-
|
39
50
|
elsif method == :to_i
|
40
51
|
process node.updated :send, [nil, :parseInt, target, *args]
|
41
52
|
|
@@ -172,7 +183,10 @@ module Ruby2JS
|
|
172
183
|
end
|
173
184
|
end
|
174
185
|
|
175
|
-
if index
|
186
|
+
if not index
|
187
|
+
super
|
188
|
+
|
189
|
+
elsif index.type == :regexp
|
176
190
|
process S(:send, S(:send, target, :match, index), :[],
|
177
191
|
args[1] || s(:int, 0))
|
178
192
|
|
@@ -274,6 +288,25 @@ module Ruby2JS
|
|
274
288
|
# output: while(true) {statements}
|
275
289
|
S(:while, s(:true), node.children[2])
|
276
290
|
|
291
|
+
elsif [:delete].include? call.children[1]
|
292
|
+
# restore delete methods that are prematurely mapped to undef
|
293
|
+
result = super
|
294
|
+
|
295
|
+
if result.children[0].type == :undef
|
296
|
+
call = result.children[0].children[0]
|
297
|
+
if call.type == :attr
|
298
|
+
call = call.updated(:send,
|
299
|
+
[call.children[0], :delete, s(:str, call.children[1])])
|
300
|
+
result = result.updated(nil, [call, *result.children[1..-1]])
|
301
|
+
else
|
302
|
+
call = call.updated(nil,
|
303
|
+
[call.children[0], :delete, *call.children[2..-1]])
|
304
|
+
result = result.updated(nil, [call, *result.children[1..-1]])
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
result
|
309
|
+
|
277
310
|
else
|
278
311
|
super
|
279
312
|
end
|
@@ -75,7 +75,7 @@ module Ruby2JS
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def on_send(node)
|
78
|
-
if [:call, :[]].include? node.children[1]
|
78
|
+
if [:call, :[]].include? node.children[1] and node.children.first
|
79
79
|
# map $$.call(..), $$.(..), and $$[...] to $(...)
|
80
80
|
target = process(node.children.first)
|
81
81
|
if target.type == :gvar and target.children == ['$']
|
@@ -84,6 +84,9 @@ module Ruby2JS
|
|
84
84
|
super
|
85
85
|
end
|
86
86
|
|
87
|
+
elsif node.children[1] == :to_a
|
88
|
+
process S(:call, node.children[0], :toArray, *node.children[2..-1])
|
89
|
+
|
87
90
|
elsif node.children[1] == :~ and not @react
|
88
91
|
# map ~expression.method to $(expression).method
|
89
92
|
|
data/lib/ruby2js/filter/react.rb
CHANGED
@@ -8,11 +8,12 @@
|
|
8
8
|
# spec/react_spec.rb contains a specification
|
9
9
|
# demo/react-tutorial.rb contains a working sample
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# Conversions provided:
|
12
12
|
# * $x becomes this.refs.x
|
13
13
|
# * @x becomes this.state.x
|
14
14
|
# * @@x becomes this.props.x
|
15
|
-
# * ~x becomes this.refs.x
|
15
|
+
# * ~x becomes this.refs.x
|
16
|
+
# * ~(x) becomes document.querySelector(x)
|
16
17
|
# * ~"x" becomes document.querySelector("x")
|
17
18
|
#
|
18
19
|
require 'ruby2js'
|
@@ -22,27 +23,43 @@ module Ruby2JS
|
|
22
23
|
module React
|
23
24
|
include SEXP
|
24
25
|
|
25
|
-
# the following
|
26
|
+
# the following command can be used to generate ReactAttrs:
|
27
|
+
#
|
28
|
+
# ruby -r ruby2js/filter/react -e "Ruby2JS::Filter::React.genAttrs"
|
26
29
|
#
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
def self.genAttrs
|
31
|
+
require 'nokogumbo'
|
32
|
+
page = 'https://facebook.github.io/react/docs/tags-and-attributes.html'
|
33
|
+
doc = Nokogiri::HTML5.get(page)
|
34
|
+
|
35
|
+
# delete contents of page prior to the list of supported attributes
|
36
|
+
attrs = doc.at('a[name=supported-attributes]')
|
37
|
+
attrs = attrs.parent while attrs and not attrs.name.start_with? 'h'
|
38
|
+
attrs.previous_sibling.remove while attrs and attrs.previous_sibling
|
39
|
+
|
40
|
+
# extract attribute names with uppercase chars from code and format
|
41
|
+
attrs = doc.search('code').map(&:text).join(' ')
|
42
|
+
attrs = attrs.split(/\s+/).grep(/[A-Z]/).sort.uniq.join(' ')
|
43
|
+
puts "ReactAttrs = %w(#{attrs})".gsub(/(.{1,72})(\s+|\Z)/, "\\1\n")
|
44
|
+
end
|
32
45
|
|
46
|
+
# list of react attributes that require special processing
|
33
47
|
ReactAttrs = %w(acceptCharset accessKey allowFullScreen
|
34
48
|
allowTransparency autoCapitalize autoComplete autoCorrect autoFocus
|
35
|
-
autoPlay cellPadding cellSpacing charSet classID className
|
36
|
-
colSpan contentEditable contextMenu crossOrigin
|
37
|
-
dateTime encType fillOpacity fontFamily fontSize
|
38
|
-
formMethod formNoValidate formTarget frameBorder
|
39
|
-
gradientUnits hrefLang htmlFor httpEquiv
|
40
|
-
itemScope itemType
|
41
|
-
markerMid markerStart maxLength
|
42
|
-
patternContentUnits patternUnits
|
43
|
-
radioGroup readOnly rowSpan spellCheck spreadMethod
|
44
|
-
stopColor stopOpacity strokeDasharray strokeLinecap
|
45
|
-
strokeWidth tabIndex textAnchor useMap viewBox
|
49
|
+
autoPlay autoSave cellPadding cellSpacing charSet classID className
|
50
|
+
clipPath colSpan contentEditable contextMenu crossOrigin
|
51
|
+
dangerouslySetInnerHTML dateTime encType fillOpacity fontFamily fontSize
|
52
|
+
formAction formEncType formMethod formNoValidate formTarget frameBorder
|
53
|
+
gradientTransform gradientUnits hrefLang htmlFor httpEquiv inputMode
|
54
|
+
itemID itemProp itemRef itemScope itemType keyParams keyType
|
55
|
+
marginHeight marginWidth markerEnd markerMid markerStart maxLength
|
56
|
+
mediaGroup noValidate patternContentUnits patternUnits
|
57
|
+
preserveAspectRatio radioGroup readOnly rowSpan spellCheck spreadMethod
|
58
|
+
srcDoc srcSet stopColor stopOpacity strokeDasharray strokeLinecap
|
59
|
+
strokeOpacity strokeWidth tabIndex textAnchor useMap viewBox
|
60
|
+
xlinkActuate xlinkArcrole xlinkHref xlinkRole xlinkShow xlinkTitle
|
61
|
+
xlinkType xmlBase xmlLang xmlSpace)
|
62
|
+
|
46
63
|
ReactAttrMap = Hash[ReactAttrs.map {|name| [name.downcase, name]}]
|
47
64
|
ReactAttrMap['for'] = 'htmlFor'
|
48
65
|
|
@@ -197,31 +214,8 @@ module Ruby2JS
|
|
197
214
|
end
|
198
215
|
end
|
199
216
|
|
200
|
-
#
|
201
|
-
|
202
|
-
block = block.first.children.dup
|
203
|
-
end
|
204
|
-
|
205
|
-
# capture ivars that are both set and referenced
|
206
|
-
@reactIvars[:pre].uniq.sort.reverse.each do |ivar|
|
207
|
-
block.unshift(s(:lvasgn, "$#{ivar.to_s[1..-1]}",
|
208
|
-
s(:attr, s(:attr, s(:self), :state), ivar.to_s[1..-1])))
|
209
|
-
end
|
210
|
-
|
211
|
-
# update ivars that are set and later referenced
|
212
|
-
unless @reactIvars[:post].empty?
|
213
|
-
updates = @reactIvars[:post].uniq.sort.reverse.map do |ivar|
|
214
|
-
s(:pair, s(:lvar, ivar.to_s[1..-1]),
|
215
|
-
s(:lvar, "$#{ivar.to_s[1..-1]}"))
|
216
|
-
end
|
217
|
-
update = s(:send, s(:self), :setState, s(:hash, *updates))
|
218
|
-
|
219
|
-
if block.last.type == :return
|
220
|
-
block.insert(block.length-1, update)
|
221
|
-
else
|
222
|
-
block.push(update)
|
223
|
-
end
|
224
|
-
end
|
217
|
+
# capture and update ivars as required
|
218
|
+
block = react_process_ivars(block)
|
225
219
|
|
226
220
|
# add method to class
|
227
221
|
type = (child.is_method? ? :begin : :autoreturn)
|
@@ -544,7 +538,7 @@ module Ruby2JS
|
|
544
538
|
elsif node.children[1] == :~
|
545
539
|
# Locate a DOM Node
|
546
540
|
# map ~(expression) to document.querySelector(expression)
|
547
|
-
# map ~name to this.refs.name
|
541
|
+
# map ~name to this.refs.name
|
548
542
|
# map ~"a b" to document.querySelector("a b")
|
549
543
|
# map ~"#a" to document.getElementById("a")
|
550
544
|
# map ~"a" to document.getElementsByTagName("a")[0]
|
@@ -571,7 +565,7 @@ module Ruby2JS
|
|
571
565
|
# before:
|
572
566
|
# (send (send nil :a) :text) :~)
|
573
567
|
# after:
|
574
|
-
# (send (
|
568
|
+
# (send (gvar :$a))), :text)
|
575
569
|
if node.type == :send and node.children[0]
|
576
570
|
if node.children[1] == :~ and node.children[0].children[1] == :~
|
577
571
|
# consecutive tildes
|
@@ -592,9 +586,9 @@ module Ruby2JS
|
|
592
586
|
end
|
593
587
|
elsif node.children.first == nil and Symbol === node.children[1]
|
594
588
|
# innermost expression is a scalar
|
595
|
-
s(:
|
589
|
+
s(:gvar, "$#{node.children[1]}")
|
596
590
|
elsif node.type == :lvar
|
597
|
-
s(:
|
591
|
+
s(:gvar, "$#{node.children[0]}")
|
598
592
|
elsif node.type == :str
|
599
593
|
if node.children.first =~ /^#[-\w]+$/
|
600
594
|
s(:send, s(:attr, nil, :document), :getElementById,
|
@@ -875,6 +869,7 @@ module Ruby2JS
|
|
875
869
|
# as these create their own scopes.
|
876
870
|
return if node.type == :pair and node.children[0].type == :sym and
|
877
871
|
node.children[1].type == :block
|
872
|
+
return if node.type == :defs
|
878
873
|
|
879
874
|
child = node.children.first
|
880
875
|
|
@@ -967,6 +962,53 @@ module Ruby2JS
|
|
967
962
|
end
|
968
963
|
node
|
969
964
|
end
|
965
|
+
|
966
|
+
def on_defs(node)
|
967
|
+
return super unless @react
|
968
|
+
|
969
|
+
begin
|
970
|
+
reactIvars = @reactIvars
|
971
|
+
@reactIvars = {pre: [], post: [], asgn: [], ref: [], cond: []}
|
972
|
+
react_walk(node.children.last)
|
973
|
+
@reactIvars[:capture] = (@reactIvars[:pre] + @reactIvars[:post]).uniq
|
974
|
+
node = super
|
975
|
+
block = react_process_ivars([node.children.last.dup])
|
976
|
+
node.updated(nil, [*node.children[0..-2], s(:begin, *block)])
|
977
|
+
ensure
|
978
|
+
@reactIvars = reactIvars
|
979
|
+
end
|
980
|
+
end
|
981
|
+
|
982
|
+
# common logic for inserting code to manage state (ivars)
|
983
|
+
def react_process_ivars(block)
|
984
|
+
# drill down if necessary to find the block
|
985
|
+
while block.length==1 and block.first and block.first.type==:begin
|
986
|
+
block = block.first.children.dup
|
987
|
+
end
|
988
|
+
|
989
|
+
# capture ivars that are both set and referenced
|
990
|
+
@reactIvars[:pre].uniq.sort.reverse.each do |ivar|
|
991
|
+
block.unshift(s(:lvasgn, "$#{ivar.to_s[1..-1]}",
|
992
|
+
s(:attr, s(:attr, s(:self), :state), ivar.to_s[1..-1])))
|
993
|
+
end
|
994
|
+
|
995
|
+
# update ivars that are set and later referenced
|
996
|
+
unless @reactIvars[:post].empty?
|
997
|
+
updates = @reactIvars[:post].uniq.sort.reverse.map do |ivar|
|
998
|
+
s(:pair, s(:lvar, ivar.to_s[1..-1]),
|
999
|
+
s(:lvar, "$#{ivar.to_s[1..-1]}"))
|
1000
|
+
end
|
1001
|
+
update = s(:send, s(:self), :setState, s(:hash, *updates))
|
1002
|
+
|
1003
|
+
if block.last.type == :return
|
1004
|
+
block.insert(block.length-1, update)
|
1005
|
+
else
|
1006
|
+
block.push(update)
|
1007
|
+
end
|
1008
|
+
end
|
1009
|
+
|
1010
|
+
block
|
1011
|
+
end
|
970
1012
|
end
|
971
1013
|
|
972
1014
|
DEFAULTS.push React
|
data/lib/ruby2js/version.rb
CHANGED
data/ruby2js.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: ruby2js 2.0.
|
2
|
+
# stub: ruby2js 2.0.10 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "ruby2js"
|
6
|
-
s.version = "2.0.
|
6
|
+
s.version = "2.0.10"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib"]
|
10
10
|
s.authors = ["Sam Ruby"]
|
11
|
-
s.date = "2015-
|
11
|
+
s.date = "2015-12-13"
|
12
12
|
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"
|
13
13
|
s.email = "rubys@intertwingly.net"
|
14
14
|
s.files = ["README.md", "lib/ruby2js", "lib/ruby2js.rb", "lib/ruby2js/cgi.rb", "lib/ruby2js/converter", "lib/ruby2js/converter.rb", "lib/ruby2js/converter/arg.rb", "lib/ruby2js/converter/args.rb", "lib/ruby2js/converter/array.rb", "lib/ruby2js/converter/begin.rb", "lib/ruby2js/converter/block.rb", "lib/ruby2js/converter/blockpass.rb", "lib/ruby2js/converter/boolean.rb", "lib/ruby2js/converter/break.rb", "lib/ruby2js/converter/case.rb", "lib/ruby2js/converter/casgn.rb", "lib/ruby2js/converter/class.rb", "lib/ruby2js/converter/const.rb", "lib/ruby2js/converter/cvar.rb", "lib/ruby2js/converter/cvasgn.rb", "lib/ruby2js/converter/def.rb", "lib/ruby2js/converter/defined.rb", "lib/ruby2js/converter/defs.rb", "lib/ruby2js/converter/dstr.rb", "lib/ruby2js/converter/for.rb", "lib/ruby2js/converter/hash.rb", "lib/ruby2js/converter/if.rb", "lib/ruby2js/converter/in.rb", "lib/ruby2js/converter/ivar.rb", "lib/ruby2js/converter/ivasgn.rb", "lib/ruby2js/converter/kwbegin.rb", "lib/ruby2js/converter/literal.rb", "lib/ruby2js/converter/logical.rb", "lib/ruby2js/converter/masgn.rb", "lib/ruby2js/converter/module.rb", "lib/ruby2js/converter/next.rb", "lib/ruby2js/converter/nil.rb", "lib/ruby2js/converter/nthref.rb", "lib/ruby2js/converter/opasgn.rb", "lib/ruby2js/converter/prototype.rb", "lib/ruby2js/converter/regexp.rb", "lib/ruby2js/converter/return.rb", "lib/ruby2js/converter/self.rb", "lib/ruby2js/converter/send.rb", "lib/ruby2js/converter/super.rb", "lib/ruby2js/converter/sym.rb", "lib/ruby2js/converter/undef.rb", "lib/ruby2js/converter/until.rb", "lib/ruby2js/converter/untilpost.rb", "lib/ruby2js/converter/var.rb", "lib/ruby2js/converter/vasgn.rb", "lib/ruby2js/converter/while.rb", "lib/ruby2js/converter/whilepost.rb", "lib/ruby2js/converter/xstr.rb", "lib/ruby2js/execjs.rb", "lib/ruby2js/filter", "lib/ruby2js/filter/angular-resource.rb", "lib/ruby2js/filter/angular-route.rb", "lib/ruby2js/filter/angularrb.rb", "lib/ruby2js/filter/camelCase.rb", "lib/ruby2js/filter/functions.rb", "lib/ruby2js/filter/jquery.rb", "lib/ruby2js/filter/minitest-jasmine.rb", "lib/ruby2js/filter/react.rb", "lib/ruby2js/filter/require.rb", "lib/ruby2js/filter/return.rb", "lib/ruby2js/filter/rubyjs.rb", "lib/ruby2js/filter/strict.rb", "lib/ruby2js/filter/underscore.rb", "lib/ruby2js/rails.rb", "lib/ruby2js/serializer.rb", "lib/ruby2js/sinatra.rb", "lib/ruby2js/version.rb", "ruby2js.gemspec"]
|
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: 2.0.
|
4
|
+
version: 2.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Ruby
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|