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.
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