js2 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- 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/Changelog
CHANGED
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/
|
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/
|
30
|
-
lib/js2/
|
31
|
-
lib/js2/
|
32
|
-
lib/js2/
|
33
|
-
lib/js2/
|
34
|
-
lib/js2/
|
35
|
-
lib/js2/
|
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/
|
40
|
-
lib/js2/
|
41
|
-
lib/js2/
|
42
|
-
lib/
|
43
|
-
|
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
|
-
|
13
|
+
usage = "Usage: js2 [options] <dir-with-js2>"
|
14
|
+
op = OptionParser.new do |opts|
|
15
|
+
opts.banner = usage
|
16
16
|
|
17
|
-
|
18
|
-
|
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
|
-
|
21
|
-
|
21
|
+
opts.on("--out-dir DIR", "Directory of js2 -> js output") do |out|
|
22
|
+
options[:write_dir] = out
|
23
|
+
end
|
22
24
|
|
23
|
-
|
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
|
-
|
26
|
-
|
34
|
+
opts.on("-d", "--daemonize") do |d|
|
35
|
+
options[:daemonize] = true
|
36
|
+
end
|
27
37
|
|
28
|
-
|
38
|
+
opts.on('-h', "--help", "Help Screen") do
|
39
|
+
puts opts
|
40
|
+
exit
|
41
|
+
end
|
42
|
+
end
|
29
43
|
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
35
|
-
options[:js2_haml_dir] = haml
|
36
|
-
end
|
48
|
+
options[:js2_dir] = File.directory?('app/js2') ? './app/js2' : './js2'
|
37
49
|
|
38
|
-
|
39
|
-
options[:write_dir] = out
|
40
|
-
end
|
50
|
+
options[:write_dir] ||= './public/javascripts'
|
41
51
|
|
42
|
-
|
43
|
-
options[:daemonize] = true
|
44
|
-
end
|
52
|
+
options[:daemonize] = true
|
45
53
|
|
46
|
-
|
47
|
-
|
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
|
-
|
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
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
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 =
|
74
|
-
config.js2_haml_dir = options[:js2_haml_dir]
|
75
|
-
config.write_dir = options[:write_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.
|
108
|
-
var classname = klass.
|
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.
|
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::
|
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 =
|
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 = ""
|
@@ -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::
|
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
|
-
|
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
|
+
|