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
data/Changelog CHANGED
@@ -1,3 +1,6 @@
1
+ == 0.0.9 2009-12-23
2
+ * large 1st move to runtime js2
3
+
1
4
  == 0.0.8 2009-12-23
2
5
  * fixed unique file problem in compilition files
3
6
 
data/Manifest.txt CHANGED
@@ -11,37 +11,22 @@ examples/js2.yml
11
11
  examples/test.yml
12
12
  lib/javascript/sel_marker.js2
13
13
  lib/javascript/test.js2
14
- lib/js2bootstrap.js2
14
+ lib/tasks/js2.rake
15
15
  lib/js2.rb
16
- lib/js2/ast/class_node.rb
17
- lib/js2/ast/comment_node.rb
18
- lib/js2/ast/haml_node.rb
19
- lib/js2/ast/include_node.rb
20
- lib/js2/ast/inherited_node.rb
21
- lib/js2/ast/member_node.rb
22
- lib/js2/ast/method_node.rb
23
- lib/js2/ast/module_node.rb
24
- lib/js2/ast/node.rb
25
- lib/js2/ast/nodes.rb
26
- lib/js2/ast/stuff_node.rb
27
16
  lib/js2/config.rb
28
17
  lib/js2/daemon.rb
29
- lib/js2/decorator/app.rb
30
- lib/js2/decorator/cleanser.rb
31
- lib/js2/decorator/standard.rb
32
- lib/js2/decorator/test.rb
33
- lib/js2/parser/fast.rb
34
- lib/js2/parser/haml.rb
35
- lib/js2/process/file_handler.rb
36
- lib/js2/process/haml_engine.rb
37
- lib/js2/process/universe.rb
18
+ lib/js2/file_handler.rb
19
+ lib/js2/foo.js2.haml
20
+ lib/js2/haml_engine.rb
21
+ lib/js2/haml_parser.rb
22
+ lib/js2/js2.js
23
+ lib/js2/js2bootstrap.js2
24
+ lib/js2/parser.rb
38
25
  lib/js2/processor.rb
39
- lib/js2/test/selenium.rb
40
- lib/js2/test/selenium_element.rb
41
- lib/js2/test/selenium_helper.rb
42
- lib/tasks/js2.rake
43
- meta/c_tokenizer.rl.erb
44
- meta/replace.rb
26
+ lib/js2/replace.rb
27
+ lib/js2/sel_decorator.rb
28
+ lib/js2/tokenizer.rl.erb
29
+ lib/js2/tree.rb
30
+ lib/js2/universe.rb
45
31
  bin/js2
46
32
  website/index.txt
47
-
data/Rakefile CHANGED
@@ -20,22 +20,22 @@ require 'newgem/tasks'
20
20
  Dir['tasks/**/*.rake'].each { |t| load t }
21
21
 
22
22
 
23
- task :default => [ :build_ragel, :test ] do
24
- end
25
-
26
- task :build_ragel do
27
- puts "build_ragel"
28
- system("cd meta/; ruby replace.rb; cd ../; ragel -C meta/final_tokenizer.rl; mv meta/final_tokenizer.c lib/js2/parser/fast.rb")
29
- end
30
-
31
- task :test do
32
- puts "run test"
33
- system("ruby test/test.rb")
34
- end
35
-
36
- namespace :js2 => :envionment do
37
- task :build do
38
- p = JS2::Processor.processor_from_file(RAILS_ROOT + '/config/js2.yml', RAILS_ENV)
39
- p.write_files
40
- end
41
- end
23
+ #task :default => [ :build_ragel, :test ] do
24
+ #end
25
+ #
26
+ #task :build_ragel do
27
+ # puts "build_ragel"
28
+ # system("cd meta/; ruby replace.rb; cd ../; ragel -C meta/final_tokenizer.rl; mv meta/final_tokenizer.c lib/js2/parser/fast.rb")
29
+ #end
30
+ #
31
+ #task :test do
32
+ # puts "run test"
33
+ # system("ruby test/test.rb")
34
+ #end
35
+ #
36
+ #namespace :js2 => :envionment do
37
+ # task :build do
38
+ # p = JS2::Processor.processor_from_file(RAILS_ROOT + '/config/js2.yml', RAILS_ENV)
39
+ # p.write_files
40
+ # end
41
+ #end
data/bin/js2 CHANGED
@@ -9,70 +9,77 @@ options = Hash.new
9
9
 
