js2 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/Changelog +3 -0
  2. data/Manifest.txt +13 -28
  3. data/Rakefile +19 -19
  4. data/bin/js2 +48 -41
  5. data/lib/javascript/sel_marker.js2 +3 -3
  6. data/lib/js2/config.rb +6 -1
  7. data/lib/js2/{process/file_handler.rb → file_handler.rb} +15 -19
  8. data/lib/js2/foo.js2.haml +3 -0
  9. data/lib/js2/{process/haml_engine.rb → haml_engine.rb} +1 -1
  10. data/lib/js2/{parser/haml.rb → haml_parser.rb} +20 -7
  11. data/lib/js2/js2.js +108 -0
  12. data/lib/js2/js2bootstrap.js2 +455 -0
  13. data/lib/js2/parser.rb +3542 -0
  14. data/lib/js2/processor.rb +14 -65
  15. data/lib/js2/replace.rb +106 -0
  16. data/lib/js2/{decorator/test.rb → sel_decorator.rb} +11 -14
  17. data/{meta/c_tokenizer.rl.erb → lib/js2/tokenizer.rl.erb} +155 -123
  18. data/lib/js2/tree.rb +340 -0
  19. data/lib/js2/universe.rb +101 -0
  20. data/lib/js2.rb +31 -77
  21. data/lib/tasks/js2.rake +1 -1
  22. metadata +15 -29
  23. data/lib/js2/ast/class_node.rb +0 -105
  24. data/lib/js2/ast/comment_node.rb +0 -2
  25. data/lib/js2/ast/haml_node.rb +0 -22
  26. data/lib/js2/ast/include_node.rb +0 -11
  27. data/lib/js2/ast/inherited_node.rb +0 -7
  28. data/lib/js2/ast/member_node.rb +0 -18
  29. data/lib/js2/ast/method_node.rb +0 -29
  30. data/lib/js2/ast/module_node.rb +0 -6
  31. data/lib/js2/ast/node.rb +0 -14
  32. data/lib/js2/ast/nodes.rb +0 -123
  33. data/lib/js2/ast/stuff_node.rb +0 -6
  34. data/lib/js2/decorator/app.rb +0 -7
  35. data/lib/js2/decorator/cleanser.rb +0 -54
  36. data/lib/js2/decorator/standard.rb +0 -103
  37. data/lib/js2/parser/fast.rb +0 -3959
  38. data/lib/js2/process/universe.rb +0 -89
  39. data/lib/js2/test/selenium.rb +0 -109
  40. data/lib/js2/test/selenium_element.rb +0 -234
  41. data/lib/js2/test/selenium_helper.rb +0 -27
  42. data/lib/js2bootstrap.js2 +0 -274
  43. data/meta/replace.rb +0 -126
@@ -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
-
@@ -1,2 +0,0 @@
1
- class JS2::AST::CommentNode < JS2::AST::Node
2
- end
@@ -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
@@ -1,11 +0,0 @@
1
- class JS2::AST::IncludeNode < JS2::AST::Node
2
- attr_accessor :name
3
-
4
- def close!
5
- if m = @text.match(/^(\s*)include\s*([\.\w]+)\s*;/)
6
- @padding = m[1]
7
- @name = m[2]
8
- end
9
- end
10
-
11
- end
@@ -1,7 +0,0 @@
1
- class JS2::AST::InheritedNode
2
- attr_accessor :name, :extends
3
-
4
- def to_js
5
- return " #{name}: #{extends}.prototype.#{name}"
6
- end
7
- end
@@ -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
@@ -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
@@ -1,6 +0,0 @@
1
- class JS2::AST::ModuleNode < JS2::AST::ClassNode
2
-
3
- def is_module?
4
- return true
5
- end
6
- end
data/lib/js2/ast/node.rb DELETED
@@ -1,14 +0,0 @@
1
- class JS2::AST::Node
2
- attr_accessor :text, :filename, :line_number
3
-
4
- def initialize (filename, n, text)
5
- @line_number = n
6
- @filename = filename
7
- @text = text
8
-
9
- self.close!
10
- end
11
-
12
- def close!
13
- end
14
- end
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
@@ -1,6 +0,0 @@
1
- class JS2::AST::StuffNode < JS2::AST::Node
2
-
3
- def type
4
- return :STUFF
5
- end
6
- end
@@ -1,7 +0,0 @@
1
- class JS2::Decorator::App
2
- def initialize (yaml_file)
3
- @yaml = YAML.load_file(yaml_file)
4
- end
5
-
6
- end
7
-
@@ -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