jabs 0.1.1 → 0.2.0
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/VERSION +1 -1
- data/examples/config.ru +16 -6
- data/examples/jabs/drag_and_drop.js.jabs +23 -0
- data/examples/{src → jabs}/input_with_default.js.jabs +1 -1
- data/examples/views/drag_and_drop.haml +16 -0
- data/examples/views/input_with_default.haml +3 -0
- data/examples/views/layout.haml +8 -0
- data/lib/jabs.rb +10 -289
- data/lib/jabs/engine.rb +18 -0
- data/lib/jabs/middleware.rb +17 -3
- data/lib/jabs/precompiler.rb +252 -0
- data/lib/johnson/ext.rb +44 -0
- data/{vendor/jquery/jquery-1.3.1.js → lib/jquery/jquery-1.3.2.js} +316 -181
- data/lib/jquery/jquery.event.drag-1.5.js +137 -0
- data/lib/jquery/jquery.event.drop-1.2.js +157 -0
- data/lib/jquery/jquery.focus_and_blur.js +81 -0
- data/rspec/jabs/jabs_engine_spec.rb +78 -16
- metadata +13 -12
- data/examples/editor.html +0 -22
- data/examples/editor.js +0 -58
- data/examples/input_with_default.html +0 -13
- data/examples/input_with_default.js +0 -19
- data/examples/src/editor.html.haml +0 -19
- data/examples/src/editor.js.jabs +0 -50
- data/examples/src/input_with_default.html.haml +0 -10
- data/vendor/jquery/jquery-1.2.6.pack.js.gz +0 -11
- data/vendor/jquery/jquery.simulate.js +0 -152
@@ -0,0 +1,137 @@
|
|
1
|
+
/*!
|
2
|
+
jquery.event.drag.js ~ v1.5 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)
|
3
|
+
Liscensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt
|
4
|
+
*/
|
5
|
+
;(function($){ // secure $ jQuery alias
|
6
|
+
/*******************************************************************************************/
|
7
|
+
// Created: 2008-06-04 | Updated: 2009-03-24
|
8
|
+
/*******************************************************************************************/
|
9
|
+
// Events: drag, dragstart, dragend
|
10
|
+
/*******************************************************************************************/
|
11
|
+
|
12
|
+
// jquery method
|
13
|
+
$.fn.drag = function( fn1, fn2, fn3 ){
|
14
|
+
if ( fn2 ) this.bind('dragstart', fn1 ); // 2+ args
|
15
|
+
if ( fn3 ) this.bind('dragend', fn3 ); // 3 args
|
16
|
+
return !fn1 ? this.trigger('drag') // 0 args
|
17
|
+
: this.bind('drag', fn2 ? fn2 : fn1 ); // 1+ args
|
18
|
+
};
|
19
|
+
|
20
|
+
// local refs
|
21
|
+
var $event = $.event, $special = $event.special,
|
22
|
+
|
23
|
+
// special event configuration
|
24
|
+
drag = $special.drag = {
|
25
|
+
not: ':input', // don't begin to drag on event.targets that match this selector
|
26
|
+
distance: 0, // distance dragged before dragstart
|
27
|
+
which: 1, // mouse button pressed to start drag sequence
|
28
|
+
dragging: false, // hold the active target element
|
29
|
+
setup: function( data ){
|
30
|
+
data = $.extend({
|
31
|
+
distance: drag.distance,
|
32
|
+
which: drag.which,
|
33
|
+
not: drag.not
|
34
|
+
}, data || {});
|
35
|
+
data.distance = squared( data.distance ); // x� + y� = distance�
|
36
|
+
$event.add( this, "mousedown", handler, data );
|
37
|
+
if ( this.attachEvent ) this.attachEvent("ondragstart", dontStart ); // prevent image dragging in IE...
|
38
|
+
},
|
39
|
+
teardown: function(){
|
40
|
+
$event.remove( this, "mousedown", handler );
|
41
|
+
if ( this === drag.dragging ) drag.dragging = drag.proxy = false; // deactivate element
|
42
|
+
selectable( this, true ); // enable text selection
|
43
|
+
if ( this.detachEvent ) this.detachEvent("ondragstart", dontStart ); // prevent image dragging in IE...
|
44
|
+
}
|
45
|
+
};
|
46
|
+
|
47
|
+
// prevent normal event binding...
|
48
|
+
$special.dragstart = $special.dragend = { setup:function(){}, teardown:function(){} };
|
49
|
+
|
50
|
+
// handle drag-releatd DOM events
|
51
|
+
function handler ( event ){
|
52
|
+
var elem = this, returned, data = event.data || {};
|
53
|
+
// mousemove or mouseup
|
54
|
+
if ( data.elem ){
|
55
|
+
// update event properties...
|
56
|
+
elem = event.dragTarget = data.elem; // drag source element
|
57
|
+
event.dragProxy = drag.proxy || elem; // proxy element or source
|
58
|
+
event.cursorOffsetX = data.pageX - data.left; // mousedown offset
|
59
|
+
event.cursorOffsetY = data.pageY - data.top; // mousedown offset
|
60
|
+
event.offsetX = event.pageX - event.cursorOffsetX; // element offset
|
61
|
+
event.offsetY = event.pageY - event.cursorOffsetY; // element offset
|
62
|
+
}
|
63
|
+
// mousedown, check some initial props to avoid the switch statement
|
64
|
+
else if ( drag.dragging || ( data.which>0 && event.which!=data.which ) ||
|
65
|
+
$( event.target ).is( data.not ) ) return;
|
66
|
+
// handle various events
|
67
|
+
switch ( event.type ){
|
68
|
+
// mousedown, left click, event.target is not restricted, init dragging
|
69
|
+
case 'mousedown':
|
70
|
+
$.extend( data, $( elem ).offset(), {
|
71
|
+
elem: elem, target: event.target,
|
72
|
+
pageX: event.pageX, pageY: event.pageY
|
73
|
+
}); // store some initial attributes
|
74
|
+
$event.add( document, "mousemove mouseup", handler, data );
|
75
|
+
selectable( elem, false ); // disable text selection
|
76
|
+
drag.dragging = null; // pending state
|
77
|
+
return false; // prevents text selection in safari
|
78
|
+
// mousemove, check distance, start dragging
|
79
|
+
case !drag.dragging && 'mousemove':
|
80
|
+
if ( squared( event.pageX-data.pageX )
|
81
|
+
+ squared( event.pageY-data.pageY ) // x� + y� = distance�
|
82
|
+
< data.distance ) break; // distance tolerance not reached
|
83
|
+
event.target = data.target; // force target from "mousedown" event (fix distance issue)
|
84
|
+
returned = hijack( event, "dragstart", elem ); // trigger "dragstart", return proxy element
|
85
|
+
if ( returned !== false ){ // "dragstart" not rejected
|
86
|
+
drag.dragging = elem; // activate element
|
87
|
+
drag.proxy = event.dragProxy = $( returned || elem )[0]; // set proxy
|
88
|
+
}
|
89
|
+
// mousemove, dragging
|
90
|
+
case 'mousemove':
|
91
|
+
if ( drag.dragging ){
|
92
|
+
returned = hijack( event, "drag", elem ); // trigger "drag"
|
93
|
+
if ( $special.drop ){ // manage drop events
|
94
|
+
$special.drop.allowed = ( returned !== false ); // prevent drop
|
95
|
+
$special.drop.handler( event ); // "dropstart", "dropend"
|
96
|
+
}
|
97
|
+
if ( returned !== false ) break; // "drag" not rejected, stop
|
98
|
+
event.type = "mouseup"; // helps "drop" handler behave
|
99
|
+
}
|
100
|
+
// mouseup, stop dragging
|
101
|
+
case 'mouseup':
|
102
|
+
$event.remove( document, "mousemove mouseup", handler ); // remove page events
|
103
|
+
if ( drag.dragging ){
|
104
|
+
if ( $special.drop ) $special.drop.handler( event ); // "drop"
|
105
|
+
hijack( event, "dragend", elem ); // trigger "dragend"
|
106
|
+
}
|
107
|
+
selectable( elem, true ); // enable text selection
|
108
|
+
drag.dragging = drag.proxy = data.elem = false; // deactivate element
|
109
|
+
break;
|
110
|
+
}
|
111
|
+
return true;
|
112
|
+
};
|
113
|
+
|
114
|
+
// set event type to custom value, and handle it
|
115
|
+
function hijack ( event, type, elem ){
|
116
|
+
event.type = type; // force the event type
|
117
|
+
var result = $.event.handle.call( elem, event );
|
118
|
+
return result===false ? false : result || event.result;
|
119
|
+
};
|
120
|
+
|
121
|
+
// return the value squared
|
122
|
+
function squared ( value ){ return Math.pow( value, 2 ); };
|
123
|
+
|
124
|
+
// suppress default dragstart IE events...
|
125
|
+
function dontStart(){ return ( drag.dragging === false ); };
|
126
|
+
|
127
|
+
// toggles text selection attributes
|
128
|
+
function selectable ( elem, bool ){
|
129
|
+
if ( !elem ) return; // maybe element was removed ?
|
130
|
+
elem.unselectable = bool ? "off" : "on"; // IE
|
131
|
+
elem.onselectstart = function(){ return bool; }; // IE
|
132
|
+
//if ( document.selection && document.selection.empty ) document.selection.empty(); // IE
|
133
|
+
if ( elem.style ) elem.style.MozUserSelect = bool ? "" : "none"; // FF
|
134
|
+
};
|
135
|
+
|
136
|
+
/*******************************************************************************************/
|
137
|
+
})( jQuery ); // confine scope
|
@@ -0,0 +1,157 @@
|
|
1
|
+
/*! jquery.event.drop.js * v1.2
|
2
|
+
Copyright (c) 2008-2009, Three Dub Media (http://threedubmedia.com)
|
3
|
+
Liscensed under the MIT License (http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt)
|
4
|
+
*/;(function($){ // secure $ jQuery alias
|
5
|
+
// Created: 2008-06-04 | Updated: 2009-03-16
|
6
|
+
/*******************************************************************************************/
|
7
|
+
// Events: drop, dropstart, dropend
|
8
|
+
/*******************************************************************************************/
|
9
|
+
|
10
|
+
// JQUERY METHOD
|
11
|
+
$.fn.drop = function( fn1, fn2, fn3 ){
|
12
|
+
if ( fn2 ) this.bind('dropstart', fn1 ); // 2+ args
|
13
|
+
if ( fn3 ) this.bind('dropend', fn3 ); // 3 args
|
14
|
+
return !fn1 ? this.trigger('drop') // 0 args
|
15
|
+
: this.bind('drop', fn2 ? fn2 : fn1 ); // 1+ args
|
16
|
+
};
|
17
|
+
|
18
|
+
// DROP MANAGEMENT UTILITY
|
19
|
+
$.dropManage = function( opts ){ // return filtered drop target elements, cache their positions
|
20
|
+
opts = opts || {};
|
21
|
+
// safely set new options...
|
22
|
+
drop.data = [];
|
23
|
+
drop.filter = opts.filter || '*';
|
24
|
+
drop.delay = opts.delay || drop.delay;
|
25
|
+
drop.tolerance = opts.tolerance || null;
|
26
|
+
drop.mode = opts.mode || drop.mode || 'intersect';
|
27
|
+
// return the filtered set of drop targets
|
28
|
+
return drop.$targets.filter( drop.filter ).each(function(){
|
29
|
+
// locate and store the filtered drop targets
|
30
|
+
drop.data[ drop.data.length ] = drop.locate( this );
|
31
|
+
});
|
32
|
+
};
|
33
|
+
|
34
|
+
// local refs
|
35
|
+
var $event = $.event, $special = $event.special,
|
36
|
+
|
37
|
+
// SPECIAL EVENT CONFIGURATION
|
38
|
+
drop = $special.drop = {
|
39
|
+
delay: 100, // default frequency to track drop targets
|
40
|
+
mode: 'intersect', // default mode to determine valid drop targets
|
41
|
+
$targets: $([]), data: [], // storage of drop targets and locations
|
42
|
+
setup: function(){
|
43
|
+
drop.$targets = drop.$targets.add( this );
|
44
|
+
drop.data[ drop.data.length ] = drop.locate( this );
|
45
|
+
},
|
46
|
+
teardown: function(){ var elem = this;
|
47
|
+
drop.$targets = drop.$targets.not( this );
|
48
|
+
drop.data = $.grep( drop.data, function( obj ){
|
49
|
+
return ( obj.elem !== elem );
|
50
|
+
});
|
51
|
+
},
|
52
|
+
// shared handler
|
53
|
+
handler: function( event ){
|
54
|
+
var dropstart = null, dropped;
|
55
|
+
event.dropTarget = drop.dropping || undefined; // dropped element
|
56
|
+
if ( drop.data.length && event.dragTarget ){
|
57
|
+
// handle various events
|
58
|
+
switch ( event.type ){
|
59
|
+
// drag/mousemove, from $.event.special.drag
|
60
|
+
case 'drag': // TOLERATE >>
|
61
|
+
drop.event = event; // store the mousemove event
|
62
|
+
if ( !drop.timer ) // monitor drop targets
|
63
|
+
drop.timer = setTimeout( tolerate, 20 );
|
64
|
+
break;
|
65
|
+
// dragstop/mouseup, from $.event.special.drag
|
66
|
+
case 'mouseup': // DROP >> DROPEND >>
|
67
|
+
drop.timer = clearTimeout( drop.timer ); // delete timer
|
68
|
+
if ( !drop.dropping ) break; // stop, no drop
|
69
|
+
if ( drop.allowed )
|
70
|
+
dropped = hijack( event, "drop", drop.dropping ); // trigger "drop"
|
71
|
+
dropstart = false;
|
72
|
+
// activate new target, from tolerate (async)
|
73
|
+
case drop.dropping && 'dropstart': // DROPSTART >> ( new target )
|
74
|
+
dropstart = dropstart===null && drop.allowed ? true : false;
|
75
|
+
// deactivate active target, from tolerate (async)
|
76
|
+
case drop.dropping && 'dropend': // DROPEND >>
|
77
|
+
hijack( event, "dropend", drop.dropping ); // trigger "dropend"
|
78
|
+
drop.dropping = null; // empty dropper
|
79
|
+
if ( dropped === false ) event.dropTarget = undefined;
|
80
|
+
if ( !dropstart ) break; // stop
|
81
|
+
// activate target, from tolerate (async)
|
82
|
+
case drop.allowed && 'dropstart': // DROPSTART >>
|
83
|
+
event.dropTarget = this;
|
84
|
+
drop.dropping = hijack( event, "dropstart", this )!==false ? this : null; // trigger "dropstart"
|
85
|
+
break;
|
86
|
+
}
|
87
|
+
}
|
88
|
+
},
|
89
|
+
// returns the location positions of an element
|
90
|
+
locate: function( elem ){ // return { L:left, R:right, T:top, B:bottom, H:height, W:width }
|
91
|
+
var $el = $(elem), pos = $el.offset(), h = $el.outerHeight(), w = $el.outerWidth();
|
92
|
+
return { elem: elem, L: pos.left, R: pos.left+w, T: pos.top, B: pos.top+h, W: w, H: h };
|
93
|
+
},
|
94
|
+
// test the location positions of an element against another OR an X,Y coord
|
95
|
+
contains: function( target, test ){ // target { L,R,T,B,H,W } contains test [x,y] or { L,R,T,B,H,W }
|
96
|
+
return ( ( test[0] || test.L ) >= target.L && ( test[0] || test.R ) <= target.R
|
97
|
+
&& ( test[1] || test.T ) >= target.T && ( test[1] || test.B ) <= target.B );
|
98
|
+
},
|
99
|
+
// stored tolerance modes
|
100
|
+
modes: { // fn scope: "$.event.special.drop" object
|
101
|
+
// target with mouse wins, else target with most overlap wins
|
102
|
+
'intersect': function( event, proxy, target ){
|
103
|
+
return this.contains( target, [ event.pageX, event.pageY ] ) ? // check cursor
|
104
|
+
target : this.modes['overlap'].apply( this, arguments ); // check overlap
|
105
|
+
},
|
106
|
+
// target with most overlap wins
|
107
|
+
'overlap': function( event, proxy, target ){
|
108
|
+
// calculate the area of overlap...
|
109
|
+
target.overlap = Math.max( 0, Math.min( target.B, proxy.B ) - Math.max( target.T, proxy.T ) )
|
110
|
+
* Math.max( 0, Math.min( target.R, proxy.R ) - Math.max( target.L, proxy.L ) );
|
111
|
+
if ( target.overlap > ( ( this.best || {} ).overlap || 0 ) ) // compare overlap
|
112
|
+
this.best = target; // set as the best match so far
|
113
|
+
return null; // no winner
|
114
|
+
},
|
115
|
+
// proxy is completely contained within target bounds
|
116
|
+
'fit': function( event, proxy, target ){
|
117
|
+
return this.contains( target, proxy ) ? target : null;
|
118
|
+
},
|
119
|
+
// center of the proxy is contained within target bounds
|
120
|
+
'middle': function( event, proxy, target ){
|
121
|
+
return this.contains( target, [ proxy.L+proxy.W/2, proxy.T+proxy.H/2 ] ) ? target : null;
|
122
|
+
}
|
123
|
+
}
|
124
|
+
};
|
125
|
+
|
126
|
+
// set event type to custom value, and handle it
|
127
|
+
function hijack ( event, type, elem ){
|
128
|
+
event.type = type; // force the event type
|
129
|
+
try { var result = $event.handle.call( elem, event );
|
130
|
+
} catch ( ex ){ /* catch IE error with async event handling */ }
|
131
|
+
return result===false ? false : result || event.result;
|
132
|
+
};
|
133
|
+
|
134
|
+
// async, recursive tolerance execution
|
135
|
+
function tolerate (){
|
136
|
+
var i = 0, drp, winner, // local variables
|
137
|
+
xy = [ drop.event.pageX, drop.event.pageY ], // mouse location
|
138
|
+
drg = drop.locate( drop.event.dragProxy ); // drag proxy location
|
139
|
+
drop.tolerance = drop.tolerance || drop.modes[ drop.mode ]; // custom or stored tolerance fn
|
140
|
+
do if ( drp = drop.data[i] ){ // each drop target location
|
141
|
+
// tolerance function is defined, or mouse contained
|
142
|
+
winner = drop.tolerance ? drop.tolerance.call( drop, drop.event, drg, drp )
|
143
|
+
: drop.contains( drp, xy ) ? drp : null; // mouse is always fallback
|
144
|
+
}
|
145
|
+
while ( ++i<drop.data.length && !winner ); // loop
|
146
|
+
drop.event.type = ( winner = winner || drop.best ) ? 'dropstart' : 'dropend'; // start ? stop
|
147
|
+
if ( drop.event.type=='dropend' || winner.elem!=drop.dropping ) // don't dropstart on active drop target
|
148
|
+
drop.handler.call( winner ? winner.elem : drop.dropping, drop.event ); // handle events
|
149
|
+
if ( drop.last && xy[0] == drop.last.pageX && xy[1] == drop.last.pageY ) // no movement
|
150
|
+
delete drop.timer; // idle, don't recurse
|
151
|
+
else drop.timer = setTimeout( tolerate, drop.delay ); // recurse
|
152
|
+
drop.last = drop.event; // to compare idleness
|
153
|
+
drop.best = null; // reset comparitors
|
154
|
+
};
|
155
|
+
|
156
|
+
/*******************************************************************************************/
|
157
|
+
})(jQuery); // confine scope
|
@@ -0,0 +1,81 @@
|
|
1
|
+
(function(){
|
2
|
+
|
3
|
+
var special = jQuery.event.special,
|
4
|
+
uid1 = 'D' + (+new Date()),
|
5
|
+
uid2 = 'D' + (+new Date() + 1);
|
6
|
+
|
7
|
+
jQuery.event.special.focus = {
|
8
|
+
setup: function() {
|
9
|
+
var _self = this,
|
10
|
+
handler = function(e) {
|
11
|
+
e = jQuery.event.fix(e);
|
12
|
+
e.type = 'focus';
|
13
|
+
if (_self === document) {
|
14
|
+
jQuery.event.handle.call(_self, e);
|
15
|
+
}
|
16
|
+
};
|
17
|
+
|
18
|
+
jQuery(this).data(uid1, handler);
|
19
|
+
|
20
|
+
if (_self === document) {
|
21
|
+
/* Must be live() */
|
22
|
+
if (_self.addEventListener) {
|
23
|
+
_self.addEventListener('focus', handler, true);
|
24
|
+
} else {
|
25
|
+
_self.attachEvent('onfocusin', handler);
|
26
|
+
}
|
27
|
+
} else {
|
28
|
+
return false;
|
29
|
+
}
|
30
|
+
|
31
|
+
},
|
32
|
+
teardown: function() {
|
33
|
+
var handler = jQuery(this).data(uid1);
|
34
|
+
if (this === document) {
|
35
|
+
if (this.removeEventListener) {
|
36
|
+
this.removeEventListener('focus', handler, true);
|
37
|
+
} else {
|
38
|
+
this.detachEvent('onfocusin', handler);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
};
|
43
|
+
|
44
|
+
jQuery.event.special.blur = {
|
45
|
+
setup: function() {
|
46
|
+
var _self = this,
|
47
|
+
handler = function(e) {
|
48
|
+
e = jQuery.event.fix(e);
|
49
|
+
e.type = 'blur';
|
50
|
+
if (_self === document) {
|
51
|
+
jQuery.event.handle.call(_self, e);
|
52
|
+
}
|
53
|
+
};
|
54
|
+
|
55
|
+
jQuery(this).data(uid2, handler);
|
56
|
+
|
57
|
+
if (_self === document) {
|
58
|
+
/* Must be live() */
|
59
|
+
if (_self.addEventListener) {
|
60
|
+
_self.addEventListener('blur', handler, true);
|
61
|
+
} else {
|
62
|
+
_self.attachEvent('onfocusout', handler);
|
63
|
+
}
|
64
|
+
} else {
|
65
|
+
return false;
|
66
|
+
}
|
67
|
+
|
68
|
+
},
|
69
|
+
teardown: function() {
|
70
|
+
var handler = jQuery(this).data(uid2);
|
71
|
+
if (this === document) {
|
72
|
+
if (this.removeEventListener) {
|
73
|
+
this.removeEventListener('blur', handler, true);
|
74
|
+
} else {
|
75
|
+
this.detachEvent('onfocusout', handler);
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
};
|
80
|
+
|
81
|
+
})();
|
@@ -4,6 +4,7 @@ require 'colored'
|
|
4
4
|
|
5
5
|
describe Jabs::Engine do
|
6
6
|
def assert_jabs src, target
|
7
|
+
target = "(function(){#{target}})()"
|
7
8
|
jabsed = Jabs::Engine.new(src).render
|
8
9
|
src = Johnson::Parser.parse(jabsed).to_ecma
|
9
10
|
target = Johnson::Parser.parse(target).to_ecma
|
@@ -119,7 +120,7 @@ def sets_default_value
|
|
119
120
|
}, %{
|
120
121
|
jQuery.fn.sets_default_value = function() {
|
121
122
|
var $this = this;
|
122
|
-
(function($this) {})($this.find('[default_value]'))
|
123
|
+
return (function($this) {return $this})($this.find('[default_value]'))
|
123
124
|
}
|
124
125
|
}
|
125
126
|
end
|
@@ -131,11 +132,11 @@ jQuery.fn.sets_default_value = function() {
|
|
131
132
|
end
|
132
133
|
|
133
134
|
it "makes a query" do
|
134
|
-
assert_jabs "$#{@css}", "(function($this) {})(jQuery('#{@css}'));"
|
135
|
+
assert_jabs "$#{@css}", "return (function($this) { return $this})(jQuery('#{@css}'));"
|
135
136
|
end
|
136
137
|
|
137
138
|
it "renders iterator" do
|
138
|
-
assert_jabs "$#{@css}\n this.rules();", "(function($this) {this.rules();})(jQuery('#{@css}'));"
|
139
|
+
assert_jabs "$#{@css}\n this.rules();", "return (function($this) {this.rules(); return $this})(jQuery('#{@css}'));"
|
139
140
|
end
|
140
141
|
|
141
142
|
# it "wraps with document.ready if not already wrapped" do
|
@@ -145,22 +146,35 @@ jQuery.fn.sets_default_value = function() {
|
|
145
146
|
|
146
147
|
describe "events" do
|
147
148
|
it "has a special :ready event" do
|
148
|
-
assert_jabs(":ready", "jQuery(function() {\n (function($this) { })(jQuery(window));\n});")
|
149
|
+
assert_jabs(":ready", "jQuery(function() {\n return (function($this) { return $this})(jQuery(window));\n});")
|
149
150
|
end
|
150
151
|
|
151
152
|
it "has it's own $this" do
|
152
|
-
assert_jabs
|
153
|
+
assert_jabs %{
|
154
|
+
$element
|
155
|
+
:click
|
156
|
+
.hide
|
157
|
+
},
|
158
|
+
%{
|
159
|
+
return (function($this) {
|
160
|
+
$this.live("click", function(event) {
|
161
|
+
var $this = jQuery(this);
|
162
|
+
$this.hide();
|
163
|
+
});
|
164
|
+
return $this
|
165
|
+
})(jQuery("element"))
|
166
|
+
}
|
153
167
|
end
|
154
168
|
|
155
169
|
it "binds events to 'this' and preserves namespace" do
|
156
|
-
assert_jabs ":click.awesomely", "$this.live(\"click.awesomely\", function(
|
170
|
+
assert_jabs ":click.awesomely", "$this.live(\"click.awesomely\", function(event){var $this = jQuery(this);});"
|
157
171
|
end
|
158
172
|
|
159
173
|
it "renders callback" do
|
160
|
-
assert_jabs ":click.awesomely\n a()\n b()", "$this.live(\"click.awesomely\", function(
|
174
|
+
assert_jabs ":click.awesomely\n a()\n b()", "$this.live(\"click.awesomely\", function(event){var $this = jQuery(this);a();b();});"
|
161
175
|
end
|
162
176
|
|
163
|
-
it "compiles nested with anything with
|
177
|
+
it "compiles nested with anything with arbitrary javascript in between" do
|
164
178
|
assert_jabs %{
|
165
179
|
fun test
|
166
180
|
var cat = yum
|
@@ -168,7 +182,7 @@ fun test
|
|
168
182
|
},%{
|
169
183
|
function test() {
|
170
184
|
var cat = yum;
|
171
|
-
$this.live( 'click', function(
|
185
|
+
$this.live( 'click', function(event) {var $this = jQuery(this);});
|
172
186
|
}
|
173
187
|
}
|
174
188
|
end
|
@@ -180,12 +194,13 @@ $document
|
|
180
194
|
:click
|
181
195
|
var cool = "beans"
|
182
196
|
},%{
|
183
|
-
(function($this) {
|
197
|
+
return (function($this) {
|
184
198
|
cars++;
|
185
|
-
$this.live('click', function(
|
199
|
+
$this.live('click', function(event) {
|
186
200
|
var $this = jQuery(this);
|
187
201
|
var cool = "beans"
|
188
202
|
});
|
203
|
+
return $this
|
189
204
|
})(jQuery("document"));
|
190
205
|
}
|
191
206
|
end
|
@@ -197,7 +212,7 @@ var cat = poo
|
|
197
212
|
slot++
|
198
213
|
}, %{
|
199
214
|
var cat = poo;
|
200
|
-
$this.live('click', function(
|
215
|
+
$this.live('click', function(event) {
|
201
216
|
var $this = jQuery(this);
|
202
217
|
slot++;
|
203
218
|
});
|
@@ -208,11 +223,11 @@ $this.live('click', function(e) {
|
|
208
223
|
describe "sub selections" do
|
209
224
|
before(:each) {@css= "#some.convoluted:selector"}
|
210
225
|
it "queries against this" do
|
211
|
-
assert_jabs "&#{@css}", "(function($this) {})($this.find(\"#{@css}\"));"
|
226
|
+
assert_jabs "&#{@css}", "return (function($this) {return $this})($this.find(\"#{@css}\"));"
|
212
227
|
end
|
213
228
|
|
214
229
|
it "renders iterator" do
|
215
|
-
assert_jabs "&#{@css}\n a()\n b()", "(function($this) {a();b();})($this.find(\"#{@css}\"));"
|
230
|
+
assert_jabs "&#{@css}\n a()\n b()", "return (function($this) {a();b(); return $this})($this.find(\"#{@css}\"));"
|
216
231
|
end
|
217
232
|
end
|
218
233
|
|
@@ -342,15 +357,62 @@ else unless 3 == 4
|
|
342
357
|
end
|
343
358
|
end
|
344
359
|
|
360
|
+
describe "hash literals" do
|
361
|
+
it "works for method calls" do
|
362
|
+
assert_jabs %{
|
363
|
+
def sortable parent_selector
|
364
|
+
$#selector
|
365
|
+
.clone
|
366
|
+
.css
|
367
|
+
position: 'absolute'
|
368
|
+
top: 5
|
369
|
+
},
|
370
|
+
%{
|
371
|
+
jQuery.fn.sortable = function(parent_selector) {
|
372
|
+
var $this = this;
|
373
|
+
return (function($this){
|
374
|
+
return (function($this){
|
375
|
+
$this.css({
|
376
|
+
'position': 'absolute',
|
377
|
+
'top': 5
|
378
|
+
})
|
379
|
+
return $this
|
380
|
+
})($this.clone())
|
381
|
+
return $this
|
382
|
+
})(jQuery('#selector'))
|
383
|
+
}
|
384
|
+
}
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
345
388
|
describe "nested function calls" do
|
346
|
-
it "assumes previous line returns jquery object" do
|
389
|
+
it "assumes previous line returns jquery object without implied self" do
|
390
|
+
assert_jabs %{
|
391
|
+
:ready
|
392
|
+
object.targetElement
|
393
|
+
.call 'awesomely'
|
394
|
+
},
|
395
|
+
%{
|
396
|
+
jQuery(function() {
|
397
|
+
return (function($this) {
|
398
|
+
return (function($this) {
|
399
|
+
$this.call("awesomely");
|
400
|
+
return $this
|
401
|
+
})(jQuery(object.targetElement));
|
402
|
+
return $this
|
403
|
+
})(jQuery(window));
|
404
|
+
});
|
405
|
+
}
|
406
|
+
end
|
407
|
+
it "assumes previous line returns jquery object for implied self" do
|
347
408
|
assert_jabs %{
|
348
409
|
.methodA :val
|
349
410
|
.methodB :name
|
350
411
|
},
|
351
412
|
%{
|
352
|
-
(function($this){
|
413
|
+
return (function($this){
|
353
414
|
$this.methodB('name')
|
415
|
+
return $this
|
354
416
|
})($this.methodA('val'))
|
355
417
|
}
|
356
418
|
end
|