10
10
  dir = nil
11
11
 
12
- # assume rails
13
- if ARGV.empty? && File.directory?('public') && File.directory?('app') && File.directory?('vendor') && File.directory?('config')
14
12
 
15
- puts "Detected Rails setup: using auto config"
13
+ usage = "Usage: js2 [options] <dir-with-js2>"
14
+ op = OptionParser.new do |opts|
15
+ opts.banner = usage
16
16
 
17
- dir = File.directory?('app/js2') ? './app/js2' : './js2'
18
- puts "Using js2 dir: #{dir}"
17
+ opts.on("--js2-haml-dir DIR", "Directory with js2.haml files") do |haml|
18
+ options[:js2_haml_dir] = haml
19
+ end
19
20
 
20
- options[:write_dir] = './public/javascripts'
21
- puts "Writing to: #{options[:write_dir]}"
21
+ opts.on("--out-dir DIR", "Directory of js2 -> js output") do |out|
22
+ options[:write_dir] = out
23
+ end
22
24
 
23
- options[:daemonize] = true
25
+ opts.on("--vars VARS", "Example: var1=val1;var2=val2") do |out|
26
+ vars = Hash.new
27
+ out.split(/;/).each do |str|
28
+ pair = str.split(/=/)
29
+ vars[pair[0]] = pair[1]
30
+ end
31
+ options[:var] = vars
32
+ end
24
33
 
25
- options[:js2_haml_dir] = dir
26
- puts "HAML dir (optional): #{options[:js2_haml_dir]}"
34
+ opts.on("-d", "--daemonize") do |d|
35
+ options[:daemonize] = true
36
+ end
27
37
 
28
- else
38
+ opts.on('-h', "--help", "Help Screen") do
39
+ puts opts
40
+ exit
41
+ end
42
+ end
29
43
 
30
- usage = "Usage: js2 [options] <dir-with-js2>"
31
- op = OptionParser.new do |opts|
32
- opts.banner = usage
44
+ # assume rails
45
+ if ! options[:write_dir] && File.directory?('public') && File.directory?('app') && File.directory?('vendor') && File.directory?('config')
46
+ puts "Detected Rails setup: using auto config"
33
47
 
34
- opts.on("--js2-haml-dir DIR", "Directory with js2.haml files") do |haml|
35
- options[:js2_haml_dir] = haml
36
- end
48
+ options[:js2_dir] = File.directory?('app/js2') ? './app/js2' : './js2'
37
49
 
38
- opts.on("--out-dir DIR", "Directory of js2 -> js output") do |out|
39
- options[:write_dir] = out
40
- end
50
+ options[:write_dir] ||= './public/javascripts'
41
51
 
42
- opts.on("-d", "--daemonize") do |d|
43
- options[:daemonize] = true
44
- end
52
+ options[:daemonize] = true
45
53
 
46
- opts.on('-h', "--help", "Help Screen") do
47
- puts opts
48
- exit
49
- end
50
- end
54
+ options[:js2_haml_dir] = dir
55
+ end
51
56
 
52
- begin
53
- op.parse!(ARGV)
54
- rescue OptionParser::ParseError => e
55
- puts op
56
- end
57
57
 
58
- dir = ARGV.pop
58
+ begin
59
+ op.parse!(ARGV)
60
+ rescue OptionParser::ParseError => e
61
+ puts op
59
62
  end
60
63
 
61
64
  if !dir && File.directory?("./public/javascripts")
