js2 0.0.10 → 0.1.1
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.
- data/Manifest +42 -0
- data/README.md +65 -0
- data/Rakefile +19 -35
- data/bin/js2 +80 -66
- data/config/js2.yml +2 -0
- data/js2.gemspec +33 -0
- data/lib/js2/{haml_parser.rb → parser/haml.rb} +2 -2
- data/lib/js2/{haml_engine.rb → parser/haml_engine.rb} +1 -1
- data/lib/js2/parser/lexer.rb +37 -0
- data/lib/js2/{parser.rb → parser/tokenizer.rb} +157 -143
- data/lib/js2/{replace.rb → ragel/helper.rb} +16 -5
- data/lib/js2/ragel/tokenizer.rl +561 -0
- data/lib/js2/{tokenizer.rl.erb → ragel/tokenizer.rl.erb} +12 -19
- data/lib/js2/standard/factory.rb +289 -0
- data/lib/js2/standard/node.rb +75 -0
- data/lib/js2/util/compilation.rb +77 -0
- data/lib/js2/util/config.rb +84 -0
- data/lib/js2/util/exec.rb +34 -0
- data/lib/js2/util/file_handler.rb +73 -0
- data/lib/js2/{js2bootstrap.js2 → util/js2bootstrap.js2} +12 -68
- data/lib/js2/util/processor.rb +88 -0
- data/lib/js2/util/rdoc.rb +35 -0
- data/lib/js2/{sel_decorator.rb → util/sel_decorator.rb} +11 -1
- data/lib/js2.rb +22 -45
- data/test/compiled/bar.js +3 -0
- data/test/compiled/basic.comp.js +31 -0
- data/test/compiled/basic.js +27 -0
- data/test/compiled/foo.js +3 -0
- data/test/fixtures/bar.js2 +3 -0
- data/test/fixtures/basic.js2 +27 -0
- data/test/fixtures/basic.js2.haml +4 -0
- data/test/fixtures/basic.js2.yml +5 -0
- data/test/fixtures/curry.js2 +5 -0
- data/test/fixtures/foo.js2 +3 -0
- data/test/fixtures/member.js2 +14 -0
- data/test/fixtures/private.js2 +5 -0
- data/test/fixtures/property.js2 +4 -0
- data/test/test_helper.rb +25 -0
- data/test/test_js2.rb +43 -0
- data/wiki/features.md +106 -0
- data/wiki/installation.md +53 -0
- metadata +89 -83
- data/Changelog +0 -33
- data/History.txt +0 -4
- data/Manifest.txt +0 -35
- data/PostInstall.txt +0 -7
- data/README +0 -69
- data/README.rdoc +0 -69
- data/README.txt +0 -69
- data/examples/js2.yml +0 -8
- data/examples/test.yml +0 -5
- data/lib/javascript/sel_marker.js2 +0 -150
- data/lib/javascript/test.js2 +0 -73
- data/lib/js2/config.rb +0 -39
- data/lib/js2/daemon.rb +0 -35
- data/lib/js2/file_handler.rb +0 -91
- data/lib/js2/foo.js2.haml +0 -3
- data/lib/js2/js2.js +0 -110
- data/lib/js2/processor.rb +0 -112
- data/lib/js2/test/selenium.rb +0 -119
- data/lib/js2/test/selenium_element.rb +0 -234
- data/lib/js2/test/selenium_helper.rb +0 -27
- data/lib/js2/tree.rb +0 -351
- data/lib/js2/universe.rb +0 -123
- data/lib/tasks/js2.rake +0 -9
- data/website/index.txt +0 -86
- /data/{LICENSE → lib/js2/standard/class_node.rb} +0 -0
data/lib/js2/test/selenium.rb
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
begin
|
|
2
|
-
require 'rubygems'
|
|
3
|
-
gem "selenium-client", ">=1.2.16"
|
|
4
|
-
require "selenium/client"
|
|
5
|
-
require "yaml"
|
|
6
|
-
require "json"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class JS2::Test::Selenium < Selenium::Client::Driver
|
|
10
|
-
attr_accessor :reference_dir, :child_selector
|
|
11
|
-
|
|
12
|
-
RESET_SEL_MARKER = "if (window.JS2) { window.USE_SEL_MARKER = window.JS2.SEL_MARKER; }"
|
|
13
|
-
|
|
14
|
-
class << self
|
|
15
|
-
|
|
16
|
-
def logger
|
|
17
|
-
return @logger || nil
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def logger= (a_logger)
|
|
21
|
-
@logger = a_logger
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def connect (config_file, env = nil)
|
|
25
|
-
config = YAML.load_file(config_file)
|
|
26
|
-
config = config[env] if env
|
|
27
|
-
|
|
28
|
-
reference_dir = config['reference_dir'] || './spec/js2refs'
|
|
29
|
-
config = config['selenium']
|
|
30
|
-
ret = self.new( :host => config['host'] || 'localhost',
|
|
31
|
-
:port => config['port'] || 4444,
|
|
32
|
-
:browser => config['browser'] || '*firefox',
|
|
33
|
-
:url => config['url'] || 'http://www.factual.com',
|
|
34
|
-
|
|
35
|
-
:timeout_in_second => config[:timeout] || 60,
|
|
36
|
-
:highlight_located_element => config['highlight'] || false,
|
|
37
|
-
:javascript_framework => config['framework'] || 'jquery' )
|
|
38
|
-
|
|
39
|
-
# hack to get an instance var in.
|
|
40
|
-
ret.reference_dir = reference_dir
|
|
41
|
-
ret.child_selector = nil
|
|
42
|
-
return ret
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def get_sel_markers ()
|
|
47
|
-
json = self.execute("JS2.SEL_MARKER.toJson()")
|
|
48
|
-
struct = JSON.parse(json)
|
|
49
|
-
puts YAML::dump(struct)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def open!(uri)
|
|
53
|
-
ret = self.open(uri)
|
|
54
|
-
self.wait_for_page
|
|
55
|
-
self.set_sel_marker!
|
|
56
|
-
return ret
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def execute (js)
|
|
60
|
-
puts js
|
|
61
|
-
return self.js_eval("window.eval(#{js.to_json});")
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def wait_for_html(html, timeout=15000)
|
|
65
|
-
js = %{window.document.body.innerHTML.toLowerCase().replace(/[\"\']/g, '').indexOf(#{html.to_json.downcase}) >= 0;}
|
|
66
|
-
begin
|
|
67
|
-
self.wait_for_condition(js, timeout)
|
|
68
|
-
return true
|
|
69
|
-
rescue Selenium::CommandError
|
|
70
|
-
return false
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def uri
|
|
75
|
-
return self.location.sub(%r|^https?://(.*)?/|, '/')
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def get_helper (klass_name)
|
|
79
|
-
klass = klass_name
|
|
80
|
-
ref_file = %|#{@reference_dir}/#{klass_name}.yml|
|
|
81
|
-
lookup = if File.exist? ref_file
|
|
82
|
-
YAML.load_file(ref_file)
|
|
83
|
-
else
|
|
84
|
-
Hash.new
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
return JS2::Test::SeleniumHelper.new(klass_name, lookup, self)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def child_scope (selector)
|
|
91
|
-
js = "if (window.JS2) { window.USE_SEL_MARKER = window.JS2.SEL_MARKER."
|
|
92
|
-
js << selector.split('>').collect { |s| "children.#{s}" }.join('.')
|
|
93
|
-
js << '};'
|
|
94
|
-
@keep_selector = js
|
|
95
|
-
self.set_sel_marker!
|
|
96
|
-
yield()
|
|
97
|
-
@keep_selector = nil
|
|
98
|
-
self.set_sel_marker!
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def set_sel_marker!
|
|
102
|
-
self.execute(@keep_selector || RESET_SEL_MARKER)
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def scope(klass_name)
|
|
106
|
-
self.set_sel_marker!
|
|
107
|
-
helper = get_helper(klass_name)
|
|
108
|
-
if block_given?
|
|
109
|
-
yield(helper)
|
|
110
|
-
else
|
|
111
|
-
return helper
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
rescue Exception => e
|
|
118
|
-
warn "No support for selenium"
|
|
119
|
-
end
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
class JS2::Test::SeleniumElement
|
|
2
|
-
attr_accessor :options
|
|
3
|
-
QUICK_WAIT_FOR = 5
|
|
4
|
-
AJAX_TIME_OUT = 60
|
|
5
|
-
def initialize (sel, klass, key, selector = nil)
|
|
6
|
-
@sel = sel
|
|
7
|
-
@key = key
|
|
8
|
-
@klass = klass
|
|
9
|
-
@selector = selector
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def log (str)
|
|
13
|
-
if JS2::Test::Selenium.logger
|
|
14
|
-
JS2::Test::Selenium.logger.info(str)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def raw
|
|
19
|
-
ret = self.class.new(@sel, @klass, @key, @selector)
|
|
20
|
-
ret.options[:raw] = true
|
|
21
|
-
return ret
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def check
|
|
25
|
-
return execute('checked=true')
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def uncheck
|
|
29
|
-
return execute('checked=false')
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def checked?
|
|
33
|
-
return execute('checked')
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def execute (str)
|
|
37
|
-
wait_for_ajax
|
|
38
|
-
return @sel.execute(get_js_locator() + '.' + str)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def visible?(wait_for = nil)
|
|
42
|
-
return self.check_attribute(':visible', true, wait_for);
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def sel_visible?()
|
|
46
|
-
return @sel.visible?(get_ele())
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def hidden?(wait_for = nil)
|
|
50
|
-
return self.check_attribute(':visible', false, wait_for);
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def find (str, idx = 0)
|
|
54
|
-
selector = "window.$(#{get_js_locator()}).find(#{str.to_json})[#{idx}]"
|
|
55
|
-
return self.class.new(@sel, @klass, @key, selector)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def filter (str, idx = 0)
|
|
59
|
-
selector = "window.$(#{get_js_locator()}).filter(#{str.to_json})[#{idx}]"
|
|
60
|
-
return self.class.new(@sel, @klass, @key, selector)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def get (idx)
|
|
64
|
-
# when jqObjects in //@+
|
|
65
|
-
selector = "#{get_js_locator()}[#{idx}][0]"
|
|
66
|
-
return self.class.new(@sel, @klass, @key, selector)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def [] (idx)
|
|
70
|
-
selector = "#{get_js_locator()}[#{idx}]"
|
|
71
|
-
return self.class.new(@sel, @klass, @key, selector)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def attr (attr)
|
|
75
|
-
get_ele()
|
|
76
|
-
js = %{window.$(#{get_js_locator()}).attr(#{attr.to_json});}
|
|
77
|
-
return @sel.js_eval(js)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def jq_attr (attr)
|
|
81
|
-
return @sel.execute("window.$(#{get_js_locator()}).#{attr};")
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def check_attribute (attr, val, wait_for = nil)
|
|
85
|
-
wait_for ||= QUICK_WAIT_FOR
|
|
86
|
-
get_ele()
|
|
87
|
-
js = %{window.$(#{get_js_locator()}).is('#{attr}') == #{val.to_json};}
|
|
88
|
-
begin
|
|
89
|
-
log "Waiting for #{@key}.#{attr} to be #{val.to_json}... Waiting #{wait_for} secs."
|
|
90
|
-
@sel.wait_for_condition(js, wait_for)
|
|
91
|
-
rescue Selenium::CommandError
|
|
92
|
-
return false
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
return true
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def containsp? (str, timeout=QUICK_WAIT_FOR)
|
|
99
|
-
wait_for_ajax
|
|
100
|
-
js = %{window.$(#{get_js_locator()}).html().toLowerCase().replace(/[\"\']/g, '').indexOf(#{str.to_json.downcase}) >= 0;}
|
|
101
|
-
begin
|
|
102
|
-
@sel.wait_for_condition(js, timeout)
|
|
103
|
-
return true
|
|
104
|
-
rescue Selenium::CommandError
|
|
105
|
-
return false
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def contains? (str,timeout=QUICK_WAIT_FOR)
|
|
110
|
-
wait_for_ajax
|
|
111
|
-
js = %{window.$(#{get_js_locator()}).html().indexOf(#{str.to_json}) >= 0;}
|
|
112
|
-
begin
|
|
113
|
-
@sel.wait_for_condition(js, timeout)
|
|
114
|
-
return true
|
|
115
|
-
rescue Selenium::CommandError
|
|
116
|
-
return false
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def click (options = {})
|
|
121
|
-
@sel.click(get_ele(), options)
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
def text
|
|
125
|
-
return @sel.text(get_ele())
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
def get_value
|
|
129
|
-
return @sel.get_value(get_ele())
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
def click! (options = {})
|
|
133
|
-
@sel.click(get_ele(), options)
|
|
134
|
-
@sel.wait_for_page
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
def mouse_up ()
|
|
138
|
-
trigger("LEFT_MOUSE_UP")
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def mouse_down ()
|
|
142
|
-
trigger("LEFT_MOUSE_DOWN")
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def mouse_over
|
|
146
|
-
@sel.mouse_over(get_ele())
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
def mouse_out
|
|
150
|
-
@sel.mouse_out(get_ele())
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
def key_down(value)
|
|
154
|
-
@sel.key_down(get_ele(), value)
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
def type (*params)
|
|
158
|
-
elem = get_ele()
|
|
159
|
-
@sel.type(elem, *params)
|
|
160
|
-
@sel.fire_event(elem, 'blur')
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
def select(params)
|
|
164
|
-
elem = get_ele()
|
|
165
|
-
@sel.select(elem, params)
|
|
166
|
-
@sel.fire_event(elem, 'blur')
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
def html ()
|
|
170
|
-
wait_for_ajax
|
|
171
|
-
js = get_js_locator()
|
|
172
|
-
return @sel.js_eval("#{js}.innerHTML;")
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
private
|
|
176
|
-
|
|
177
|
-
def get_locator
|
|
178
|
-
js = get_js_locator()
|
|
179
|
-
dom_locator = "dom=#{js};"
|
|
180
|
-
return dom_locator
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
def get_ele
|
|
184
|
-
real_locator = get_locator()
|
|
185
|
-
wait_for_ele()
|
|
186
|
-
|
|
187
|
-
return real_locator
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def get_js_locator
|
|
191
|
-
if @selector
|
|
192
|
-
return @selector
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
filtered_locator = @key.to_s
|
|
196
|
-
int = ''
|
|
197
|
-
|
|
198
|
-
if m = filtered_locator.match(/([^\[\]]+)(\[([^\]]*)\])/)
|
|
199
|
-
log "filtered: #{filtered_locator} #{m.inspect}"
|
|
200
|
-
filtered_locator = m[1]
|
|
201
|
-
int = ', ' + m[3] if m[3]
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
funct = 'getVal'
|
|
205
|
-
get_val = "window.USE_SEL_MARKER.#{funct}('#{@klass}', '#{filtered_locator}'#{int})"
|
|
206
|
-
|
|
207
|
-
return get_val
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
def wait_for_ele ()
|
|
211
|
-
real_locator = get_locator
|
|
212
|
-
puts "waiting for #{real_locator}"
|
|
213
|
-
wait_for_ajax
|
|
214
|
-
@sel.wait_for_condition real_locator, QUICK_WAIT_FOR
|
|
215
|
-
puts "found #{real_locator}"
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
def wait_for_ajax
|
|
219
|
-
@sel.wait_for_condition('selenium.browserbot.getCurrentWindow().jQuery.active == 0', AJAX_TIME_OUT)
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
def trigger (event)
|
|
223
|
-
get_ele()
|
|
224
|
-
@sel.execute("window.$(#{get_js_locator}).trigger(JS2.SEL_EVENTS.#{event})")
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
def method_missing (method, *arg)
|
|
228
|
-
if @sel.respond_to?(method)
|
|
229
|
-
return @sel.send(method, get_js_locator, *arg)
|
|
230
|
-
else
|
|
231
|
-
raise "Method missing: #{method}"
|
|
232
|
-
end
|
|
233
|
-
end
|
|
234
|
-
end
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
class JS2::Test::SeleniumHelper
|
|
2
|
-
attr_accessor :klass, :lookup
|
|
3
|
-
|
|
4
|
-
def initialize (klass, lookup, sel)
|
|
5
|
-
@klass = klass
|
|
6
|
-
@lookup = lookup
|
|
7
|
-
@sel = sel
|
|
8
|
-
@all_eles = Hash.new
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def [] (key, tail = nil)
|
|
12
|
-
key = key.to_s
|
|
13
|
-
|
|
14
|
-
return @all_eles[key] if @all_eles[key]
|
|
15
|
-
|
|
16
|
-
# TODO: support inheritence
|
|
17
|
-
#raise "invalid key #{key}" unless @lookup[key]
|
|
18
|
-
|
|
19
|
-
return @all_eles[key] = JS2::Test::SeleniumElement.new(@sel, @klass, key, tail)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def type_form (params = {})
|
|
23
|
-
params.each_pair do |k,v|
|
|
24
|
-
self[k].type(v)
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
data/lib/js2/tree.rb
DELETED
|
@@ -1,351 +0,0 @@
|
|
|
1
|
-
class JS2::Node < Array
|
|
2
|
-
attr_accessor :start_idx, :static
|
|
3
|
-
SEL = JS2::SelDecorator.new
|
|
4
|
-
|
|
5
|
-
def initialize (start_idx, string, static = false)
|
|
6
|
-
@static = static
|
|
7
|
-
@stack = []
|
|
8
|
-
@start_idx = start_idx
|
|
9
|
-
@current_idx = @start_idx
|
|
10
|
-
@string = string
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def set_child (node)
|
|
14
|
-
len = node.start_idx - @current_idx
|
|
15
|
-
if len > 0
|
|
16
|
-
self << @string[@current_idx, len]
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
self << node
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def stop_child (idx)
|
|
24
|
-
@current_idx = idx
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def to_s
|
|
28
|
-
ret = []
|
|
29
|
-
last_idx = self.length - 1
|
|
30
|
-
|
|
31
|
-
self.each_with_index do |s, i|
|
|
32
|
-
if i == 0
|
|
33
|
-
ret << self.first_string(s)
|
|
34
|
-
elsif i == last_idx
|
|
35
|
-
ret << self.last_string(s)
|
|
36
|
-
else
|
|
37
|
-
ret << s.to_s
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
if last_idx == 0
|
|
42
|
-
ret << self.last_string('')
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
return ret.join('')
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def first_string (s)
|
|
49
|
-
return s.to_s
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def last_string (s)
|
|
53
|
-
return s.to_s
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def mark (idx)
|
|
57
|
-
len = idx - @current_idx
|
|
58
|
-
if len > 0
|
|
59
|
-
self << @string[@current_idx, len]
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
@current_idx = idx
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def stop (idx)
|
|
66
|
-
len = idx - @current_idx
|
|
67
|
-
if len > 0
|
|
68
|
-
self << @string[@current_idx, len]
|
|
69
|
-
end
|
|
70
|
-
self.setup!
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def setup!
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def reset
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
class JS2::Stuff < JS2::Node
|
|
81
|
-
def to_s
|
|
82
|
-
str = super
|
|
83
|
-
str = SEL.translate(str, nil, false)
|
|
84
|
-
return str
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
class JS2::Class < JS2::Node
|
|
89
|
-
REGEX = /^(\s*class|module)\s+([\w\.]+)\s+(extends\s+([\w\.]+))?\s*\{(.*)/m
|
|
90
|
-
attr_accessor :name, :extends
|
|
91
|
-
|
|
92
|
-
def setup!
|
|
93
|
-
m = self[0].match(REGEX)
|
|
94
|
-
@name = m[2]
|
|
95
|
-
@extends = m[4]
|
|
96
|
-
@start = m[5]
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def createName
|
|
100
|
-
return 'createClass'
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def first_string (s)
|
|
104
|
-
extends = nil
|
|
105
|
-
if @extends
|
|
106
|
-
extends = "#{@name}.oo('extends', #{@extends});"
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return %|JS2.OO.#{createName}("#{@name}"); #{extends} (function (K,Package) {var self=K; var _super=JS2.OO['super']; #{@start}|
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def last_string (s)
|
|
114
|
-
pkg = @name.split(/\./)
|
|
115
|
-
pkg.pop()
|
|
116
|
-
|
|
117
|
-
if pkg.empty?
|
|
118
|
-
pkg = 'null'
|
|
119
|
-
else
|
|
120
|
-
pkg = pkg.join('.')
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
#pkg = pkg.length > 0 ? pkg : 'null'
|
|
124
|
-
return s.to_s + ")(#{@name}, #{pkg});"
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def to_s
|
|
128
|
-
str = super
|
|
129
|
-
str = SEL.translate(str, @name, true)
|
|
130
|
-
return str
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
class JS2::Property < JS2::Node
|
|
135
|
-
REGEX = /(\s*)property(\s+)([\w+,\s]+\w)(\s*)/
|
|
136
|
-
def setup!
|
|
137
|
-
m = first.match(REGEX)
|
|
138
|
-
@space = m[1]
|
|
139
|
-
@mid_space = m[2]
|
|
140
|
-
@list = m[3].split(/,/).collect { |i| i.strip }
|
|
141
|
-
@end_space = m[4]
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
def to_s
|
|
145
|
-
return %|#{@space}K.oo('property',#{@mid_space}[ #{@list.collect { |i| "'#{i}'" }.join(',')} ]);|
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
class JS2::Accessor < JS2::Node
|
|
150
|
-
REGEX = /(\s*)accessor(\s+)([\w+,\s]+\w)(\s*)/
|
|
151
|
-
def setup!
|
|
152
|
-
m = first.match(REGEX)
|
|
153
|
-
@space = m[1]
|
|
154
|
-
@mid_space = m[2]
|
|
155
|
-
@list = m[3].split(/,/).collect { |i| i.strip }
|
|
156
|
-
@end_space = m[4]
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
def to_s
|
|
160
|
-
return %|#{@space}K.oo('accessor',#{@mid_space}[ #{@list.collect { |i| "'#{i}'" }.join(',')} ]);|
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
class JS2::Foreach < JS2::Node
|
|
167
|
-
# start var iterator array
|
|
168
|
-
REGEX = /(\s*)foreach\s*\(\s*var\s*([\$\w]+)(\s*:\s*([\$\w]))?\s*in\s*([^\s]+)\s*\)/
|
|
169
|
-
attr_accessor :iterator, :item, :array
|
|
170
|
-
@@inc = 0
|
|
171
|
-
|
|
172
|
-
def setup!
|
|
173
|
-
m = first.match(REGEX)
|
|
174
|
-
@start = m[1]
|
|
175
|
-
@item = m[2]
|
|
176
|
-
@iterator = m[4]
|
|
177
|
-
@array = m[5]
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
def first_string (s)
|
|
181
|
-
it = iterator
|
|
182
|
-
|
|
183
|
-
unless iterator
|
|
184
|
-
it = 'it' + @@inc.to_s
|
|
185
|
-
@@inc += 1
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
len = it + '__len'
|
|
189
|
-
arr = it + '__arr'
|
|
190
|
-
|
|
191
|
-
return %(#{@start}for (var #{it}=0,#{@item},#{arr}=#{@array},#{len}=#{arr}.length; (#{@item}=#{arr}[#{it}]) || #{it}<#{len}; #{it}++))
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
def self.reset
|
|
195
|
-
@@inc = 0
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
class JS2::Module < JS2::Class
|
|
201
|
-
def createName
|
|
202
|
-
return 'createModule'
|
|
203
|
-
end
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
class JS2::Private < JS2::Node
|
|
207
|
-
def to_s
|
|
208
|
-
return first.sub(/private/m, '// private')
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
class JS2::Include < JS2::Node
|
|
215
|
-
def first_string (s)
|
|
216
|
-
return s.sub(/include\s*/, "K.oo('include', ").sub(/;$/, ');');
|
|
217
|
-
end
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
class JS2::Member < JS2::Node
|
|
221
|
-
def first_string (s)
|
|
222
|
-
method = 'member'
|
|
223
|
-
|
|
224
|
-
if s.match(/^(\s*)(static)\s*/)
|
|
225
|
-
method = 'staticMember'
|
|
226
|
-
s = s.sub(/static\s*/, '')
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
return s.sub(/var\s*([\$\w]+)/) { "K.oo('#{method}', '" + $1 + "'" }.sub(/;$/, ');').sub(/\s*=/, ', ');
|
|
230
|
-
end
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
class JS2::Curry < JS2::Node
|
|
234
|
-
REGEX = %r|^curry\s*([^\{]*)?\{(.*)$|m
|
|
235
|
-
REGEX_WITH = %r|with\s+\(([^)]*)\)|
|
|
236
|
-
REGEX_ARGS = %r|^\s*\(([^)]*)\)|
|
|
237
|
-
|
|
238
|
-
def setup!
|
|
239
|
-
m = first.match(REGEX)
|
|
240
|
-
@decl = m[1].strip
|
|
241
|
-
@stop = m[2]
|
|
242
|
-
|
|
243
|
-
@args = ''
|
|
244
|
-
@in_scoped = ''
|
|
245
|
-
@scoped = ''
|
|
246
|
-
|
|
247
|
-
if m = @decl.match(REGEX_WITH)
|
|
248
|
-
in_scoped = m[1].split(',').collect { |v| v.strip }
|
|
249
|
-
scoped = in_scoped.collect { |v| v == 'this' ? 'self' : v }
|
|
250
|
-
if in_scoped.length
|
|
251
|
-
@scoped = scoped.join(', ')
|
|
252
|
-
@in_scoped = in_scoped.join(', ')
|
|
253
|
-
end
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
if m = @decl.match(%r|^\s*\(([^)]*)\)|)
|
|
257
|
-
@args = m[1].strip
|
|
258
|
-
end
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
def first_string (s)
|
|
262
|
-
return %|(function (#{@scoped}) { return function (#{@args}) {#{@stop}|
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
def last_string (s)
|
|
266
|
-
return s + %|})(#{@in_scoped})|
|
|
267
|
-
end
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
class JS2::Method < JS2::Node
|
|
271
|
-
REGEX = /^(\s*)(static\s+)?function\s+([\$\w\.]+)\s*\(([^)]*)\)\s*\{(.*)/m
|
|
272
|
-
attr_accessor :name, :args
|
|
273
|
-
|
|
274
|
-
def setup!
|
|
275
|
-
m = self[0].match(REGEX)
|
|
276
|
-
@space = m[1]
|
|
277
|
-
@static = m[2]
|
|
278
|
-
@name = m[3]
|
|
279
|
-
@args = m[4]
|
|
280
|
-
@start = m[5]
|
|
281
|
-
end
|
|
282
|
-
|
|
283
|
-
def first_string (s)
|
|
284
|
-
m = static ? 'staticMember' : 'method'
|
|
285
|
-
return %|#{@space}K.oo('#{m}', "#{@name}", function (#{args}) {#{@start}|
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
def last_string (s)
|
|
289
|
-
return %|#{s});|
|
|
290
|
-
end
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
class JS2::Ignore < JS2::Node
|
|
294
|
-
def to_s
|
|
295
|
-
return ''
|
|
296
|
-
end
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
class JS2::ParserHelper
|
|
302
|
-
attr_accessor :filename, :classes, :extra
|
|
303
|
-
|
|
304
|
-
TYPES = {
|
|
305
|
-
:CLASS => JS2::Class,
|
|
306
|
-
:FOREACH => JS2::Foreach,
|
|
307
|
-
:INCLUDE => JS2::Include,
|
|
308
|
-
:METHOD => JS2::Method,
|
|
309
|
-
:MEMBER => JS2::Member,
|
|
310
|
-
:MODULE => JS2::Module,
|
|
311
|
-
:STUFF => JS2::Stuff,
|
|
312
|
-
:STATIC => JS2::Ignore,
|
|
313
|
-
:PRIVATE => JS2::Private,
|
|
314
|
-
:CURRY => JS2::Curry,
|
|
315
|
-
:PROPERTY => JS2::Property,
|
|
316
|
-
:ACCESSOR => JS2::Accessor
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
def initialize (code)
|
|
320
|
-
@code = code
|
|
321
|
-
@stack = [ JS2::Stuff.new(0, @code) ]
|
|
322
|
-
@classes = []
|
|
323
|
-
@extra = []
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
def mark_node (idx)
|
|
327
|
-
@stack.last.mark(idx)
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
def start_node (type, start_idx, static = false)
|
|
331
|
-
klass = TYPES[type] || JS2::Node
|
|
332
|
-
new_node = klass.new(start_idx, @code, static)
|
|
333
|
-
if type == :CLASS || type == :MODULE
|
|
334
|
-
@classes.push(new_node)
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
@stack.last.set_child(new_node) if @stack.last
|
|
338
|
-
@stack.push << new_node
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
def stop_node (stop_idx)
|
|
342
|
-
last = @stack.pop
|
|
343
|
-
last.stop(stop_idx) if last
|
|
344
|
-
@stack.last.stop_child(stop_idx) if @stack.last
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
def to_s
|
|
348
|
-
return @stack.collect { |i| i.to_s }.join('') + (extra.empty? ? '' : ("\n" + extra.join("\n")))
|
|
349
|
-
end
|
|
350
|
-
end
|
|
351
|
-
|