Skip to content

Commit ca2877a

Browse files
author
Petro Salema
committed
Refactoring event pipe
1 parent 974c013 commit ca2877a

12 files changed

Lines changed: 140 additions & 92 deletions

File tree

sandbox/aloha-bootstrap-ui/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
<body>
1515

16-
testing
16+
<h1>Aloha Editot Bootstrap UI</h1>
1717

1818
<div class="container">
1919

src/aloha.js

Lines changed: 97 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ define([
77
'dragdrop',
88
'editables',
99
'autoformat',
10+
'boundaries',
1011
'events',
1112
'functions',
1213
'keys',
@@ -23,6 +24,7 @@ define([
2324
DragDrop,
2425
Editables,
2526
AutoFormat,
27+
Boundaries,
2628
Events,
2729
Fn,
2830
Keys,
@@ -37,14 +39,92 @@ define([
3739
var doc = document;
3840
var win = Dom.documentWindow(doc);
3941

42+
function getBoundaries(type, nativeEvent, target) {
43+
var doc = target.document || target.ownerDocument;
44+
if (('mousedown' === type || 'click' === type) && nativeEvent && doc) {
45+
return Boundaries.fromPosition(
46+
nativeEvent.clientX,
47+
nativeEvent.clientY,
48+
doc
49+
);
50+
}
51+
if ('aloha' === type || 'mahalo' === type) {
52+
return [Boundaries.create(target, 0), Boundaries.create(target, 0)];
53+
}
54+
return doc && Boundaries.get(doc);
55+
}
56+
57+
/**
58+
* Creates an event object that will contain the following properties:
59+
* type
60+
* target
61+
* editor
62+
* boundaries
63+
*
64+
* In addition to these mandatory properties, it may contain the following:
65+
* editable
66+
* nativeEvent
67+
*
68+
* @param {!Editor} editor
69+
* @param {!Event} nativeEvent
70+
* @param {!Object} custom
71+
* @return {?Event}
72+
*/
73+
function createEvent(editor, nativeEvent, custom) {
74+
var type, target, editable, boundaries;
75+
if (custom) {
76+
type = custom.type;
77+
target = custom.target;
78+
editable = custom.editable;
79+
boundaries = custom.boundaries;
80+
}
81+
if (!type && nativeEvent) {
82+
type = nativeEvent.type;
83+
if (!type) {
84+
console.warn('no type');
85+
return null;
86+
}
87+
}
88+
if ('mousemove' === type) {
89+
console.warn('ignore mousemove');
90+
return null;
91+
}
92+
if (!target && nativeEvent) {
93+
target = nativeEvent.target;
94+
if (!target) {
95+
console.warn('no target');
96+
return null;
97+
}
98+
}
99+
if (!boundaries) {
100+
boundaries = getBoundaries(type, nativeEvent, target);
101+
if (!boundaries) {
102+
console.warn('no boundaries');
103+
return null;
104+
}
105+
}
106+
if (!editable) {
107+
var cac = Boundaries.commonContainer(boundaries[0], boundaries[1]);
108+
if (Dom.isEditableNode(cac)) {
109+
editable = Editables.fromBoundary(editor, boundaries[0]);
110+
}
111+
}
112+
return {
113+
type : type,
114+
target : target,
115+
editor : editor,
116+
editable : editable,
117+
boundaries : boundaries,
118+
nativeEvent : nativeEvent
119+
};
120+
}
121+
40122
function editor(nativeEvent, custom) {
41-
var event = custom || {nativeEvent : nativeEvent};
42-
event.editor = editor;
43-
event.lastEditableBoundaries = editor.lastEditableBoundaries;
44-
event.type = event.type || (nativeEvent && nativeEvent.type) || 'unknown';
45-
event = Fn.comp.apply(editor.stack, editor.stack)(event);
46-
editor.lastEditableBoundaries = event.boundaries;
47-
Selections.update(event);
123+
var event = createEvent(editor, nativeEvent, custom);
124+
if (event) {
125+
event = Fn.comp.apply(editor.stack, editor.stack)(event);
126+
Selections.update(event);
127+
}
48128
}
49129

50130
editor.BLOCK_CLASS = 'aloha-block';
@@ -73,24 +153,26 @@ define([
73153
*
74154
* Also serves as short aloha.aloha.
75155
*
76-
* @param {Element} element
77-
* @parma {Object} options
156+
* @param {!Element} element
157+
* @parma {Object=} options
78158
*/
79159
function aloha(element, options) {
80160
editor(null, {
81161
type : 'aloha',
82-
element : element,
162+
target : element,
83163
options : options
84164
});
85165
}
86166

167+
/**
168+
* Destroys an editable.
169+
*
170+
* @param {!Element} element
171+
*/
87172
function mahalo(element) {
88-
var editable = Editables.fromElem(editor, element);
89-
Editables.close(editable);
90-
Editables.dissocFromEditor(editor, editable);
91173
editor(null, {
92-
type : 'mahalo',
93-
editable : editable
174+
type : 'mahalo',
175+
target : element
94176
});
95177
}
96178

src/autoformat.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ define([
131131
}
132132

133133
function handleAutoFormat(event) {
134-
if ('keydown' !== event.type || !event.editable || !event.boundaries) {
134+
if (!event.editable || 'keydown' !== event.type) {
135135
return event;
136136
}
137137
if (

src/blocks.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ define([
8080
}
8181

8282
function handleAloha(event) {
83-
var blocks = event.editable['elem'].querySelectorAll('.aloha-block,img');
83+
var blocks = event.editable.elem.querySelectorAll('.aloha-block,img');
8484
[].forEach.call(blocks, function (block) {
8585
block.setAttribute('contentEditable', 'false');
8686
Dom.setStyle(block, 'cursor', Browsers.VENDOR_PREFIX + 'grab');
@@ -128,18 +128,16 @@ define([
128128
};
129129

130130
/**
131-
* Requires:
132-
* editor
133-
* Updates:
134-
* editable
131+
* Updates editable
135132
*
136133
* @param {AlohaEvent} event
137134
* @return {Event}
138135
*/
139136
function handleBlocks(event) {
140-
if (handlers[event.type]) {
141-
handlers[event.type](event);
137+
if (!event.editable || !handlers[event.type]) {
138+
return event;
142139
}
140+
handlers[event.type](event);
143141
return event;
144142
}
145143

src/dragdrop.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,7 @@ define([
174174
alohaEvent.editor.dnd.element
175175
);
176176
}
177-
if (event.stopPropagation) {
178-
event.stopPropagation();
179-
}
177+
Events.stopPropagation(event);
180178
// Because some browsers will otherwise redirect
181179
Events.preventDefault(event);
182180
}
@@ -190,20 +188,16 @@ define([
190188
/**
191189
* Processes drag and drop events.
192190
*
193-
* Requires:
194-
* editor
195-
* target
196-
* Updates:
197-
* editor.dnd
198-
* nativeEvent
191+
* Updates editor.dnd and nativeEvent
199192
*
200193
* @param {AlohaEvent} event
201194
* @return {AlohaEvent}
202195
*/
203196
function handleDragDrop(event) {
204-
if (event.editor.dnd && handlers[event.type]) {
205-
handlers[event.type](event);
197+
if (!event.editable || !event.editor.dnd || !handlers[event.type]) {
198+
return event;
206199
}
200+
handlers[event.type](event);
207201
return event;
208202
}
209203

src/editables.js

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,25 +106,26 @@ define([
106106
return editable;
107107
}
108108

109+
function destroy(editor, element) {
110+
var editable = fromElem(editor, element);
111+
close(editable);
112+
dissocFromEditor(editor, editable);
113+
return editable;
114+
}
115+
109116
/**
110117
* Associates an editable to the given AlohaEvent.
111118
*
112-
* Require:
113-
* type
114-
* editor
115-
* Provides:
116-
* editable
119+
* Provides editable
117120
*
118121
* @param {AlohaEvent} event
119122
* @return {AlohaEvent}
120123
*/
121124
function handleEditables(event) {
122125
if ('aloha' === event.type) {
123-
event.editable = create(event.editor, event.element, event.options);
124-
} else if (event.boundaries) {
125-
if (Dom.isEditableNode(Boundaries.container(event.boundaries[0]))) {
126-
event.editable = fromBoundary(event.editor, event.boundaries[0]);
127-
}
126+
event.editable = create(event.editor, event.target, event.options);
127+
} else if ('mahalo' === event.type) {
128+
event.editable = destroy(event.editor, event.target);
128129
}
129130
return event;
130131
}

src/keys.js

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,22 +88,16 @@ define(['strings', 'boundaries'], function (Strings, Boundaries) {
8888
};
8989

9090
/**
91-
* Requires:
92-
* type
93-
* target
94-
* Provides:
95-
* meta
96-
* keycode
91+
* Provides meta, keycode
9792
*/
9893
function handleKeys(event) {
99-
if (event.nativeEvent) {
100-
event.meta = metaKeys(event.nativeEvent);
101-
if (EVENTS[event.type]) {
102-
event.keycode = event.nativeEvent.which;
103-
if (!event.boundaries) {
104-
event.boundaries = Boundaries.get(event.target.ownerDocument);
105-
}
106-
}
94+
if (!event.editable || !event.nativeEvent) {
95+
return event;
96+
}
97+
event.meta = metaKeys(event.nativeEvent);
98+
if (EVENTS[event.type]) {
99+
event.keycode = event.nativeEvent.which;
100+
event.boundaries = Boundaries.get(event.target.ownerDocument);
107101
}
108102
return event;
109103
}

src/links.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ define([
228228
}
229229

230230
function handleLinks(event) {
231-
if (!event.boundaries || 'click' !== event.type) {
231+
if (!event.editable || 'click' !== event.type) {
232232
return event;
233233
}
234234
var cac = Boundaries.commonContainer(event.boundaries[0], event.boundaries[1]);

src/mouse.js

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,40 +25,17 @@ define(['boundaries'], function (Boundaries) {
2525
};
2626

2727
/**
28-
* Requires:
29-
* type
30-
* editor
31-
* Provides:
32-
* target
33-
* boundaries
34-
* Updates:
35-
* editor.selection
28+
* Updates event.editor.selection
3629
*
3730
* @param {AlohaEvent} event
3831
* @return {AlohaEVent}
3932
*/
4033
function handleMouse(event) {
41-
var nativeEvent = event.nativeEvent;
42-
if (!nativeEvent) {
34+
if (!event.editable || !event.nativeEvent || 'mousedown' !== event.type) {
4335
return event;
4436
}
45-
event.target = nativeEvent.target;
46-
if ('mousedown' === event.type) {
47-
event.editor.selection.formatting = [];
48-
event.editor.selection.overrides = [];
49-
}
50-
if (event.boundaries || !event.target.ownerDocument) {
51-
return event;
52-
}
53-
if ('mousedown' === event.type || 'click' === event.type) {
54-
event.boundaries = Boundaries.fromPosition(
55-
nativeEvent.clientX,
56-
nativeEvent.clientY,
57-
event.target.ownerDocument
58-
);
59-
} else if ('mousemove' !== event.type) {
60-
event.boundaries = Boundaries.get(event.target.ownerDocument);
61-
}
37+
event.editor.selection.formatting = [];
38+
event.editor.selection.overrides = [];
6239
return event;
6340
}
6441

src/paste.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ define([
5858
*/
5959
function isPasteEvent(event) {
6060
return 'paste' === event.type
61-
|| (event.nativeEvent && event.nativeEvent.clipboardData !== undefined);
61+
|| (event.nativeEvent && 'undefined' !== typeof event.nativeEvent.clipboardData);
6262
}
6363

6464
/**
@@ -209,7 +209,7 @@ define([
209209
* @return {AlohaEvent}
210210
*/
211211
function handlePaste(event) {
212-
if (!event.editable || !event.boundaries || !isPasteEvent(event)) {
212+
if (!event.editable || !isPasteEvent(event)) {
213213
return event;
214214
}
215215
Events.suppress(event.nativeEvent);
@@ -221,7 +221,7 @@ define([
221221
if (!content) {
222222
return event;
223223
}
224-
Undo.capture(event.editable['undoContext'], {
224+
Undo.capture(event.editable.undoContext, {
225225
meta: {type: 'paste'}
226226
}, function () {
227227
event.boundaries = insert(event.boundaries[0], event.boundaries[1], content);

0 commit comments

Comments
 (0)