62
65
  dir = "./public/javascripts"
63
66
  end
64
67
 
65
- unless dir
66
- puts op
67
- exit
68
- end
68
+ options[:js2_dir] ||= '.'
69
+ options[:js2_haml_dir] ||= '.'
70
+ options[:write_dir] ||= '.'
71
+ options[:vars] ||= {}
69
72
 
73
+ puts "Using js2 dir: #{options[:dir]}"
74
+ puts "Writing to: #{options[:write_dir]}"
75
+ puts "HAML dir (optional): #{options[:js2_haml_dir]}"
70
76
 
71
77
  config = JS2::Config.new
72
78
 
73
- config.js2_dir = dir
74
- config.js2_haml_dir = options[:js2_haml_dir] || dir
75
- config.write_dir = options[:write_dir] || dir
79
+ config.js2_dir = options[:js2_dir]
80
+ config.js2_haml_dir = options[:js2_haml_dir]
81
+ config.write_dir = options[:write_dir]
82
+ config.vars = options[:vars]
76
83
 
77
84
  p = JS2::Processor.get(config)
78
85
  if options[:daemonize]
@@ -104,11 +104,11 @@ class JS2.SelMarker {
104
104
 
105
105
  function getRealClassScope (klass) {
106
106
  if (klass.main && klass.main.factoryId) {
107
- var namespace = klass.main._klass.replace(/\.\w+$/, '');
108
- var classname = klass._klass.match(/\.\w+$/)[0];
107
+ var namespace = klass.main['class'].className.replace(/\.\w+$/, '');
108
+ var classname = klass['class'].className.match(/\.\w+$/)[0];
109
109
  return namespace + classname;
110
110
  } else {
111
- return klass._klass;
111
+ return klass.className;
112
112
  }
113
113
  }
114
114
 
data/lib/js2/config.rb CHANGED
@@ -11,12 +11,15 @@ class JS2::Config
11
11
  :test_mode => false,
12
12
  :js2_haml_dir => './js2',
13
13
  :haml_dir => './app/views',
14
- :selenium => { }
14
+ :selenium => { },
15
+ :vars => { }
15
16
  }
16
17
 
17
18
  attr_accessor *DEFAULTS.keys
18
19
 
19
20
  def initialize (hash = nil)
21
+ @vars = Hash.new
22
+
20
23
  DEFAULTS.each_pair do |k,v|
21
24
  self.send(k.to_s + '=', v)
22
25
  end
@@ -29,6 +32,8 @@ class JS2::Config
29
32
  k = k.to_s
30
33
  self.send(k + '=', hash[k]) if hash.has_key?(k)
31
34
  end
35
+
36
+ self.js2_dir = hash[:read_dir] if hash[:read_dir]
32
37
  end
33
38
  end
34
39
 
@@ -1,19 +1,14 @@
1
- class JS2::Process::FileHandler
1
+ class JS2::FileHandler
2
2
  def initialize (params = {})
3
3
  @read_dir = params[:read_dir]
4
- @write_dir = params[:write_dir]
5
- @haml_dir = params[:haml_dir]
6
- @view_dir = params[:view_dir]
4
+ @write_dir = params[:write_dir] || @read_dir
5
+ @haml_dir = params[:haml_dir] || @read_dir
6
+ @view_dir = params[:view_dir] || @read_dir
7
7
  @yml_dir = params[:read_dir]
8
8
 
9
9
  @mtimes = Hash.new
10
10
  end
11
11
 
12
- # depricated
13
- def class_file
14
- return @write_dir + '/classes.js'
15
- end
16
-
17
12
  def get_view_files
18
13
  return [] unless @view_dir
19
14
  return Dir.glob(@view_dir + '/**/*.haml')
@@ -33,22 +28,23 @@ class JS2::Process::FileHandler
33
28
  return Dir.glob(@read_dir + '/**/*/*.js2') + Dir.glob(@read_dir + '/*.js2')
