js2 0.0.8 → 0.0.9
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.
- data/Changelog +3 -0
- data/Manifest.txt +13 -28
- data/Rakefile +19 -19
- data/bin/js2 +48 -41
- data/lib/javascript/sel_marker.js2 +3 -3
- data/lib/js2/config.rb +6 -1
- data/lib/js2/{process/file_handler.rb → file_handler.rb} +15 -19
- data/lib/js2/foo.js2.haml +3 -0
- data/lib/js2/{process/haml_engine.rb → haml_engine.rb} +1 -1
- data/lib/js2/{parser/haml.rb → haml_parser.rb} +20 -7
- data/lib/js2/js2.js +108 -0
- data/lib/js2/js2bootstrap.js2 +455 -0
- data/lib/js2/parser.rb +3542 -0
- data/lib/js2/processor.rb +14 -65
- data/lib/js2/replace.rb +106 -0
- data/lib/js2/{decorator/test.rb → sel_decorator.rb} +11 -14
- data/{meta/c_tokenizer.rl.erb → lib/js2/tokenizer.rl.erb} +155 -123
- data/lib/js2/tree.rb +340 -0
- data/lib/js2/universe.rb +101 -0
- data/lib/js2.rb +31 -77
- data/lib/tasks/js2.rake +1 -1
- metadata +15 -29
- data/lib/js2/ast/class_node.rb +0 -105
- data/lib/js2/ast/comment_node.rb +0 -2
- data/lib/js2/ast/haml_node.rb +0 -22
- data/lib/js2/ast/include_node.rb +0 -11
- data/lib/js2/ast/inherited_node.rb +0 -7
- data/lib/js2/ast/member_node.rb +0 -18
- data/lib/js2/ast/method_node.rb +0 -29
- data/lib/js2/ast/module_node.rb +0 -6
- data/lib/js2/ast/node.rb +0 -14
- data/lib/js2/ast/nodes.rb +0 -123
- data/lib/js2/ast/stuff_node.rb +0 -6
- data/lib/js2/decorator/app.rb +0 -7
- data/lib/js2/decorator/cleanser.rb +0 -54
- data/lib/js2/decorator/standard.rb +0 -103
- data/lib/js2/parser/fast.rb +0 -3959
- data/lib/js2/process/universe.rb +0 -89
- data/lib/js2/test/selenium.rb +0 -109
- data/lib/js2/test/selenium_element.rb +0 -234
- data/lib/js2/test/selenium_helper.rb +0 -27
- data/lib/js2bootstrap.js2 +0 -274
- data/meta/replace.rb +0 -126
data/lib/js2/ast/class_node.rb
DELETED
@@ -1,105 +0,0 @@
|
|
1
|
-
class JS2::AST::ClassNode < JS2::AST::Node
|
2
|
-
attr_accessor :name, :members, :extends, :filename, :parent, :mem_hash, :haml, :includes, :included_mods, :statics
|
3
|
-
|
4
|
-
def initialize (filename, n, text, mems, includes, statics)
|
5
|
-
@filename = filename
|
6
|
-
@line_number = n
|
7
|
-
@members = mems
|
8
|
-
@text = text
|
9
|
-
@mem_hash = Hash.new
|
10
|
-
@child_filenames = Array.new
|
11
|
-
@super_hash = Hash.new
|
12
|
-
@includes = includes
|
13
|
-
@included_mods = []
|
14
|
-
@statics = statics
|
15
|
-
|
16
|
-
self.close!
|
17
|
-
|
18
|
-
@finalized = false
|
19
|
-
end
|
20
|
-
|
21
|
-
def is_module?
|
22
|
-
return false
|
23
|
-
end
|
24
|
-
|
25
|
-
def members
|
26
|
-
if self.haml
|
27
|
-
return @members + [ self.haml ]
|
28
|
-
else
|
29
|
-
return @members
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def close!
|
34
|
-
parse_text!()
|
35
|
-
@members.each do |m|
|
36
|
-
next if m.is_a? JS2::AST::CommentNode
|
37
|
-
@mem_hash[m.name] = m
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def finalize!
|
42
|
-
# already done dude
|
43
|
-
return if @finalized
|
44
|
-
@finalized = true
|
45
|
-
|
46
|
-
# make the connection
|
47
|
-
if parent
|
48
|
-
parent.finalize!
|
49
|
-
end
|
50
|
-
|
51
|
-
haml.finalize!(parent) if haml
|
52
|
-
|
53
|
-
|
54
|
-
@super_hash = Hash.new
|
55
|
-
|
56
|
-
if parent
|
57
|
-
# if parent has haml but not child
|
58
|
-
if parent.haml && ! haml
|
59
|
-
inherited = JS2::AST::InheritedNode.new
|
60
|
-
inherited.name = 'htmlCache'
|
61
|
-
inherited.extends = self.extends
|
62
|
-
@mem_hash['htmlCache'] = inherited
|
63
|
-
@members.push(inherited)
|
64
|
-
end
|
65
|
-
|
66
|
-
parent.mem_hash.each_pair do |name, m|
|
67
|
-
if @mem_hash[m.name]
|
68
|
-
@super_hash[m.name] = parent.name
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
included_mods.reverse.each do |c|
|
74
|
-
merge(c)
|
75
|
-
end
|
76
|
-
|
77
|
-
merge(parent) if parent
|
78
|
-
end
|
79
|
-
|
80
|
-
def merge (c)
|
81
|
-
c.mem_hash.each_pair do |name, m|
|
82
|
-
unless @mem_hash[name]
|
83
|
-
inherited = JS2::AST::InheritedNode.new
|
84
|
-
inherited.name = m.name
|
85
|
-
inherited.extends = c.name
|
86
|
-
@mem_hash[m.name] = inherited
|
87
|
-
@members.push(inherited)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def super_hash
|
93
|
-
return @super_hash
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
def parse_text!
|
98
|
-
m = @text.match(/\s+([\w\.]+)\s+(extends ([\w\.]+))?/)
|
99
|
-
@name = m[1]
|
100
|
-
@extends = m[3]
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
|
105
|
-
|
data/lib/js2/ast/comment_node.rb
DELETED
data/lib/js2/ast/haml_node.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
class JS2::AST::HamlNode < Hash
|
2
|
-
attr_accessor :attrs
|
3
|
-
|
4
|
-
def initialize
|
5
|
-
@attrs = []
|
6
|
-
end
|
7
|
-
|
8
|
-
def finalize! (parent)
|
9
|
-
@attrs = []
|
10
|
-
|
11
|
-
if parent && parent.haml
|
12
|
-
parent.haml.keys.each do |k|
|
13
|
-
next if self[k]
|
14
|
-
@attrs << [ k, "#{parent.name}.prototype.htmlCache.#{k}" ]
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
self.keys.each do |k|
|
19
|
-
@attrs << [ k, self[k] ]
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
data/lib/js2/ast/include_node.rb
DELETED
data/lib/js2/ast/member_node.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
class JS2::AST::MemberNode < JS2::AST::Node
|
2
|
-
attr_accessor :name, :klass
|
3
|
-
|
4
|
-
def close!
|
5
|
-
if m = @text.match(/^(\s*)var\s*([\w\$]+)\s*=(.*);/)
|
6
|
-
@padding = m[1]
|
7
|
-
@name = m[2]
|
8
|
-
@text = m[3].sub(/;\s*$/m, '')
|
9
|
-
elsif m = @text.match(/^(\s*)accessor\s*([\w\$]+)\s*;/)
|
10
|
-
@padding = m[1]
|
11
|
-
@name = m[2]
|
12
|
-
@text = "function (val) { if (arguments.length>0) this._#{@name}=val; return this._#{@name}; }"
|
13
|
-
else
|
14
|
-
raise 'Invalid member'
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
data/lib/js2/ast/method_node.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
class JS2::AST::MethodNode < JS2::AST::Node
|
2
|
-
attr_accessor :name
|
3
|
-
|
4
|
-
def self.properties (filename, line, str)
|
5
|
-
ret = []
|
6
|
-
|
7
|
-
str.sub!(/property/, '')
|
8
|
-
str.split(/,/).collect { |s| s.strip.sub(/;$/, '') }.each do |prop|
|
9
|
-
name = String.new(prop)
|
10
|
-
name[0,1] = name[0,1].upcase
|
11
|
-
setter = "function set#{name} (val) { this.#{prop} = val; }"
|
12
|
-
getter = "function get#{name} () { return this.#{prop}; }"
|
13
|
-
|
14
|
-
ret << self.new(filename, line, setter)
|
15
|
-
ret << self.new(filename, line, getter)
|
16
|
-
end
|
17
|
-
|
18
|
-
return ret
|
19
|
-
end
|
20
|
-
|
21
|
-
|
22
|
-
def close!
|
23
|
-
m = @text.match(/^(\s*)function\s*(\w+)\s*(.*)\s*/m)
|
24
|
-
@padding = m[1]
|
25
|
-
@name = m[2]
|
26
|
-
@text = m[3].sub(/\s*$/m, '')
|
27
|
-
@annotations = []
|
28
|
-
end
|
29
|
-
end
|
data/lib/js2/ast/module_node.rb
DELETED
data/lib/js2/ast/node.rb
DELETED
data/lib/js2/ast/nodes.rb
DELETED
@@ -1,123 +0,0 @@
|
|
1
|
-
|
2
|
-
# ------------------------------------------------------------------------------
|
3
|
-
# AKA Tokens
|
4
|
-
# Hooks into Ragel
|
5
|
-
# this system could be more elegant, but we choose iteration over OO for
|
6
|
-
# efficiency
|
7
|
-
# HOOKS:
|
8
|
-
# << # to simulate <<
|
9
|
-
# ------------------------------------------------------------------------------
|
10
|
-
class JS2::AST::Nodes < Array
|
11
|
-
CLOSE_CLASS_LEVEL = 0
|
12
|
-
CLOSE_METHOD_LEVEL = 1
|
13
|
-
|
14
|
-
STATE_IDX = 0
|
15
|
-
STRING_IDX = 1
|
16
|
-
METHODS_IDX = 2
|
17
|
-
|
18
|
-
attr_accessor :stack, :filename, :line_number
|
19
|
-
|
20
|
-
def initialize (filename, str)
|
21
|
-
@cleanser = JS2::Decorator::Cleanser.new
|
22
|
-
@str = str
|
23
|
-
@filename = filename
|
24
|
-
@line_number = 0
|
25
|
-
@mems = []
|
26
|
-
@static_mems = []
|
27
|
-
@includes = []
|
28
|
-
@foreach = []
|
29
|
-
@comments = []
|
30
|
-
@curries = []
|
31
|
-
@in_class = false
|
32
|
-
|
33
|
-
@static = false
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
def do_next (type, begin_index, end_index, line)
|
38
|
-
val = @str[begin_index..end_index]
|
39
|
-
|
40
|
-
if type == :FOREACH
|
41
|
-
@foreach.push([begin_index, end_index, val])
|
42
|
-
|
43
|
-
elsif type == :CURRY
|
44
|
-
@curries.push([begin_index, end_index, val])
|
45
|
-
|
46
|
-
elsif type != :COMMENT
|
47
|
-
offset = 0
|
48
|
-
@foreach.reverse.each do |f|
|
49
|
-
s = f[0] - begin_index
|
50
|
-
e = f[1] - begin_index
|
51
|
-
before = val[s..e]
|
52
|
-
after = @cleanser.do_foreach(val[s..e])
|
53
|
-
offset += after.length - before.length
|
54
|
-
|
55
|
-
val[s..e] = after
|
56
|
-
end
|
57
|
-
|
58
|
-
@curries.reverse.each do |f|
|
59
|
-
s = f[0] - begin_index + offset
|
60
|
-
e = f[1] - begin_index + offset
|
61
|
-
val[s..e] = @cleanser.do_curry(val[s..e])
|
62
|
-
end
|
63
|
-
|
64
|
-
@foreach = []
|
65
|
-
@curries = []
|
66
|
-
end
|
67
|
-
|
68
|
-
if type == :METHOD
|
69
|
-
mems << JS2::AST::MethodNode.new(@filename, line, val)
|
70
|
-
reset_static
|
71
|
-
|
72
|
-
elsif type == :MEMBER
|
73
|
-
mems << JS2::AST::MemberNode.new(@filename, line, val)
|
74
|
-
reset_static
|
75
|
-
|
76
|
-
elsif type == :PROPERTY
|
77
|
-
@mems += JS2::AST::MethodNode.properties(@filename, line, val)
|
78
|
-
reset_static
|
79
|
-
|
80
|
-
elsif type == :CLASS
|
81
|
-
self << JS2::AST::ClassNode.new(@filename, line, val, @mems, @includes, @static_mems)
|
82
|
-
|
83
|
-
@static_mems = []
|
84
|
-
@mems = []
|
85
|
-
@includes = []
|
86
|
-
|
87
|
-
elsif type == :STUFF
|
88
|
-
self << JS2::AST::StuffNode.new(@filename, line, val)
|
89
|
-
@mems = []
|
90
|
-
|
91
|
-
elsif type == :COMMENT
|
92
|
-
mems << JS2::AST::CommentNode.new(@filename, line, val)
|
93
|
-
|
94
|
-
elsif type == :INCLUDE
|
95
|
-
@includes << JS2::AST::IncludeNode.new(@filename, line, val)
|
96
|
-
|
97
|
-
elsif type == :MODULE
|
98
|
-
self << JS2::AST::ModuleNode.new(@filename, line, val, @mems, [], @static_mems)
|
99
|
-
|
100
|
-
@static_mems = []
|
101
|
-
@mems = []
|
102
|
-
@includes = []
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
def mems
|
108
|
-
if @static
|
109
|
-
return @static_mems
|
110
|
-
else
|
111
|
-
return @mems
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def set_static
|
116
|
-
@static = true
|
117
|
-
end
|
118
|
-
|
119
|
-
def reset_static
|
120
|
-
@static = false
|
121
|
-
end
|
122
|
-
|
123
|
-
end
|
data/lib/js2/ast/stuff_node.rb
DELETED
data/lib/js2/decorator/app.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
class JS2::Decorator::Cleanser
|
2
|
-
@@enum = 0
|
3
|
-
|
4
|
-
def cleanse (str)
|
5
|
-
do_foreach(str)
|
6
|
-
end
|
7
|
-
|
8
|
-
def do_foreach (str)
|
9
|
-
# TODO support types
|
10
|
-
# TODO foreach:pair (var key,item in itemHash)
|
11
|
-
# TODO foreach:time (var i in 25)
|
12
|
-
# TODO foreach:key (var key in hash)
|
13
|
-
#
|
14
|
-
# SUPPORTED foreach (var item:i in items)
|
15
|
-
if m = str.match(%r|foreach\s*(:([^\s]))?\s*\(\s*var\s+([^\s\:]+)\s*(:?([^\s]+))?\s+in\s+([^\s]+)\s*\)|)
|
16
|
-
type = m[2]
|
17
|
-
decl = m[3]
|
18
|
-
it = m[5] || ('it_' + (@@enum += 1).to_s)
|
19
|
-
arr = m[6]
|
20
|
-
len = it + '_len'
|
21
|
-
|
22
|
-
return "for (var #{decl},#{it}=0,#{len}=#{arr}.length; (#{decl}=#{arr}[#{it}]) || #{it}<#{len}; #{it}++)"
|
23
|
-
else
|
24
|
-
return str
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def do_curry (str)
|
29
|
-
|
30
|
-
# decl code
|
31
|
-
if m = str.match(%r|^curry\s*([^\{]*)?(\{.*)$|m)
|
32
|
-
decl = m[1].strip
|
33
|
-
code = m[2]
|
34
|
-
|
35
|
-
scoped_vars = ''
|
36
|
-
args = ''
|
37
|
-
|
38
|
-
if m = decl.match(%r|with\s+\(([^)]*)\)|)
|
39
|
-
vars = m[1].split(',').collect { |v| v.strip }
|
40
|
-
scoped_vars = vars.collect { |v| v == 'this' ? 'self' : v }.join(', ')
|
41
|
-
in_scoped_vars = vars.join(', ')
|
42
|
-
end
|
43
|
-
|
44
|
-
if m = decl.match(%r|^\s*\(([^)]*)\)|)
|
45
|
-
args = m[1].strip
|
46
|
-
end
|
47
|
-
|
48
|
-
|
49
|
-
return %{(function (#{scoped_vars}) { return function (#{args}) #{code} })(#{in_scoped_vars})}
|
50
|
-
else
|
51
|
-
return str
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,103 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
class JS2::Decorator::Standard
|
5
|
-
def draw_nodes (nodes)
|
6
|
-
str = ''
|
7
|
-
nodes.each do |node|
|
8
|
-
if node.is_a? JS2::AST::StuffNode
|
9
|
-
str << draw_stuff(node)
|
10
|
-
elsif node.is_a? JS2::AST::ClassNode
|
11
|
-
str << draw_class(node)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
return str
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def draw_method (node)
|
20
|
-
return %{
|
21
|
-
#{node.name}:function #{node.text}}
|
22
|
-
end
|
23
|
-
|
24
|
-
def draw_inherited (node)
|
25
|
-
return " #{node.name}: #{node.extends}.prototype.#{node.name}"
|
26
|
-
end
|
27
|
-
|
28
|
-
def draw_haml (node)
|
29
|
-
text = node.attrs.collect do |attr|
|
30
|
-
%{#{attr[0]}:#{attr[1]}}
|
31
|
-
end.join(',')
|
32
|
-
return %{ htmlCache: {#{text}}}
|
33
|
-
end
|
34
|
-
|
35
|
-
def draw_comment (node)
|
36
|
-
return ' ' + node.text
|
37
|
-
end
|
38
|
-
|
39
|
-
def draw_member (node)
|
40
|
-
if node.is_a? JS2::AST::MethodNode
|
41
|
-
return draw_method(node)
|
42
|
-
elsif node.is_a? JS2::AST::InheritedNode
|
43
|
-
return draw_inherited(node)
|
44
|
-
elsif node.is_a? JS2::AST::HamlNode
|
45
|
-
return draw_haml(node)
|
46
|
-
elsif node.is_a? JS2::AST::CommentNode
|
47
|
-
return draw_comment(node)
|
48
|
-
end
|
49
|
-
|
50
|
-
return %{
|
51
|
-
#{node.name}:#{node.text}}
|
52
|
-
end
|
53
|
-
|
54
|
-
def draw_class (node)
|
55
|
-
meta = ''
|
56
|
-
if node.extends
|
57
|
-
meta << "_parent:#{node.extends},"
|
58
|
-
end
|
59
|
-
|
60
|
-
members = node.members
|
61
|
-
|
62
|
-
meta << "_klass:'#{node.name}'"
|
63
|
-
meta << ',' unless members.empty?
|
64
|
-
|
65
|
-
handle_super = ''
|
66
|
-
node.super_hash.each_pair do |k,v|
|
67
|
-
handle_super << "#{node.name}.prototype.#{k}._super=#{v}.prototype.#{k};\n"
|
68
|
-
end
|
69
|
-
|
70
|
-
handle_static =
|
71
|
-
node.statics.collect do |s|
|
72
|
-
handle_static = "#{node.name}.#{s.name}=function #{s.text};"
|
73
|
-
end.join("\n")
|
74
|
-
|
75
|
-
member_js = [ ]
|
76
|
-
member_str = ''
|
77
|
-
members.each do |m|
|
78
|
-
member_str << draw_member(m)
|
79
|
-
if m.is_a? JS2::AST::CommentNode
|
80
|
-
member_str << "\n"
|
81
|
-
else
|
82
|
-
member_js.push(member_str)
|
83
|
-
member_str = ''
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
return <<-END
|
88
|
-
|
89
|
-
JS2.createClass("#{node.name}");
|
90
|
-
#{node.name}.prototype={#{meta}
|
91
|
-
#{member_js.join(",\n") }
|
92
|
-
};
|
93
|
-
// adding super
|
94
|
-
#{handle_super}
|
95
|
-
#{handle_static}
|
96
|
-
#{node.name}.prototype['class']=#{node.name};
|
97
|
-
END
|
98
|
-
end
|
99
|
-
|
100
|
-
def draw_stuff (node)
|
101
|
-
return node.text
|
102
|
-
end
|
103
|
-
end
|