red 3.2.1 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/Manifest.txt +3 -0
- data/bin/red +2 -1
- data/lib/javascripts/_dom_ready.js +249 -0
- data/lib/javascripts/prototype_dom_ready.js +1 -0
- data/lib/javascripts/red/unobtrusive.red +6 -0
- data/lib/red/executable.rb +36 -11
- data/lib/red/version.rb +2 -2
- data/tasks/deployment.rake +1 -4
- metadata +4 -1
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
data/bin/red
CHANGED
@@ -13,6 +13,7 @@ require 'red'
|
|
13
13
|
require 'red/executable'
|
14
14
|
require 'red/version'
|
15
15
|
require 'optparse'
|
16
|
+
require 'ftools'
|
16
17
|
|
17
18
|
include Red
|
18
19
|
|
@@ -22,7 +23,7 @@ parser = OptionParser.new do |opts|
|
|
22
23
|
opts.on("-h", "--help", "Show this help message.") { puts opts; exit }
|
23
24
|
opts.on("-r", "--rails", "Add Red plugin to ./vendor/plugins.") { build_red_plugin_for_rails }
|
24
25
|
opts.on("-s", "--string=RUBY_STRING", "Translate a single string to JavaScript.") { |string| direct_translate(string) }
|
25
|
-
opts.on("-u", "--unobtrusive
|
26
|
+
opts.on("-u", "--unobtrusive [LIBRARY]", "Add support for unobtrusive JavaScript to your Rails project.") { |library| add_unobtrusive(library) }
|
26
27
|
opts.on("-v", "--version", "Print version number.") { puts Red::VERSION::STRING; exit }
|
27
28
|
begin
|
28
29
|
opts.parse!(ARGV)
|
@@ -0,0 +1,249 @@
|
|
1
|
+
// http://tanny.ica.com/ICA/TKO/test.nsf/js/addevent.js
|
2
|
+
// Accessed 8/08/08 for Red
|
3
|
+
|
4
|
+
// written by Dean Edwards, 2005
|
5
|
+
// with input from Tino Zijdel, Matthias Miller, Diego Perini
|
6
|
+
// http://dean.edwards.name/weblog/2005/10/add-event/
|
7
|
+
// 2007-07-10 TKO - Removed check for body in schedule because of problems with Firefox 2.0
|
8
|
+
|
9
|
+
/*global domReady */
|
10
|
+
|
11
|
+
function addEvent(element, type, handler) {
|
12
|
+
// Modification by Tanny O'Haley, http://tanny.ica.com to add the
|
13
|
+
// DOMContentLoaded for all browsers.
|
14
|
+
if ((type === "DOMContentLoaded" || type === "domload")) {
|
15
|
+
if(typeof domReady === "function") {
|
16
|
+
domReady(handler);
|
17
|
+
return;
|
18
|
+
} else {
|
19
|
+
type = "load";
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
if (element.addEventListener) {
|
24
|
+
element.addEventListener(type, handler, false);
|
25
|
+
} else {
|
26
|
+
// assign each event handler a unique ID
|
27
|
+
if (!handler.$$guid) {
|
28
|
+
handler.$$guid = addEvent.guid++;
|
29
|
+
}
|
30
|
+
// create a hash table of event types for the element
|
31
|
+
if (!element.events) {
|
32
|
+
element.events = {};
|
33
|
+
}
|
34
|
+
// create a hash table of event handlers for each element/event pair
|
35
|
+
var handlers = element.events[type];
|
36
|
+
if (!handlers) {
|
37
|
+
handlers = element.events[type] = {};
|
38
|
+
// store the existing event handler (if there is one)
|
39
|
+
if (element["on" + type]) {
|
40
|
+
handlers[0] = element["on" + type];
|
41
|
+
}
|
42
|
+
}
|
43
|
+
// store the event handler in the hash table
|
44
|
+
handlers[handler.$$guid] = handler;
|
45
|
+
// assign a global event handler to do all the work
|
46
|
+
element["on" + type] = handleEvent;
|
47
|
+
}
|
48
|
+
}
|
49
|
+
// a counter used to create unique IDs
|
50
|
+
addEvent.guid = 1;
|
51
|
+
|
52
|
+
function removeEvent(element, type, handler) {
|
53
|
+
if (element.removeEventListener) {
|
54
|
+
element.removeEventListener(type, handler, false);
|
55
|
+
} else {
|
56
|
+
// delete the event handler from the hash table
|
57
|
+
if (element.events && element.events[type]) {
|
58
|
+
delete element.events[type][handler.$$guid];
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
function handleEvent(event) {
|
64
|
+
var returnValue = true;
|
65
|
+
// grab the event object (IE uses a global event object)
|
66
|
+
event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
|
67
|
+
// get a reference to the hash table of event handlers
|
68
|
+
var handlers = this.events[event.type];
|
69
|
+
// execute each event handler
|
70
|
+
for (var i in handlers) {
|
71
|
+
this.$$handleEvent = handlers[i];
|
72
|
+
if (this.$$handleEvent(event) === false) {
|
73
|
+
returnValue = false;
|
74
|
+
}
|
75
|
+
}
|
76
|
+
return returnValue;
|
77
|
+
}
|
78
|
+
|
79
|
+
function fixEvent(event) {
|
80
|
+
// add W3C standard event methods
|
81
|
+
event.preventDefault = fixEvent.preventDefault;
|
82
|
+
event.stopPropagation = fixEvent.stopPropagation;
|
83
|
+
return event;
|
84
|
+
}
|
85
|
+
fixEvent.preventDefault = function() {
|
86
|
+
this.returnValue = false;
|
87
|
+
};
|
88
|
+
fixEvent.stopPropagation = function() {
|
89
|
+
this.cancelBubble = true;
|
90
|
+
};
|
91
|
+
|
92
|
+
// End Dean Edwards addEvent.
|
93
|
+
|
94
|
+
// Tino Zijdel - crisp@xs4all.nl This little snippet fixes the problem that the onload attribute on
|
95
|
+
// the body-element will overwrite previous attached events on the window object for the onload event.
|
96
|
+
if (!window.addEventListener) {
|
97
|
+
document.onreadystatechange = function(){
|
98
|
+
if (window.onload && window.onload !== handleEvent) {
|
99
|
+
addEvent(window, 'load', window.onload);
|
100
|
+
window.onload = handleEvent;
|
101
|
+
}
|
102
|
+
};
|
103
|
+
}
|
104
|
+
|
105
|
+
// -----------------------------------------------------
|
106
|
+
// -----------------------------------------------------
|
107
|
+
|
108
|
+
// http://tanny.ica.com/ICA/TKO/test.nsf/js/domready.js
|
109
|
+
// Accessed 8/08/08 for Red
|
110
|
+
|
111
|
+
// DOMContentLoaded event handler. Works for browsers that don't support the DOMContentLoaded event.
|
112
|
+
//
|
113
|
+
// Modification Log:
|
114
|
+
// Date Initial Description
|
115
|
+
// 26 May 2008 TKO Created by Tanny O'Haley
|
116
|
+
|
117
|
+
/*global addEvent, escape, unescape */
|
118
|
+
|
119
|
+
var domReadyEvent = {
|
120
|
+
name: "domReadyEvent",
|
121
|
+
// Array of DOMContentLoaded event handlers.
|
122
|
+
events: {},
|
123
|
+
domReadyID: 1,
|
124
|
+
bDone: false,
|
125
|
+
DOMContentLoadedCustom: null,
|
126
|
+
|
127
|
+
// Function that adds DOMContentLoaded listeners to the array.
|
128
|
+
add: function(handler) {
|
129
|
+
// Assign each event handler a unique ID. If the handler has an ID, it
|
130
|
+
// has already been added to the events object or been run.
|
131
|
+
if (!handler.$$domReadyID) {
|
132
|
+
handler.$$domReadyID = this.domReadyID++;
|
133
|
+
|
134
|
+
// If the DOMContentLoaded event has happened, run the function.
|
135
|
+
if(this.bDone){
|
136
|
+
handler();
|
137
|
+
}
|
138
|
+
|
139
|
+
// store the event handler in the hash table
|
140
|
+
this.events[handler.$$domReadyID] = handler;
|
141
|
+
}
|
142
|
+
},
|
143
|
+
|
144
|
+
remove: function(handler) {
|
145
|
+
// Delete the event handler from the hash table
|
146
|
+
if (handler.$$domReadyID) {
|
147
|
+
delete this.events[handler.$$domReadyID];
|
148
|
+
}
|
149
|
+
},
|
150
|
+
|
151
|
+
// Function to process the DOMContentLoaded events array.
|
152
|
+
run: function() {
|
153
|
+
// quit if this function has already been called
|
154
|
+
if (this.bDone) {
|
155
|
+
return;
|
156
|
+
}
|
157
|
+
|
158
|
+
// Flag this function so we don't do the same thing twice
|
159
|
+
this.bDone = true;
|
160
|
+
|
161
|
+
// iterates through array of registered functions
|
162
|
+
for (var i in this.events) {
|
163
|
+
this.events[i]();
|
164
|
+
}
|
165
|
+
},
|
166
|
+
|
167
|
+
schedule: function() {
|
168
|
+
// Quit if the init function has already been called
|
169
|
+
if (this.bDone) {
|
170
|
+
return;
|
171
|
+
}
|
172
|
+
|
173
|
+
// First, check for Safari or KHTML.
|
174
|
+
if(/KHTML|WebKit/i.test(navigator.userAgent)) {
|
175
|
+
if(/loaded|complete/.test(document.readyState)) {
|
176
|
+
this.run();
|
177
|
+
} else {
|
178
|
+
// Not ready yet, wait a little more.
|
179
|
+
setTimeout(this.name + ".schedule()", 100);
|
180
|
+
}
|
181
|
+
} else if(document.getElementById("__ie_onload")) {
|
182
|
+
// Second, check for IE.
|
183
|
+
return true;
|
184
|
+
}
|
185
|
+
|
186
|
+
// Check for custom developer provided function.
|
187
|
+
if(typeof this.DOMContentLoadedCustom === "function") {
|
188
|
+
//if DOM methods are supported, and the body element exists
|
189
|
+
//(using a double-check including document.body, for the benefit of older moz builds [eg ns7.1]
|
190
|
+
//in which getElementsByTagName('body')[0] is undefined, unless this script is in the body section)
|
191
|
+
if(typeof document.getElementsByTagName !== 'undefined' && (document.getElementsByTagName('body')[0] !== null || document.body !== null)) {
|
192
|
+
// Call custom function.
|
193
|
+
if(this.DOMContentLoadedCustom()) {
|
194
|
+
this.run();
|
195
|
+
} else {
|
196
|
+
// Not ready yet, wait a little more.
|
197
|
+
setTimeout(this.name + ".schedule()", 250);
|
198
|
+
}
|
199
|
+
}
|
200
|
+
}
|
201
|
+
|
202
|
+
return true;
|
203
|
+
},
|
204
|
+
|
205
|
+
init: function() {
|
206
|
+
// If addEventListener supports the DOMContentLoaded event.
|
207
|
+
if(document.addEventListener) {
|
208
|
+
document.addEventListener("DOMContentLoaded", function() { domReadyEvent.run(); }, false);
|
209
|
+
}
|
210
|
+
|
211
|
+
// Schedule to run the init function.
|
212
|
+
setTimeout("domReadyEvent.schedule()", 100);
|
213
|
+
|
214
|
+
function run() {
|
215
|
+
domReadyEvent.run();
|
216
|
+
}
|
217
|
+
|
218
|
+
// Just in case window.onload happens first, add it to onload using an available method.
|
219
|
+
if(typeof addEvent !== "undefined") {
|
220
|
+
addEvent(window, "load", run);
|
221
|
+
} else if(document.addEventListener) {
|
222
|
+
document.addEventListener("load", run, false);
|
223
|
+
} else if(typeof window.onload === "function") {
|
224
|
+
var oldonload = window.onload;
|
225
|
+
window.onload = function() {
|
226
|
+
domReadyEvent.run();
|
227
|
+
oldonload();
|
228
|
+
};
|
229
|
+
} else {
|
230
|
+
window.onload = run;
|
231
|
+
}
|
232
|
+
|
233
|
+
/* for Internet Explorer */
|
234
|
+
/*@cc_on
|
235
|
+
@if (@_win32 || @_win64)
|
236
|
+
document.write("<script id=__ie_onload defer src=\"//:\"><\/script>");
|
237
|
+
var script = document.getElementById("__ie_onload");
|
238
|
+
script.onreadystatechange = function() {
|
239
|
+
if (this.readyState == "complete") {
|
240
|
+
domReadyEvent.run(); // call the onload handler
|
241
|
+
}
|
242
|
+
};
|
243
|
+
@end
|
244
|
+
@*/
|
245
|
+
}
|
246
|
+
};
|
247
|
+
|
248
|
+
var domReady = function(handler) { domReadyEvent.add(handler); };
|
249
|
+
domReadyEvent.init();
|
@@ -0,0 +1 @@
|
|
1
|
+
var domReady = function(handler) { document.observe('dom:loaded', handler); };
|
@@ -0,0 +1,6 @@
|
|
1
|
+
# To enable DOM-ready functionality, be sure the <head> of your layout contains:
|
2
|
+
# <script type="text/javascript" src="/javascripts/dom_ready.js"></script>
|
3
|
+
# <script type="text/javascript" src="/javascripts/unobtrusive.js"></script>
|
4
|
+
dom_ready do
|
5
|
+
# The contents of this block will be executed when the DOM is finished loading.
|
6
|
+
end
|
data/lib/red/executable.rb
CHANGED
@@ -1,16 +1,6 @@
|
|
1
1
|
module Red # :nodoc:
|
2
2
|
def build_red_plugin_for_rails
|
3
|
-
|
4
|
-
puts "Directory vendor/plugins does not exist."
|
5
|
-
exit
|
6
|
-
end
|
7
|
-
|
8
|
-
begin
|
9
|
-
Dir.mkdir('vendor/plugins/red') unless File.exists?('vendor/plugins/red')
|
10
|
-
rescue SystemCallError
|
11
|
-
puts "Unable to create directory in vendor/plugins"
|
12
|
-
exit
|
13
|
-
end
|
3
|
+
self.make_rails_directory('vendor/plugins/red')
|
14
4
|
|
15
5
|
File.open('vendor/plugins/red/init.rb', 'w') { |f| f.write("require 'rubygems'\nrequire 'red'\n\nRed.rails\n") }
|
16
6
|
|
@@ -18,6 +8,19 @@ module Red # :nodoc:
|
|
18
8
|
exit
|
19
9
|
end
|
20
10
|
|
11
|
+
def add_unobtrusive(library)
|
12
|
+
red_directory_created = self.make_rails_directory('public/javascripts/red')
|
13
|
+
File.copy(File.join(File.dirname(__FILE__), "../javascripts/#{(library || '').downcase}_dom_ready.js"), "public/javascripts/dom_ready.js")
|
14
|
+
File.copy(File.join(File.dirname(__FILE__), "../javascripts/red/unobtrusive.red"), 'public/javascripts/red/unobtrusive.red')
|
15
|
+
|
16
|
+
puts RED_MESSAGES[:unobtrusive]
|
17
|
+
exit
|
18
|
+
rescue Errno::ENOENT
|
19
|
+
puts "There is no Unobtrusive Red support for #{library}"
|
20
|
+
Dir.rmdir('public/javascripts/red') if red_directory_created
|
21
|
+
exit
|
22
|
+
end
|
23
|
+
|
21
24
|
def direct_translate(string)
|
22
25
|
js_output = hush_warnings { string.string_to_node }.compile_node
|
23
26
|
print_js(js_output, 'test')
|
@@ -38,6 +41,18 @@ module Red # :nodoc:
|
|
38
41
|
puts RED_MESSAGES[:output] % [("- #{filename}.js" unless filename == 'test'), js_output, @@red_errors ||= '']
|
39
42
|
end
|
40
43
|
|
44
|
+
def make_rails_directory(dir)
|
45
|
+
parent_dir = File.dirname(dir)
|
46
|
+
unless File.exists?(parent_dir)
|
47
|
+
puts "Directory #{parent_dir} does not exist."
|
48
|
+
exit
|
49
|
+
end
|
50
|
+
Dir.mkdir(dir) unless File.exists?(dir)
|
51
|
+
rescue SystemCallError
|
52
|
+
puts "Unable to create directory in #{parent_dir}"
|
53
|
+
exit
|
54
|
+
end
|
55
|
+
|
41
56
|
def compile_red_to_js(filename)
|
42
57
|
unless File.exists?(file = "%s.red" % [filename]) || File.exists?(file = "%sred/%s.red" % [(dir = "public/javascripts/"), filename])
|
43
58
|
puts "File #{filename}.red does not exist."
|
@@ -99,4 +114,14 @@ Use red -h for help.
|
|
99
114
|
%s
|
100
115
|
|
101
116
|
MESSAGE
|
117
|
+
|
118
|
+
RED_MESSAGES[:unobtrusive] = <<-MESSAGE
|
119
|
+
|
120
|
+
public/javascripts/dom_ready.js
|
121
|
+
public/javascripts/red
|
122
|
+
public/javascripts/red/unobtrusive.red
|
123
|
+
|
124
|
+
Unobtrusive Red added to project.
|
125
|
+
|
126
|
+
MESSAGE
|
102
127
|
end
|
data/lib/red/version.rb
CHANGED
data/tasks/deployment.rake
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
desc 'Release the website and new gem version'
|
2
|
-
task :deploy => [:check_version, :
|
2
|
+
task :deploy => [:check_version, :release] do
|
3
3
|
puts "Remember to create SVN tag:"
|
4
4
|
puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
|
5
5
|
"svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
|
@@ -7,9 +7,6 @@ task :deploy => [:check_version, :website, :release] do
|
|
7
7
|
puts "Tagging release #{CHANGES}"
|
8
8
|
end
|
9
9
|
|
10
|
-
desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
|
11
|
-
task :local_deploy => [:website_generate, :install_gem]
|
12
|
-
|
13
10
|
task :check_version do
|
14
11
|
unless ENV['VERSION']
|
15
12
|
puts 'Must pass a VERSION=x.y.z release version'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: red
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Sielaff
|
@@ -65,6 +65,9 @@ files:
|
|
65
65
|
- bin/red
|
66
66
|
- config/hoe.rb
|
67
67
|
- config/requirements.rb
|
68
|
+
- lib/javascripts/_dom_ready.js
|
69
|
+
- lib/javascripts/prototype_dom_ready.js
|
70
|
+
- lib/javascripts/red/unobtrusive.red
|
68
71
|
- lib/red.rb
|
69
72
|
- lib/red/assignment_nodes.rb
|
70
73
|
- lib/red/call_nodes.rb
|