js2 0.0.5 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog +10 -0
- data/Manifest.txt +1 -2
- data/lib/javascript/sel_marker.js2 +10 -0
- data/lib/js2/decorator/cleanser.rb +1 -1
- data/lib/js2/decorator/standard.rb +3 -7
- data/lib/js2/decorator/test.rb +1 -1
- data/lib/js2/process/file_handler.rb +27 -33
- data/lib/js2/process/universe.rb +32 -0
- data/lib/js2/processor.rb +18 -7
- data/lib/js2/test/selenium.rb +1 -3
- data/lib/js2/test/selenium_element.rb +4 -0
- data/lib/js2.rb +1 -1
- data/lib/js2bootstrap.js2 +274 -0
- metadata +3 -4
- data/lib/javascript/bootstrap.js +0 -42
- data/lib/javascript/observer.js2 +0 -59
data/Changelog
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
== 0.0.7 2009-12-23
|
2
|
+
* Added Observable.js
|
3
|
+
* Added JS2.App Class
|
4
|
+
* Added JS2.App.JQuery Class
|
5
|
+
* Added yml support for templating classes for applications
|
6
|
+
* Added compiliations for applications
|
7
|
+
|
8
|
+
== 0.0.6 2009-12-08
|
9
|
+
* removing deprecated classes file
|
10
|
+
|
1
11
|
== 0.0.5 2009-12-04
|
2
12
|
* added bootstrap
|
3
13
|
|
data/Manifest.txt
CHANGED
@@ -10,9 +10,8 @@ Rakefile
|
|
10
10
|
examples/js2.yml
|
11
11
|
examples/test.yml
|
12
12
|
lib/javascript/sel_marker.js2
|
13
|
-
lib/javascript/bootstrap.js
|
14
|
-
lib/javascript/observer.js2
|
15
13
|
lib/javascript/test.js2
|
14
|
+
lib/js2bootstrap.js2
|
16
15
|
lib/js2.rb
|
17
16
|
lib/js2/ast/class_node.rb
|
18
17
|
lib/js2/ast/comment_node.rb
|
@@ -102,6 +102,16 @@ class JS2.SelMarker {
|
|
102
102
|
this.normalized = true;
|
103
103
|
}
|
104
104
|
|
105
|
+
function getRealClassScope (klass) {
|
106
|
+
if (klass.main && klass.main.factoryId) {
|
107
|
+
var namespace = klass.main._klass.replace(/\.\w+$/, '');
|
108
|
+
var classname = klass._klass.match(/\.\w+$/)[0];
|
109
|
+
return namespace + classname;
|
110
|
+
} else {
|
111
|
+
return klass._klass;
|
112
|
+
}
|
113
|
+
}
|
114
|
+
|
105
115
|
private
|
106
116
|
|
107
117
|
function normalizeVal (val) {
|
@@ -12,7 +12,7 @@ class JS2::Decorator::Cleanser
|
|
12
12
|
# TODO foreach:key (var key in hash)
|
13
13
|
#
|
14
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*\)|)
|
15
|
+
if m = str.match(%r|foreach\s*(:([^\s]))?\s*\(\s*var\s+([^\s\:]+)\s*(:?([^\s]+))?\s+in\s+([^\s]+)\s*\)|)
|
16
16
|
type = m[2]
|
17
17
|
decl = m[3]
|
18
18
|
it = m[5] || ('it_' + (@@enum += 1).to_s)
|
@@ -14,14 +14,10 @@ class JS2::Decorator::Standard
|
|
14
14
|
return str
|
15
15
|
end
|
16
16
|
|
17
|
-
def draw_bootstrap ()
|
18
|
-
return File.read(File.dirname(__FILE__) + '/../../javascript/bootstrap.js')
|
19
|
-
end
|
20
|
-
|
21
17
|
private
|
22
18
|
|
23
19
|
def draw_method (node)
|
24
|
-
return %{
|
20
|
+
return %{
|
25
21
|
#{node.name}:function #{node.text}}
|
26
22
|
end
|
27
23
|
|
@@ -51,7 +47,7 @@ class JS2::Decorator::Standard
|
|
51
47
|
return draw_comment(node)
|
52
48
|
end
|
53
49
|
|
54
|
-
return %{
|
50
|
+
return %{
|
55
51
|
#{node.name}:#{node.text}}
|
56
52
|
end
|
57
53
|
|
@@ -89,7 +85,7 @@ class JS2::Decorator::Standard
|
|
89
85
|
end
|
90
86
|
|
91
87
|
return <<-END
|
92
|
-
|
88
|
+
|
93
89
|
JS2.createClass("#{node.name}");
|
94
90
|
#{node.name}.prototype={#{meta}
|
95
91
|
#{member_js.join(",\n") }
|
data/lib/js2/decorator/test.rb
CHANGED
@@ -4,6 +4,7 @@ class JS2::Process::FileHandler
|
|
4
4
|
@write_dir = params[:write_dir]
|
5
5
|
@haml_dir = params[:haml_dir]
|
6
6
|
@view_dir = params[:view_dir]
|
7
|
+
@yml_dir = params[:read_dir]
|
7
8
|
|
8
9
|
@mtimes = Hash.new
|
9
10
|
end
|
@@ -13,10 +14,6 @@ class JS2::Process::FileHandler
|
|
13
14
|
return @write_dir + '/classes.js'
|
14
15
|
end
|
15
16
|
|
16
|
-
def bootstrap_file
|
17
|
-
return @write_dir + '/js2bootstrap.js'
|
18
|
-
end
|
19
|
-
|
20
17
|
def get_view_files
|
21
18
|
return [] unless @view_dir
|
22
19
|
return Dir.glob(@view_dir + '/**/*.haml')
|
@@ -27,56 +24,53 @@ class JS2::Process::FileHandler
|
|
27
24
|
return Dir.glob(@haml_dir + '/**/*/*.js2.haml') + Dir.glob(@haml_dir + '/*.js2.haml')
|
28
25
|
end
|
29
26
|
|
27
|
+
def get_yml_files
|
28
|
+
return [] unless @haml_dir
|
29
|
+
return Dir.glob(@haml_dir + '/**/*/*.js2.yml') + Dir.glob(@haml_dir + '/*.js2.yml')
|
30
|
+
end
|
31
|
+
|
30
32
|
def get_files
|
31
|
-
return Dir.glob(@read_dir + '/**/*/*.js2') + Dir.glob(@read_dir + '/*.js2')
|
33
|
+
return Dir.glob(@read_dir + '/**/*/*.js2') + Dir.glob(@read_dir + '/*.js2')
|
32
34
|
end
|
33
35
|
|
34
36
|
def write_file (filename, str)
|
35
|
-
to_write =
|
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
|
+
|
36
46
|
FileUtils.mkpath(File.dirname(to_write))
|
37
47
|
File.open(to_write, 'w') do |f|
|
38
48
|
f << str
|
39
49
|
end
|
40
50
|
end
|
41
51
|
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
52
|
+
def write_compilation (filename, compilation)
|
53
|
+
to_write = filename.sub(/^#{@read_dir}/, @write_dir).sub(/\.js2$/, '.comp.js')
|
54
|
+
str = ""
|
55
|
+
|
56
|
+
compilation.each do |f|
|
57
|
+
read_file = f.sub(/^#{@read_dir}/, @write_dir).sub(/\.js2$/, '.js')
|
58
|
+
str << File.read(read_file) + "\n"
|
47
59
|
end
|
48
|
-
end
|
49
60
|
|
50
|
-
|
51
|
-
|
52
|
-
File.open(bootstrap_file, 'w') do |f|
|
61
|
+
FileUtils.mkpath(File.dirname(to_write))
|
62
|
+
File.open(to_write, 'w') do |f|
|
53
63
|
f << str
|
54
64
|
end
|
55
65
|
end
|
56
66
|
|
57
|
-
|
58
67
|
def need_update!
|
59
68
|
ret = false
|
60
69
|
did = Hash.new
|
61
|
-
self.get_files.each do |file|
|
62
|
-
mtime = File.mtime(file)
|
63
|
-
if @mtimes[file] != mtime
|
64
|
-
@mtimes[file] = mtime
|
65
|
-
ret = true
|
66
|
-
end
|
67
|
-
did[file] = mtime
|
68
|
-
end
|
69
70
|
|
70
|
-
self.get_haml_files
|
71
|
-
mtime = File.mtime(file)
|
72
|
-
if @mtimes[file] != mtime
|
73
|
-
@mtimes[file] = mtime
|
74
|
-
ret = true
|
75
|
-
end
|
76
|
-
did[file] = mtime
|
77
|
-
end
|
71
|
+
files = self.get_files + self.get_haml_files + self.get_yml_files
|
78
72
|
|
79
|
-
|
73
|
+
files.each do |file|
|
80
74
|
mtime = File.mtime(file)
|
81
75
|
if @mtimes[file] != mtime
|
82
76
|
@mtimes[file] = mtime
|
data/lib/js2/process/universe.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
class JS2::Process::Universe
|
2
|
+
attr_accessor :compilations
|
3
|
+
|
2
4
|
def initialize
|
3
5
|
@class_lookup = Hash.new
|
4
6
|
@haml_lookup = Hash.new
|
5
7
|
@node_containers = Array.new
|
6
8
|
@mod_lookup = Hash.new
|
9
|
+
|
10
|
+
@compilations = Hash.new
|
7
11
|
end
|
8
12
|
|
9
13
|
def add_nodes (nodes)
|
@@ -18,6 +22,34 @@ class JS2::Process::Universe
|
|
18
22
|
@node_containers << nodes
|
19
23
|
end
|
20
24
|
|
25
|
+
def add_yml (yml, filename)
|
26
|
+
yml.each_pair do |klass_name, config|
|
27
|
+
template = config['template']
|
28
|
+
next unless template
|
29
|
+
|
30
|
+
str = " function getTemplate () { return #{template.to_json} }"
|
31
|
+
node = JS2::AST::MethodNode.new(filename, 0, str)
|
32
|
+
k = @class_lookup[klass_name]
|
33
|
+
k.members << node
|
34
|
+
k.mem_hash['getTemplate'] = node
|
35
|
+
|
36
|
+
if config['make_compilation']
|
37
|
+
compilation = [ k.filename ]
|
38
|
+
|
39
|
+
if config['include']
|
40
|
+
compilation += config['include'].collect { |name| @class_lookup[name].filename }
|
41
|
+
end
|
42
|
+
|
43
|
+
template.each do |t|
|
44
|
+
klass_name = t['class']
|
45
|
+
klass = @class_lookup[klass_name]
|
46
|
+
compilation << klass.filename
|
47
|
+
end
|
48
|
+
@compilations[k.filename] = compilation
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
21
53
|
def node_containers
|
22
54
|
return @node_containers
|
23
55
|
end
|
data/lib/js2/processor.rb
CHANGED
@@ -106,19 +106,31 @@ class JS2::Processor
|
|
106
106
|
end
|
107
107
|
|
108
108
|
def write_files
|
109
|
-
universe = JS2::Process::Universe.new()
|
110
|
-
|
111
109
|
parser ||= JS2::Parser::Fast.new()
|
112
110
|
haml_parser ||= JS2::Parser::Haml.new(@haml_engine)
|
113
111
|
universe = JS2::Process::Universe.new
|
114
112
|
|
115
113
|
decorator = @decorator_klass.new
|
116
114
|
|
115
|
+
bootstrap_file = File.dirname(__FILE__) + "/../js2bootstrap.js2"
|
116
|
+
bootstrap_nodes = parser.parse(bootstrap_file)
|
117
|
+
universe.add_nodes(bootstrap_nodes)
|
118
|
+
|
117
119
|
@fh.get_files.each do |filename|
|
118
120
|
nodes = parser.parse(filename)
|
119
121
|
universe.add_nodes(nodes)
|
120
122
|
end
|
121
123
|
|
124
|
+
@fh.get_yml_files.each do |filename|
|
125
|
+
begin
|
126
|
+
yml = YAML.load_file(filename)
|
127
|
+
universe.add_yml(yml, filename)
|
128
|
+
rescue Exception => e
|
129
|
+
puts "YAML Error in #{filename}:"
|
130
|
+
puts e.to_s
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
122
134
|
@fh.get_haml_files.each do |filename|
|
123
135
|
hash = haml_parser.parse(filename)
|
124
136
|
universe.add_haml_hash(hash)
|
@@ -131,11 +143,6 @@ class JS2::Processor
|
|
131
143
|
@fh.write_file(nc.filename, str)
|
132
144
|
end
|
133
145
|
|
134
|
-
str = decorator.draw_bootstrap()
|
135
|
-
|
136
|
-
@fh.write_class_file(str)
|
137
|
-
@fh.write_bootstrap_file(str)
|
138
|
-
|
139
146
|
if @test_mode
|
140
147
|
decorator.write_references(@reference_dir)
|
141
148
|
end
|
@@ -147,6 +154,10 @@ class JS2::Processor
|
|
147
154
|
decorator.draw_nodes(nodes)
|
148
155
|
decorator.write_references(@reference_dir)
|
149
156
|
end
|
157
|
+
|
158
|
+
universe.compilations.each_pair do |filename, hash|
|
159
|
+
@fh.write_compilation(filename, hash)
|
160
|
+
end
|
150
161
|
end
|
151
162
|
|
152
163
|
end
|
data/lib/js2/test/selenium.rb
CHANGED
@@ -27,11 +27,10 @@ class JS2::Test::Selenium < Selenium::Client::Driver
|
|
27
27
|
|
28
28
|
reference_dir = config['reference_dir'] || './spec/js2refs'
|
29
29
|
config = config['selenium']
|
30
|
-
|
31
30
|
ret = self.new( :host => config['host'] || 'localhost',
|
32
31
|
:port => config['port'] || 4444,
|
33
32
|
:browser => config['browser'] || '*firefox',
|
34
|
-
:url => config['url'] || 'http://
|
33
|
+
:url => config['url'] || 'http://www.factual.com',
|
35
34
|
|
36
35
|
:timeout_in_second => config[:timeout] || 60,
|
37
36
|
:highlight_located_element => config['highlight'] || false,
|
@@ -40,7 +39,6 @@ class JS2::Test::Selenium < Selenium::Client::Driver
|
|
40
39
|
# hack to get an instance var in.
|
41
40
|
ret.reference_dir = reference_dir
|
42
41
|
ret.child_selector = nil
|
43
|
-
|
44
42
|
return ret
|
45
43
|
end
|
46
44
|
end
|
data/lib/js2.rb
CHANGED
@@ -0,0 +1,274 @@
|
|
1
|
+
var JS2 = {};
|
2
|
+
JS2.createClass = function (name) {
|
3
|
+
var splitName = name.split('.');
|
4
|
+
var namespace = window;
|
5
|
+
while (splitName.length) {
|
6
|
+
var subName = splitName.shift();
|
7
|
+
if (! namespace[subName]) {
|
8
|
+
namespace =
|
9
|
+
namespace[subName] =
|
10
|
+
function () { if (this.initialize) this.initialize.apply(this, arguments) };
|
11
|
+
} else {
|
12
|
+
namespace = namespace[subName];
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
JS2.getClass = function (name) {
|
18
|
+
var splitName = name.split('.');
|
19
|
+
var namespace = window;
|
20
|
+
|
21
|
+
while (splitName.length) {
|
22
|
+
var subName = splitName.shift();
|
23
|
+
if (namespace[subName]) {
|
24
|
+
namespace = namespace[subName];
|
25
|
+
} else {
|
26
|
+
return null;
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
return namespace;
|
31
|
+
}
|
32
|
+
|
33
|
+
function _super () {
|
34
|
+
var method = arguments.callee.caller._super;
|
35
|
+
if (! method) return;
|
36
|
+
var self = arguments[0];
|
37
|
+
var args = [];
|
38
|
+
for (var i=1,len=arguments.length;i<len;i++) {
|
39
|
+
args.push(arguments[i]);
|
40
|
+
}
|
41
|
+
return method.apply(self, args);
|
42
|
+
}
|
43
|
+
|
44
|
+
|
45
|
+
class JS2.Observer {
|
46
|
+
function initialize (owner) {
|
47
|
+
this.lookupBefore = {};
|
48
|
+
this.lookupAfter = {};
|
49
|
+
|
50
|
+
this.replaced = {};
|
51
|
+
this.replacedValues = {};
|
52
|
+
}
|
53
|
+
|
54
|
+
function replaceFunction (owner, eventName) {
|
55
|
+
if (this.replaced[eventName]) return;
|
56
|
+
|
57
|
+
this.replacedValues[eventName] = owner[eventName];
|
58
|
+
this.replaced[eventName] = true;
|
59
|
+
owner[eventName] = this.getTrigger(eventName);
|
60
|
+
}
|
61
|
+
|
62
|
+
function trigger (owner, eventName, args) {
|
63
|
+
var beforeChain = this.lookupBefore[eventName];
|
64
|
+
if (beforeChain) this.executeChain(beforeChain, args);
|
65
|
+
|
66
|
+
var funct = this.replacedValues[eventName];
|
67
|
+
if (funct) funct.apply(owner, args);
|
68
|
+
|
69
|
+
var afterChain = this.lookupAfter[eventName];
|
70
|
+
if (afterChain) this.executeChain(afterChain, args);
|
71
|
+
}
|
72
|
+
|
73
|
+
function addListener (eventName, funct, before) {
|
74
|
+
var lookup = before ? this.lookupBefore : this.lookupAfter;
|
75
|
+
|
76
|
+
var chain = lookup[eventName] = lookup[eventName] || [];
|
77
|
+
chain.push(funct);
|
78
|
+
}
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
function getTrigger (eventName) {
|
83
|
+
return function () { this.__observer.trigger(this, eventName, arguments); };
|
84
|
+
}
|
85
|
+
|
86
|
+
function executeChain (chain, args) {
|
87
|
+
foreach (var f:i in chain) if (f) f.apply(this, args);
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
module JS2.Observable {
|
92
|
+
function addListener (eventName, funct, before) {
|
93
|
+
if (! this.__observer) this.__observer = new Factual.Core.Observer();
|
94
|
+
|
95
|
+
var id = this.__observer.addListener(eventName, funct, before);
|
96
|
+
this.__observer.replaceFunction(this, eventName);
|
97
|
+
return id;
|
98
|
+
}
|
99
|
+
|
100
|
+
function triggerEvent (eventName, args) {
|
101
|
+
if (this.__observer) this.__observer.trigger(this, eventName, args);
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
|
106
|
+
class JS2.App.Notifier {
|
107
|
+
var autoInc = 1;
|
108
|
+
|
109
|
+
function initialize () {
|
110
|
+
this.chains = {};
|
111
|
+
this.autoInc = 1;
|
112
|
+
this.id = this['class'].prototype.autoInc;
|
113
|
+
this['class'].prototype.autoInc++;
|
114
|
+
}
|
115
|
+
|
116
|
+
function register (comp) {
|
117
|
+
if (! comp.__notifier_ids) {
|
118
|
+
comp.__notifier_ids = {};
|
119
|
+
}
|
120
|
+
|
121
|
+
if (! comp.__notifier_ids[this.id]) {
|
122
|
+
comp.__notifier_ids[this.id] = this.autoInc;
|
123
|
+
this.autoInc++;
|
124
|
+
}
|
125
|
+
|
126
|
+
for (var key in comp) {
|
127
|
+
if (key.indexOf('e_') == 0) {
|
128
|
+
var eventType = key.substr(2);
|
129
|
+
if (! this.chains[eventType]) this.chains[eventType] = [];
|
130
|
+
this.chains[eventType].push([ comp, comp[key] ]);
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
comp.notify = curry with (this) {
|
135
|
+
self.notify.apply(self, arguments);
|
136
|
+
};
|
137
|
+
}
|
138
|
+
|
139
|
+
function remove (comp) {
|
140
|
+
var id = comp.__notifier_id;
|
141
|
+
for (var key in this.chains) {
|
142
|
+
var newChain = [];
|
143
|
+
foreach (var ele:j in chain) {
|
144
|
+
if (ele[0].__notifier_id[this.id] != id) {
|
145
|
+
newChain.push(ele);
|
146
|
+
}
|
147
|
+
}
|
148
|
+
|
149
|
+
this.chains[key] = newChain;
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
function registerListener (listener) {
|
154
|
+
for (var key in listener) {
|
155
|
+
var funct = listener[key];
|
156
|
+
if (typeof funct != 'function') continue;
|
157
|
+
if (! this.chains[key]) this.chains[key] = [];
|
158
|
+
this.chains[key].push([ listener, funct ]);
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
function notify () {
|
163
|
+
var eventType = arguments[0];
|
164
|
+
var args;
|
165
|
+
|
166
|
+
// optimize for 1 argument
|
167
|
+
if (arguments.length == 2) {
|
168
|
+
args = [ arguments[1] ];
|
169
|
+
} else {
|
170
|
+
args = [];
|
171
|
+
for (var i=1; i<=arguments.length; i++) args.push(arguments[i]);
|
172
|
+
}
|
173
|
+
|
174
|
+
var chain = this.chains[eventType];
|
175
|
+
if (chain) {
|
176
|
+
for (var i=0,pair; pair=chain[i++];) {
|
177
|
+
pair[1].apply(pair[0], args);
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
181
|
+
}
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
class JS2.App {
|
186
|
+
include JS2.Observer;
|
187
|
+
|
188
|
+
function start () {
|
189
|
+
// hack to get notifier
|
190
|
+
this.getNotifier();
|
191
|
+
|
192
|
+
this.build();
|
193
|
+
this.notify('initHTML');
|
194
|
+
this.notify('registerEvents');
|
195
|
+
this.notify('finalize');
|
196
|
+
}
|
197
|
+
|
198
|
+
|
199
|
+
function register (comp) {
|
200
|
+
this.getNotifier().register(comp);
|
201
|
+
}
|
202
|
+
|
203
|
+
function getNotifier () {
|
204
|
+
if (! this._notifier) {
|
205
|
+
this._notifier = new JS2.App.Notifier();
|
206
|
+
this._notifier.register(this);
|
207
|
+
}
|
208
|
+
|
209
|
+
return this._notifier;
|
210
|
+
}
|
211
|
+
|
212
|
+
function build () {
|
213
|
+
var components = {};
|
214
|
+
var template = this.getTemplate();
|
215
|
+
|
216
|
+
// instantiate all components
|
217
|
+
foreach (var config:i in template) {
|
218
|
+
if (!config['class']) alert("Invalid class defined for " + name + ':' + config['class']);
|
219
|
+
var klass = JS2.getClass(config['class']);
|
220
|
+
|
221
|
+
components[config.name] = new klass();
|
222
|
+
this.register(components[config.name]);
|
223
|
+
}
|
224
|
+
|
225
|
+
foreach (var config:i in template) {
|
226
|
+
var name = config.name;
|
227
|
+
var comp = components[name];
|
228
|
+
|
229
|
+
// inject set dependencies as an array
|
230
|
+
if (config.dependencies instanceof Array) {
|
231
|
+
foreach (var dep:j in config.dependencies) {
|
232
|
+
comp[dep] = components[dep];
|
233
|
+
}
|
234
|
+
}
|
235
|
+
|
236
|
+
// as a hash... for use when nickname is not the dependency name
|
237
|
+
else if (config.dependencies instanceof Object) {
|
238
|
+
for (var key in config.dependencies) {
|
239
|
+
comp[key] = components[config.dependencies[key]];
|
240
|
+
}
|
241
|
+
}
|
242
|
+
}
|
243
|
+
|
244
|
+
this.notify('initBaseHTML');
|
245
|
+
|
246
|
+
// handle selectors as root elements
|
247
|
+
foreach (var config:i in template) {
|
248
|
+
var name = config.name;
|
249
|
+
var comp = components[name];
|
250
|
+
|
251
|
+
if (config.selector) comp.$root = this.htmlSelect(this.$root, config.selector);
|
252
|
+
if (config.globalSelector) comp.$root = this.htmlSelect(config.globalSelector);
|
253
|
+
}
|
254
|
+
}
|
255
|
+
|
256
|
+
function htmlSelect (root, text) {
|
257
|
+
alert('html selector not implemented');
|
258
|
+
}
|
259
|
+
|
260
|
+
function getTemplate () {
|
261
|
+
return {};
|
262
|
+
}
|
263
|
+
}
|
264
|
+
|
265
|
+
class JS2.App.JQuery extends JS2.App {
|
266
|
+
function htmlSelect ($root, text) {
|
267
|
+
if (text) {
|
268
|
+
return $root.find(text);
|
269
|
+
} else {
|
270
|
+
return $(root);
|
271
|
+
}
|
272
|
+
}
|
273
|
+
}
|
274
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: js2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Su
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-12-
|
12
|
+
date: 2009-12-23 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -68,9 +68,8 @@ files:
|
|
68
68
|
- examples/js2.yml
|
69
69
|
- examples/test.yml
|
70
70
|
- lib/javascript/sel_marker.js2
|
71
|
-
- lib/javascript/bootstrap.js
|
72
|
-
- lib/javascript/observer.js2
|
73
71
|
- lib/javascript/test.js2
|
72
|
+
- lib/js2bootstrap.js2
|
74
73
|
- lib/js2.rb
|
75
74
|
- lib/js2/ast/class_node.rb
|
76
75
|
- lib/js2/ast/comment_node.rb
|
data/lib/javascript/bootstrap.js
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
var JS2 = {};
|
2
|
-
JS2.createClass = function (name) {
|
3
|
-
var splitName = name.split('.');
|
4
|
-
var namespace = window;
|
5
|
-
while (splitName.length) {
|
6
|
-
var subName = splitName.shift();
|
7
|
-
if (! namespace[subName]) {
|
8
|
-
namespace =
|
9
|
-
namespace[subName] =
|
10
|
-
function () { if (this.initialize) this.initialize.apply(this, arguments) };
|
11
|
-
} else {
|
12
|
-
namespace = namespace[subName];
|
13
|
-
}
|
14
|
-
}
|
15
|
-
}
|
16
|
-
|
17
|
-
JS2.getClass = function (name) {
|
18
|
-
var splitName = name.split('.');
|
19
|
-
var namespace = window;
|
20
|
-
|
21
|
-
while (splitName.length) {
|
22
|
-
var subName = splitName.shift();
|
23
|
-
if (namespace[subName]) {
|
24
|
-
namespace = namespace[subName];
|
25
|
-
} else {
|
26
|
-
return null;
|
27
|
-
}
|
28
|
-
}
|
29
|
-
|
30
|
-
return namespace;
|
31
|
-
}
|
32
|
-
|
33
|
-
function _super () {
|
34
|
-
var method = arguments.callee.caller._super;
|
35
|
-
if (! method) return;
|
36
|
-
var self = arguments[0];
|
37
|
-
var args = [];
|
38
|
-
for (var i=1,len=arguments.length;i<len;i++) {
|
39
|
-
args.push(arguments[i]);
|
40
|
-
}
|
41
|
-
return method.apply(self, args);
|
42
|
-
}
|
data/lib/javascript/observer.js2
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
class JS2.Observer {
|
2
|
-
function initialize (owner) {
|
3
|
-
this.lookupBefore = {};
|
4
|
-
this.lookupAfter = {};
|
5
|
-
|
6
|
-
this.replaced = {};
|
7
|
-
this.replacedValues = {};
|
8
|
-
}
|
9
|
-
|
10
|
-
function replaceFunction (owner, eventName) {
|
11
|
-
if (this.replaced[eventName]) return;
|
12
|
-
|
13
|
-
this.replacedValues[eventName] = owner[eventName];
|
14
|
-
this.replaced[eventName] = true;
|
15
|
-
owner[eventName] = this.getTrigger(eventName);
|
16
|
-
}
|
17
|
-
|
18
|
-
function trigger (owner, eventName, args) {
|
19
|
-
var beforeChain = this.lookupBefore[eventName];
|
20
|
-
if (beforeChain) this.executeChain(beforeChain, args);
|
21
|
-
|
22
|
-
var funct = this.replacedValues[eventName];
|
23
|
-
if (funct) funct.apply(owner, args);
|
24
|
-
|
25
|
-
var afterChain = this.lookupAfter[eventName];
|
26
|
-
if (afterChain) this.executeChain(afterChain, args);
|
27
|
-
}
|
28
|
-
|
29
|
-
function addListener (eventName, funct, before) {
|
30
|
-
var lookup = before ? this.lookupBefore : this.lookupAfter;
|
31
|
-
|
32
|
-
var chain = lookup[eventName] = lookup[eventName] || [];
|
33
|
-
chain.push(funct);
|
34
|
-
}
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
function getTrigger (eventName) {
|
39
|
-
return function () { this.__observer.trigger(this, eventName, arguments); };
|
40
|
-
}
|
41
|
-
|
42
|
-
function executeChain (chain, args) {
|
43
|
-
foreach (var f:i in chain) if (f) f.apply(this, args);
|
44
|
-
}
|
45
|
-
}
|
46
|
-
|
47
|
-
module JS2.Observable {
|
48
|
-
function addListener (eventName, funct, before) {
|
49
|
-
if (! this.__observer) this.__observer = new Factual.Core.Observer();
|
50
|
-
|
51
|
-
var id = this.__observer.addListener(eventName, funct, before);
|
52
|
-
this.__observer.replaceFunction(this, eventName);
|
53
|
-
return id;
|
54
|
-
}
|
55
|
-
|
56
|
-
function triggerEvent (eventName, args) {
|
57
|
-
if (this.__observer) this.__observer.trigger(this, eventName, args);
|
58
|
-
}
|
59
|
-
}
|