34
29
  end
35
30
 
36
- def write_file (filename, str)
37
- to_write = nil
38
-
39
- # hack just for bootstrap so that its written in the root dir
40
- if filename.match(/js2bootstrap.js2$/)
41
- to_write = @write_dir + '/js2bootstrap.js'
42
- else
43
- to_write = filename.sub(/^#{@read_dir}/, @write_dir).sub(/\.js2$/, '.js')
44
- end
45
-
31
+ def write_file (filename, str, force = false)
32
+ to_write = get_js_filename(filename, force)
46
33
  FileUtils.mkpath(File.dirname(to_write))
47
34
  File.open(to_write, 'w') do |f|
48
35
  f << str
49
36
  end
50
37
  end
51
38
 
39
+ def get_js_filename (filename, force = false)
40
+ to_write = filename.sub(/^#{@read_dir}/, @write_dir).sub(/\.js2$/, '.js')
41
+
42
+ if force
43
+ to_write = @write_dir + '/' + filename
44
+ end
45
+ return to_write
46
+ end
47
+
52
48
  def write_compilation (filename, compilation)
53
49
  to_write = filename.sub(/^#{@read_dir}/, @write_dir).sub(/\.js2$/, '.comp.js')
54
50
  str = ""
@@ -0,0 +1,3 @@
1
+ Foo
2
+ main
3
+ %div
@@ -8,7 +8,7 @@ rescue Exception
8
8
  end
9
9
 
10
10
 
11
- class JS2::Process::HamlEngine
11
+ class JS2::HamlEngine
12
12
  def hamlize (string)
13
13
  return Haml::Engine.new(string, { :ugly => true }).render(self).gsub(/\n/, '')
14
14
  end
@@ -1,15 +1,15 @@
1
1
  begin
2
2
  require 'rubygems'
3
3
  require 'haml'
4
+ require 'erb'
4
5
  require 'json'
5
- rescue Exception
6
- puts "HAML is not supported"
7
- end
8
6
 
9
- class JS2::Parser::Haml
7
+ class JS2::HamlParser
8
+ attr_accessor :vars
10
9
 
11
- def initialize (haml_engine)
12
- @haml_engine = haml_engine
10
+ def initialize (haml_engine = nil, vars = nil)
11
+ @haml_engine = haml_engine || JS2::HamlEngine.new
12
+ @vars = vars || Hash.new
13
13
  end
14
14
 
15
15
  def parse_out_js (file)
@@ -32,7 +32,10 @@ class JS2::Parser::Haml
32
32
  end
33
33
 
34
34
  def parse (file)
35
- lines = File.read(file).split(/\r?\n/)
35
+ erb = ERB.new(File.read(file))
36
+ str = erb.result(binding)
37
+
38
+ lines = str.split(/\r?\n/)
36
39
  result = Hash.new
37
40
 
38
41
  klass = Hash.new
@@ -77,6 +80,9 @@ class JS2::Parser::Haml
77
80
  end
78
81
 
79
82
  return result
83
+ rescue Exception => e
84
+ puts file
85
+ raise e
80
86
  end
81
87
 
82
88
  private
@@ -87,6 +93,7 @@ class JS2::Parser::Haml
87
93
  rescue Exception => e
88
94
  puts "Error Processing SASS:"
89
95
  puts string
96
+ puts e.backtrace.join("\n")
90
97
  raise e
91
98
  end
92
99
  return css.gsub(/\n/, '').to_json
@@ -98,6 +105,7 @@ class JS2::Parser::Haml
98
105
  rescue Exception => e
99
106
  puts "Error Processing HAML:"
100
107
  puts string
108
+ puts e.backtrace.join("\n")
101
109
  raise e
102
110
  end
103
111
 
@@ -129,4 +137,9 @@ class JS2::Parser::Haml
129
137
  end
130
138
 
131
139
 
140
+ end
141
+ rescue Exception
142
+ puts "HAML is not supported"
143
+
144
+
132
145
  end
data/lib/js2/js2.js ADDED
@@ -0,0 +1,108 @@
1
+ (function (scope) {
2
+ var JS2 = {};
3
+ scope.JS2 = JS2;
4
+
5
+ var ooUtils = {
6
+ extends: function (par) {
7
+ this.oo.parent = par;
8
+ this.oo.prime.prototype = par.oo.instance;
9
+ this.prototype = new this.oo.prime();
10
+ },
11
+
12
+ include: function (mod) {
13
+ var hash = mod.prototype;
14
+ var members = this.oo.members;
15
+ for (var k in hash) {
16
+ if (! members[k]) this.oo.prime.prototype[k] = newFly[k];
17
+ }
18
+ },
19
+
20
+ member: function (name, member) {
21
+ this.oo.members[name] = true;
22
+ this.oo.prime.prototype[name] = member;
23
+ },
24
+
25
+ staticMember: function (name, member) {
26
+ this[name] = member;
27
+ },
28
+
29
+ setHTMLCache: function (hash) {
30
+ // create temp class
31
+ var tempClass = function () {};
32
+
33
+ // look for super htmlCache
34
+ var par = this.oo.parent;
35
+ if (par) {
36
+ var parCache = par.oo.instance.htmlCache;
37
+ if (parCache) tempClass.prototype = parCache;
38
+ }
39
+
40
+ var htmlCache = new tempClass();
41
+ for (var k in hash) tempObj[k] = hash[k];
42
+ this.oo('member', 'htmlCache', htmlCache);
43
+ },
44
+
45
+ super: function (member) {
46
+ return this.oo.parent.instance[member];
47
+ },
48
+
49
+ property: function (names) {
50
+ for (var i=0; i<names.length; i++) {
51
+ var name = names[i];
52
+ var getter = 'get' + name.charAt(0).toUpperCase() + a.substr(1);
53
+ var setter = 'set' + name.charAt(0).toUpperCase() + a.substr(1);
54
+ if (!this.oo.members[getter]) this.oo('member', getter, function () { return this[name] });
55
+ if (!this.oo.members[setter]) this.oo('member', setter, function (val) { return this[name] = val });
56
+ }
57
+ }
58
+
59
+ };
60
+
61
+ // ROOT Object
62
+ (function (JS2) {
63
+ JS2.Object = function () {};
64
+ JS2.Object.meta = { instance: new JS2.Object(), methods: {} };
65
+ JS2.Object.prototype.initialize = function () { return function () {} };
66
+ JS2.Object.prototype.super = function (member) { return this.prototype.prototype[member]; };
67
+ })(JS2);
68
+
69
+ function createClass (name, par) {
70
+ var K = function () { this.initialize.apply(this, arguments); };
71
+
72
+ var prime = function () {};
73
+ K.prototype = new prime();
74
+ K.prototype.class = K;
75
+ K.prototype.initialize = prime; // hack
76
+
77
+ K.oo = function (method, param1, param2) {
78
+ ooUtils[method].apply(K, [ param1, param2 ]);
79
+ };
80
+
81
+ K.oo.prime = prime;
82
+ K.oo.includes = [];
83
+ K.oo.instance = new K();
84
+ K.oo.members = {};
85
+
86
+ return K;
87
+ }
88
+
89
+ function createNamespace (space, currentScope) {
90
+ var currentScope = currentScope || scope;
91
+
92
+ var splitted = space.split('.');
93
+ var name = [];
94
+ while (splitted.length) {
95
+ var part = splitted.shift();
96
+ name.push(part);
97
+ if (! currentScope[part]) currentScope[part] = createClass();
98
+ currentScope = currentScope[part];
99
+ currentScope.name = name.join('.');
100
+ }
101
+ }
102
+
103
+ JS2.OO = {};
104
+ JS2.OO.createClass = createNamespace;
105
+
106
+
107
+ })(window);
108
+