summernote-rails 0.3.0 → 0.4.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.
- checksums.yaml +4 -4
- data/README.md +17 -11
- data/lib/summernote/rails/version.rb +1 -1
- data/vendor/assets/javascripts/summernote.js +724 -364
- data/vendor/assets/javascripts/summernote.min.js +2 -2
- data/vendor/assets/stylesheets/{summernote-bootstrap.css → summernote-bs2.css} +0 -0
- data/vendor/assets/stylesheets/summernote-bs3.css +5970 -0
- data/vendor/assets/stylesheets/summernote.css +1 -1
- metadata +4 -3
@@ -3,12 +3,15 @@
|
|
3
3
|
* (c) 2013~ Alan Hong
|
4
4
|
* summernote may be freely distributed under the MIT license./
|
5
5
|
*/
|
6
|
-
(function($) {
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
var
|
11
|
-
|
6
|
+
(function($) { "use strict";
|
7
|
+
/**
|
8
|
+
* object which check platform/agent
|
9
|
+
*/
|
10
|
+
var agent = {
|
11
|
+
bMac: navigator.appVersion.indexOf('Mac') > -1,
|
12
|
+
bMSIE: navigator.userAgent.indexOf('MSIE') > -1,
|
13
|
+
bFF: navigator.userAgent.indexOf('Firefox') > -1
|
14
|
+
};
|
12
15
|
|
13
16
|
/**
|
14
17
|
* func utils (for high-order func's arg)
|
@@ -17,8 +20,8 @@
|
|
17
20
|
var eq = function(elA) { return function(elB) { return elA === elB; }; };
|
18
21
|
var eq2 = function(elA, elB) { return elA === elB; };
|
19
22
|
var fail = function() { return false; };
|
20
|
-
var not = function(f) { return function() { return !f.apply(f, arguments); }};
|
21
|
-
var self = function(a) { return a; }
|
23
|
+
var not = function(f) { return function() { return !f.apply(f, arguments); }; };
|
24
|
+
var self = function(a) { return a; };
|
22
25
|
return { eq: eq, eq2: eq2, fail: fail, not: not, self: self };
|
23
26
|
}();
|
24
27
|
|
@@ -31,6 +34,11 @@
|
|
31
34
|
var initial = function(array) { return array.slice(0, array.length - 1); };
|
32
35
|
var tail = function(array) { return array.slice(1); };
|
33
36
|
|
37
|
+
/**
|
38
|
+
* get sum from a list
|
39
|
+
* @param {array} array - array
|
40
|
+
* @param {function} fn - iterator
|
41
|
+
*/
|
34
42
|
var sum = function(array, fn) {
|
35
43
|
fn = fn || func.self;
|
36
44
|
return array.reduce(function(memo, v) {
|
@@ -38,6 +46,10 @@
|
|
38
46
|
}, 0);
|
39
47
|
};
|
40
48
|
|
49
|
+
/**
|
50
|
+
* returns a copy of the collection with array type.
|
51
|
+
* @param {collection} collection - collection eg) node.childNodes, ...
|
52
|
+
*/
|
41
53
|
var from = function(collection) {
|
42
54
|
var result = [], idx = -1, length = collection.length;
|
43
55
|
while (++idx < length) {
|
@@ -46,6 +58,11 @@
|
|
46
58
|
return result;
|
47
59
|
};
|
48
60
|
|
61
|
+
/**
|
62
|
+
* cluster item by second function
|
63
|
+
* @param {array} array - array
|
64
|
+
* @param {function} fn - predicate function for cluster rule
|
65
|
+
*/
|
49
66
|
var clusterBy = function(array, fn) {
|
50
67
|
if (array.length === 0) { return []; }
|
51
68
|
var aTail = tail(array);
|
@@ -60,25 +77,81 @@
|
|
60
77
|
}, [[head(array)]]);
|
61
78
|
};
|
62
79
|
|
80
|
+
/**
|
81
|
+
* returns a copy of the array with all falsy values removed
|
82
|
+
* @param {array} array - array
|
83
|
+
* @param {function} fn - predicate function for cluster rule
|
84
|
+
*/
|
63
85
|
var compact = function(array) {
|
64
86
|
var aResult = [];
|
65
87
|
for (var idx = 0, sz = array.length; idx < sz; idx ++) {
|
66
|
-
if (array[idx]) { aResult.push(array[idx]); }
|
67
|
-
}
|
88
|
+
if (array[idx]) { aResult.push(array[idx]); }
|
89
|
+
}
|
68
90
|
return aResult;
|
69
91
|
};
|
70
92
|
|
71
93
|
return { head: head, last: last, initial: initial, tail: tail,
|
72
94
|
sum: sum, from: from, compact: compact, clusterBy: clusterBy };
|
73
95
|
}();
|
96
|
+
|
97
|
+
/**
|
98
|
+
* aysnc functions which returns deferred object
|
99
|
+
*/
|
100
|
+
var async = function() {
|
101
|
+
/**
|
102
|
+
* readFile
|
103
|
+
* @param {file} file - file object
|
104
|
+
*/
|
105
|
+
var readFile = function(file) {
|
106
|
+
return $.Deferred(function(deferred) {
|
107
|
+
var reader = new FileReader();
|
108
|
+
reader.onload = function(e) { deferred.resolve(e.target.result); }
|
109
|
+
reader.onerror = function(e) { deferred.reject(this); }
|
110
|
+
reader.readAsDataURL(file);
|
111
|
+
}).promise();
|
112
|
+
};
|
113
|
+
|
114
|
+
/**
|
115
|
+
* loadImage
|
116
|
+
* @param {string} sUrl
|
117
|
+
*/
|
118
|
+
var loadImage = function(sUrl) {
|
119
|
+
return $.Deferred(function(deferred) {
|
120
|
+
var image = new Image();
|
121
|
+
image.onload = loaded;
|
122
|
+
image.onerror = errored; // URL returns 404, etc
|
123
|
+
image.onabort = errored; // IE may call this if user clicks "Stop"
|
124
|
+
image.src = sUrl;
|
125
|
+
|
126
|
+
function loaded() {
|
127
|
+
unbindEvents(); deferred.resolve(image);
|
128
|
+
}
|
129
|
+
function errored() {
|
130
|
+
unbindEvents(); deferred.reject(image);
|
131
|
+
}
|
132
|
+
function unbindEvents() {
|
133
|
+
image.onload = null;
|
134
|
+
image.onerror = null;
|
135
|
+
image.onabort = null;
|
136
|
+
}
|
137
|
+
}).promise();
|
138
|
+
};
|
139
|
+
|
140
|
+
return { readFile: readFile, loadImage: loadImage };
|
141
|
+
}();
|
74
142
|
|
75
143
|
/**
|
76
144
|
* dom utils
|
77
145
|
*/
|
78
146
|
var dom = function() {
|
147
|
+
/**
|
148
|
+
* returns predicate which judge whether nodeName is same
|
149
|
+
*/
|
79
150
|
var makePredByNodeName = function(sNodeName) {
|
80
151
|
// nodeName of element is always uppercase.
|
81
|
-
return function(node) {
|
152
|
+
return function(node) {
|
153
|
+
return node && node.nodeName === sNodeName;
|
154
|
+
};
|
82
155
|
};
|
83
156
|
|
84
157
|
var isPara = function(node) {
|
@@ -97,7 +170,11 @@
|
|
97
170
|
return node && $(node).hasClass('note-control-sizing');
|
98
171
|
};
|
99
172
|
|
100
|
-
|
173
|
+
/**
|
174
|
+
* find nearest ancestor predicate hit
|
175
|
+
* @param {element} node
|
176
|
+
* @param {function} pred - predicate function
|
177
|
+
*/
|
101
178
|
var ancestor = function(node, pred) {
|
102
179
|
while (node) {
|
103
180
|
if (pred(node)) { return node; }
|
@@ -106,7 +183,11 @@
|
|
106
183
|
return null;
|
107
184
|
};
|
108
185
|
|
109
|
-
|
186
|
+
/**
|
187
|
+
* returns new array of ancestor nodes (until predicate hit).
|
188
|
+
* @param {element} node
|
189
|
+
* @param {function} [optional] pred - predicate function
|
190
|
+
*/
|
110
191
|
var listAncestor = function(node, pred) {
|
111
192
|
pred = pred || func.fail;
|
112
193
|
|
@@ -118,7 +199,11 @@
|
|
118
199
|
return aAncestor;
|
119
200
|
};
|
120
201
|
|
121
|
-
|
202
|
+
/**
|
203
|
+
* returns common ancestor node between two nodes.
|
204
|
+
* @param {element} nodeA
|
205
|
+
* @param {element} nodeB
|
206
|
+
*/
|
122
207
|
var commonAncestor = function(nodeA, nodeB) {
|
123
208
|
var aAncestor = listAncestor(nodeA);
|
124
209
|
for (var n = nodeB; n; n = n.parentNode) {
|
@@ -127,8 +212,12 @@
|
|
127
212
|
return null; // difference document area
|
128
213
|
};
|
129
214
|
|
130
|
-
|
131
|
-
|
215
|
+
/**
|
216
|
+
* listing all Nodes between two nodes.
|
217
|
+
* FIXME: nodeA and nodeB must be sorted, use comparePoints later.
|
218
|
+
* @param {element} nodeA
|
219
|
+
* @param {element} nodeB
|
220
|
+
*/
|
132
221
|
var listBetween = function(nodeA, nodeB) {
|
133
222
|
var aNode = [];
|
134
223
|
|
@@ -136,19 +225,23 @@
|
|
136
225
|
var fnWalk = function(node) {
|
137
226
|
if (!node) { return; } // traverse fisnish
|
138
227
|
if (node === nodeA) { bStart = true; } // start point
|
139
|
-
if (bStart && !bEnd) { aNode.push(node) } // between
|
228
|
+
if (bStart && !bEnd) { aNode.push(node); } // between
|
140
229
|
if (node === nodeB) { bEnd = true; return; } // end point
|
141
230
|
|
142
|
-
for (var idx = 0, sz=node.childNodes.length; idx < sz; idx++) {
|
231
|
+
for (var idx = 0, sz = node.childNodes.length; idx < sz; idx++) {
|
143
232
|
fnWalk(node.childNodes[idx]);
|
144
233
|
}
|
145
|
-
}
|
234
|
+
};
|
146
235
|
|
147
236
|
fnWalk(commonAncestor(nodeA, nodeB)); // DFS with commonAcestor.
|
148
237
|
return aNode;
|
149
238
|
};
|
150
239
|
|
151
|
-
|
240
|
+
/**
|
241
|
+
* listing all prevSiblings (until predicate hit).
|
242
|
+
* @param {element} node
|
243
|
+
* @param {function} [optional] pred - predicate function
|
244
|
+
*/
|
152
245
|
var listPrev = function(node, pred) {
|
153
246
|
pred = pred || func.fail;
|
154
247
|
|
@@ -157,11 +250,15 @@
|
|
157
250
|
aNext.push(node);
|
158
251
|
if (pred(node)) { break; }
|
159
252
|
node = node.previousSibling;
|
160
|
-
}
|
253
|
+
}
|
161
254
|
return aNext;
|
162
255
|
};
|
163
256
|
|
164
|
-
|
257
|
+
/**
|
258
|
+
* listing nextSiblings (until predicate hit).
|
259
|
+
* @param {element} node
|
260
|
+
* @param {function} pred [optional] - predicate function
|
261
|
+
*/
|
165
262
|
var listNext = function(node, pred) {
|
166
263
|
pred = pred || func.fail;
|
167
264
|
|
@@ -170,11 +267,15 @@
|
|
170
267
|
aNext.push(node);
|
171
268
|
if (pred(node)) { break; }
|
172
269
|
node = node.nextSibling;
|
173
|
-
}
|
270
|
+
}
|
174
271
|
return aNext;
|
175
272
|
};
|
176
273
|
|
177
|
-
|
274
|
+
/**
|
275
|
+
* insert node after preceding
|
276
|
+
* @param {element} node
|
277
|
+
* @param {element} preceding - predicate function
|
278
|
+
*/
|
178
279
|
var insertAfter = function(node, preceding) {
|
179
280
|
var next = preceding.nextSibling, parent = preceding.parentNode;
|
180
281
|
if (next) {
|
@@ -185,7 +286,11 @@
|
|
185
286
|
return node;
|
186
287
|
};
|
187
288
|
|
188
|
-
|
289
|
+
/**
|
290
|
+
* append children
|
291
|
+
* @param {element} node
|
292
|
+
* @param {collection} aChild
|
293
|
+
*/
|
189
294
|
var appends = function(node, aChild) {
|
190
295
|
$.each(aChild, function(idx, child) {
|
191
296
|
node.appendChild(child);
|
@@ -195,26 +300,40 @@
|
|
195
300
|
|
196
301
|
var isText = makePredByNodeName('#text');
|
197
302
|
|
198
|
-
|
303
|
+
/**
|
304
|
+
* returns #text's text size or element's childNodes size
|
305
|
+
* @param {element} node
|
306
|
+
*/
|
199
307
|
var length = function(node) {
|
200
308
|
if (isText(node)) { return node.nodeValue.length; }
|
201
309
|
return node.childNodes.length;
|
202
310
|
};
|
203
311
|
|
204
|
-
|
312
|
+
/**
|
313
|
+
* returns offset from parent.
|
314
|
+
* @param {element} node
|
315
|
+
*/
|
205
316
|
var position = function(node) {
|
206
317
|
var offset = 0;
|
207
318
|
while (node = node.previousSibling) { offset += 1; }
|
208
319
|
return offset;
|
209
320
|
};
|
210
321
|
|
211
|
-
|
322
|
+
/**
|
323
|
+
* return offsetPath(array of offset) from ancestor
|
324
|
+
* @param {element} ancestor - ancestor node
|
325
|
+
* @param {element} node
|
326
|
+
*/
|
212
327
|
var makeOffsetPath = function(ancestor, node) {
|
213
328
|
var aAncestor = list.initial(listAncestor(node, func.eq(ancestor)));
|
214
329
|
return $.map(aAncestor, position).reverse();
|
215
330
|
};
|
216
331
|
|
217
|
-
|
332
|
+
/**
|
333
|
+
* return element from offsetPath(array of offset)
|
334
|
+
* @param {element} ancestor - ancestor node
|
335
|
+
* @param {array} aOffset - offsetPath
|
336
|
+
*/
|
218
337
|
var fromOffsetPath = function(ancestor, aOffset) {
|
219
338
|
var current = ancestor;
|
220
339
|
for (var i = 0, sz = aOffset.length; i < sz; i++) {
|
@@ -223,7 +342,11 @@
|
|
223
342
|
return current;
|
224
343
|
};
|
225
344
|
|
226
|
-
|
345
|
+
/**
|
346
|
+
* split element or #text
|
347
|
+
* @param {element} node
|
348
|
+
* @param {number} offset
|
349
|
+
*/
|
227
350
|
var splitData = function(node, offset) {
|
228
351
|
if (offset === 0) { return node; }
|
229
352
|
if (offset >= length(node)) { return node.nextSibling; }
|
@@ -237,7 +360,12 @@
|
|
237
360
|
return appends(node, listNext(child));
|
238
361
|
};
|
239
362
|
|
240
|
-
|
363
|
+
/**
|
364
|
+
* split dom tree by boundaryPoint(pivot and offset)
|
365
|
+
* @param {element} root
|
366
|
+
* @param {element} pivot - this will be boundaryPoint's node
|
367
|
+
* @param {number} offset - this will be boundaryPoint's offset
|
368
|
+
*/
|
241
369
|
var split = function(root, pivot, offset) {
|
242
370
|
var aAncestor = listAncestor(pivot, func.eq(root));
|
243
371
|
if (aAncestor.length === 1) { return splitData(pivot, offset); }
|
@@ -251,6 +379,37 @@
|
|
251
379
|
return clone;
|
252
380
|
});
|
253
381
|
};
|
382
|
+
|
383
|
+
/**
|
384
|
+
* remove node, (bRemoveChild: remove child or not)
|
385
|
+
* @param {element} node
|
386
|
+
* @param {boolean} bRemoveChild
|
387
|
+
*/
|
388
|
+
var remove = function(node, bRemoveChild) {
|
389
|
+
if (!node || !node.parentNode) { return; }
|
390
|
+
if (node.removeNode) { return node.removeNode(bRemoveChild); }
|
391
|
+
|
392
|
+
var elParent = node.parentNode;
|
393
|
+
if (!bRemoveChild) {
|
394
|
+
var aNode = [];
|
395
|
+
for (var i = 0, sz = node.childNodes.length; i < sz; i++) {
|
396
|
+
aNode.push(node.childNodes[i]);
|
397
|
+
}
|
398
|
+
|
399
|
+
for (var i = 0, sz = aNode.length; i < sz; i++) {
|
400
|
+
elParent.insertBefore(aNode[i], node);
|
401
|
+
}
|
402
|
+
}
|
403
|
+
|
404
|
+
elParent.removeChild(node);
|
405
|
+
};
|
406
|
+
|
407
|
+
var unescape = function(str) {
|
408
|
+
return $("<div/>").html(str).text();
|
409
|
+
};
|
410
|
+
var html = function($node) {
|
411
|
+
return dom.isTextarea($node[0]) ? unescape($node.val()) : $node.html();
|
412
|
+
};
|
254
413
|
|
255
414
|
return {
|
256
415
|
isText: isText,
|
@@ -260,209 +419,215 @@
|
|
260
419
|
isDiv: makePredByNodeName('DIV'), isSpan: makePredByNodeName('SPAN'),
|
261
420
|
isB: makePredByNodeName('B'), isU: makePredByNodeName('U'),
|
262
421
|
isS: makePredByNodeName('S'), isI: makePredByNodeName('I'),
|
263
|
-
isImg: makePredByNodeName('IMG'),
|
422
|
+
isImg: makePredByNodeName('IMG'), isTextarea: makePredByNodeName('TEXTAREA'),
|
264
423
|
ancestor: ancestor, listAncestor: listAncestor,
|
265
424
|
listNext: listNext, listPrev: listPrev,
|
266
425
|
commonAncestor: commonAncestor, listBetween: listBetween,
|
267
426
|
insertAfter: insertAfter, position: position,
|
268
427
|
makeOffsetPath: makeOffsetPath, fromOffsetPath: fromOffsetPath,
|
269
|
-
split: split
|
428
|
+
split: split, remove: remove, html: html
|
270
429
|
};
|
271
430
|
}();
|
272
431
|
|
273
432
|
/**
|
274
|
-
*
|
275
|
-
* {startContainer, startOffset, endContainer, endOffset}
|
276
|
-
* create Range Object From arguments or Browser Selection
|
433
|
+
* range module
|
277
434
|
*/
|
278
|
-
var
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
435
|
+
var range = function() {
|
436
|
+
var bW3CRangeSupport = !!document.createRange;
|
437
|
+
|
438
|
+
// return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js
|
439
|
+
var textRange2bp = function(textRange, bStart) {
|
440
|
+
var elCont = textRange.parentElement(), nOffset;
|
441
|
+
|
442
|
+
var tester = document.body.createTextRange(), elPrevCont;
|
443
|
+
var aChild = list.from(elCont.childNodes);
|
444
|
+
for (nOffset = 0; nOffset < aChild.length; nOffset++) {
|
445
|
+
if (dom.isText(aChild[nOffset])) { continue; }
|
446
|
+
tester.moveToElementText(aChild[nOffset]);
|
447
|
+
if (tester.compareEndPoints('StartToStart', textRange) >= 0) { break; }
|
448
|
+
elPrevCont = aChild[nOffset];
|
449
|
+
}
|
293
450
|
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
451
|
+
if (nOffset !== 0 && dom.isText(aChild[nOffset - 1])) {
|
452
|
+
var textRangeStart = document.body.createTextRange(), elCurText = null;
|
453
|
+
textRangeStart.moveToElementText(elPrevCont || elCont);
|
454
|
+
textRangeStart.collapse(!elPrevCont);
|
455
|
+
elCurText = elPrevCont ? elPrevCont.nextSibling : elCont.firstChild;
|
299
456
|
|
300
|
-
|
301
|
-
|
302
|
-
|
457
|
+
var pointTester = textRange.duplicate();
|
458
|
+
pointTester.setEndPoint('StartToStart', textRangeStart);
|
459
|
+
var nTextCount = pointTester.text.replace(/[\r\n]/g, '').length;
|
303
460
|
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
461
|
+
while (nTextCount > elCurText.nodeValue.length && elCurText.nextSibling) {
|
462
|
+
nTextCount -= elCurText.nodeValue.length;
|
463
|
+
elCurText = elCurText.nextSibling;
|
464
|
+
}
|
465
|
+
var sDummy = elCurText.nodeValue; //enforce IE to re-reference elCurText
|
309
466
|
|
310
|
-
|
311
|
-
|
312
|
-
|
467
|
+
if (bStart && elCurText.nextSibling && dom.isText(elCurText.nextSibling) &&
|
468
|
+
nTextCount == elCurText.nodeValue.length) {
|
469
|
+
nTextCount -= elCurText.nodeValue.length;
|
313
470
|
elCurText = elCurText.nextSibling;
|
471
|
+
}
|
472
|
+
|
473
|
+
elCont = elCurText;
|
474
|
+
nOffset = nTextCount;
|
314
475
|
}
|
315
476
|
|
316
|
-
elCont
|
317
|
-
|
318
|
-
}
|
477
|
+
return {cont: elCont, offset: nOffset};
|
478
|
+
};
|
319
479
|
|
320
|
-
return
|
321
|
-
|
480
|
+
// return TextRange from boundary point (inspired by google closure-library)
|
481
|
+
var bp2textRange = function(bp) {
|
482
|
+
var textRangeInfo = function(elCont, nOffset) {
|
483
|
+
var elNode, bCollapseToStart;
|
322
484
|
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
if (dom.isText(elNode)) {
|
338
|
-
return textRangeInfo(elNode, nOffset);
|
485
|
+
if (dom.isText(elCont)) {
|
486
|
+
var aPrevText = dom.listPrev(elCont, func.not(dom.isText));
|
487
|
+
var elPrevCont = list.last(aPrevText).previousSibling;
|
488
|
+
elNode = elPrevCont || elCont.parentNode;
|
489
|
+
nOffset += list.sum(list.tail(aPrevText), dom.length);
|
490
|
+
bCollapseToStart = !elPrevCont;
|
491
|
+
} else {
|
492
|
+
elNode = elCont.childNodes[nOffset] || elCont;
|
493
|
+
if (dom.isText(elNode)) {
|
494
|
+
return textRangeInfo(elNode, nOffset);
|
495
|
+
}
|
496
|
+
|
497
|
+
nOffset = 0;
|
498
|
+
bCollapseToStart = false;
|
339
499
|
}
|
340
500
|
|
341
|
-
|
342
|
-
|
343
|
-
}
|
501
|
+
return {cont: elNode, collapseToStart: bCollapseToStart, offset: nOffset};
|
502
|
+
};
|
344
503
|
|
345
|
-
|
346
|
-
|
504
|
+
var textRange = document.body.createTextRange();
|
505
|
+
var info = textRangeInfo(bp.cont, bp.offset);
|
347
506
|
|
348
|
-
|
349
|
-
|
507
|
+
textRange.moveToElementText(info.cont);
|
508
|
+
textRange.collapse(info.collapseToStart);
|
509
|
+
textRange.moveStart('character', info.offset);
|
510
|
+
return textRange;
|
511
|
+
};
|
350
512
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
};
|
513
|
+
// {startContainer, startOffset, endContainer, endOffset}
|
514
|
+
var WrappedRange = function(sc, so, ec, eo) {
|
515
|
+
this.sc = sc; this.so = so;
|
516
|
+
this.ec = ec; this.eo = eo;
|
356
517
|
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
518
|
+
// nativeRange: get nativeRange from sc, so, ec, eo
|
519
|
+
var nativeRange = function() {
|
520
|
+
if (bW3CRangeSupport) {
|
521
|
+
var w3cRange = document.createRange();
|
522
|
+
w3cRange.setStart(sc, so);
|
523
|
+
w3cRange.setEnd(ec, eo);
|
524
|
+
return w3cRange;
|
525
|
+
} else {
|
526
|
+
var textRange = bp2textRange({cont:sc, offset:so});
|
527
|
+
textRange.setEndPoint('EndToEnd', bp2textRange({cont:ec, offset:eo}));
|
528
|
+
return textRange;
|
529
|
+
}
|
530
|
+
};
|
370
531
|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
var range = document.createRange();
|
383
|
-
range.setStart(sc, so);
|
384
|
-
range.setEnd(ec, eo);
|
385
|
-
return range;
|
386
|
-
} else {
|
387
|
-
var textRange = bp2textRange({cont:sc, offset:so});
|
388
|
-
textRange.setEndPoint('EndToEnd', bp2textRange({cont:ec, offset:eo}));
|
389
|
-
return textRange;
|
390
|
-
}
|
391
|
-
};
|
392
|
-
|
393
|
-
// select: update visible range
|
394
|
-
this.select = function() {
|
395
|
-
var nativeRng = nativeRange();
|
396
|
-
if (bW3CRangeSupport) {
|
397
|
-
var selection = document.getSelection();
|
398
|
-
if (selection.rangeCount > 0) { selection.removeAllRanges(); }
|
399
|
-
selection.addRange(nativeRng);
|
400
|
-
} else {
|
401
|
-
nativeRng.select();
|
402
|
-
}
|
403
|
-
};
|
404
|
-
|
405
|
-
// listPara: listing paragraphs on range
|
406
|
-
this.listPara = function() {
|
407
|
-
var aNode = dom.listBetween(sc, ec);
|
408
|
-
var aPara = list.compact($.map(aNode, function(node) {
|
409
|
-
return dom.ancestor(node, dom.isPara);
|
410
|
-
}));
|
411
|
-
return $.map(list.clusterBy(aPara, func.eq2), list.head);
|
412
|
-
};
|
413
|
-
|
414
|
-
// isOnList: judge whether range is on list node or not
|
415
|
-
this.isOnList = function() {
|
416
|
-
var elStart = dom.ancestor(sc, dom.isList),
|
417
|
-
elEnd = dom.ancestor(ec, dom.isList);
|
418
|
-
return elStart && (elStart === elEnd);
|
419
|
-
};
|
532
|
+
// select: update visible range
|
533
|
+
this.select = function() {
|
534
|
+
var nativeRng = nativeRange();
|
535
|
+
if (bW3CRangeSupport) {
|
536
|
+
var selection = document.getSelection();
|
537
|
+
if (selection.rangeCount > 0) { selection.removeAllRanges(); }
|
538
|
+
selection.addRange(nativeRng);
|
539
|
+
} else {
|
540
|
+
nativeRng.select();
|
541
|
+
}
|
542
|
+
};
|
420
543
|
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
544
|
+
// listPara: listing paragraphs on range
|
545
|
+
this.listPara = function() {
|
546
|
+
var aNode = dom.listBetween(sc, ec);
|
547
|
+
var aPara = list.compact($.map(aNode, function(node) {
|
548
|
+
return dom.ancestor(node, dom.isPara);
|
549
|
+
}));
|
550
|
+
return $.map(list.clusterBy(aPara, func.eq2), list.head);
|
551
|
+
};
|
427
552
|
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
nativeRng.insertNode(node);
|
436
|
-
} else {
|
437
|
-
nativeRng.pasteHTML(node.outerHTML); // NOTE: missing node reference.
|
438
|
-
}
|
439
|
-
};
|
553
|
+
// makeIsOn: return isOn(pred) function
|
554
|
+
var makeIsOn = function(pred) {
|
555
|
+
return function() {
|
556
|
+
var elAncestor = dom.ancestor(sc, pred);
|
557
|
+
return elAncestor && (elAncestor === dom.ancestor(ec, pred));
|
558
|
+
};
|
559
|
+
};
|
440
560
|
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
561
|
+
// isOnEditable: judge whether range is on editable or not
|
562
|
+
this.isOnEditable = makeIsOn(dom.isEditable);
|
563
|
+
// isOnList: judge whether range is on list node or not
|
564
|
+
this.isOnList = makeIsOn(dom.isList);
|
565
|
+
// isOnAnchor: judge whether range is on anchor node or not
|
566
|
+
this.isOnAnchor = makeIsOn(dom.isAnchor);
|
567
|
+
// isCollapsed: judge whether range was collapsed
|
568
|
+
this.isCollapsed = function() { return sc === ec && so === eo; };
|
569
|
+
|
570
|
+
// insertNode
|
571
|
+
this.insertNode = function(node) {
|
572
|
+
var nativeRng = nativeRange();
|
573
|
+
if (bW3CRangeSupport) {
|
574
|
+
nativeRng.insertNode(node);
|
575
|
+
} else {
|
576
|
+
nativeRng.pasteHTML(node.outerHTML); // NOTE: missing node reference.
|
577
|
+
}
|
578
|
+
};
|
449
579
|
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
580
|
+
this.toString = function() {
|
581
|
+
var nativeRng = nativeRange();
|
582
|
+
return bW3CRangeSupport ? nativeRng.toString() : nativeRng.text;
|
583
|
+
};
|
584
|
+
|
585
|
+
//bookmark: offsetPath bookmark
|
586
|
+
this.bookmark = function(elEditable) {
|
587
|
+
return {
|
588
|
+
s: { path: dom.makeOffsetPath(elEditable, sc), offset: so },
|
589
|
+
e: { path: dom.makeOffsetPath(elEditable, ec), offset: eo }
|
590
|
+
};
|
455
591
|
};
|
456
592
|
};
|
457
|
-
};
|
458
593
|
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
594
|
+
return { // Range Object
|
595
|
+
// create Range Object From arguments or Browser Selection
|
596
|
+
create : function(sc, so, ec, eo) {
|
597
|
+
if (arguments.length === 0) { // from Browser Selection
|
598
|
+
if (bW3CRangeSupport) { // webkit, firefox
|
599
|
+
var selection = document.getSelection();
|
600
|
+
if (selection.rangeCount === 0) { return null; }
|
601
|
+
|
602
|
+
var nativeRng = selection.getRangeAt(0);
|
603
|
+
sc = nativeRng.startContainer, so = nativeRng.startOffset,
|
604
|
+
ec = nativeRng.endContainer, eo = nativeRng.endOffset;
|
605
|
+
} else { // IE8: TextRange
|
606
|
+
var textRange = document.selection.createRange();
|
607
|
+
var textRangeEnd = textRange.duplicate(); textRangeEnd.collapse(false);
|
608
|
+
var textRangeStart = textRange; textRangeStart.collapse(true);
|
609
|
+
|
610
|
+
var bpStart = textRange2bp(textRangeStart, true),
|
611
|
+
bpEnd = textRange2bp(textRangeEnd, false);
|
612
|
+
|
613
|
+
sc = bpStart.cont, so = bpStart.offset;
|
614
|
+
ec = bpEnd.cont, eo = bpEnd.offset;
|
615
|
+
}
|
616
|
+
} else if (arguments.length === 2) { //collapsed
|
617
|
+
ec = sc; eo = so;
|
618
|
+
}
|
619
|
+
return new WrappedRange(sc, so, ec, eo);
|
620
|
+
},
|
621
|
+
// createFromBookmark
|
622
|
+
createFromBookmark : function(elEditable, bookmark) {
|
623
|
+
var sc = dom.fromOffsetPath(elEditable, bookmark.s.path);
|
624
|
+
var so = bookmark.s.offset;
|
625
|
+
var ec = dom.fromOffsetPath(elEditable, bookmark.e.path);
|
626
|
+
var eo = bookmark.e.offset;
|
627
|
+
return new WrappedRange(sc, so, ec, eo);
|
628
|
+
}
|
629
|
+
};
|
630
|
+
}();
|
466
631
|
|
467
632
|
/**
|
468
633
|
* Style
|
@@ -513,7 +678,7 @@
|
|
513
678
|
oStyle.aAncestor = dom.listAncestor(rng.sc, dom.isEditable);
|
514
679
|
|
515
680
|
return oStyle;
|
516
|
-
}
|
681
|
+
};
|
517
682
|
};
|
518
683
|
|
519
684
|
/**
|
@@ -523,7 +688,7 @@
|
|
523
688
|
var aUndo = [], aRedo = [];
|
524
689
|
|
525
690
|
var makeSnap = function(welEditable) {
|
526
|
-
var elEditable = welEditable[0], rng =
|
691
|
+
var elEditable = welEditable[0], rng = range.create();
|
527
692
|
return {
|
528
693
|
contents: welEditable.html(), bookmark: rng.bookmark(elEditable),
|
529
694
|
scrollTop: welEditable.scrollTop()
|
@@ -532,7 +697,7 @@
|
|
532
697
|
|
533
698
|
var applySnap = function(welEditable, oSnap) {
|
534
699
|
welEditable.html(oSnap.contents).scrollTop(oSnap.scrollTop);
|
535
|
-
|
700
|
+
range.createFromBookmark(welEditable[0], oSnap.bookmark).select();
|
536
701
|
};
|
537
702
|
|
538
703
|
this.undo = function(welEditable) {
|
@@ -556,11 +721,33 @@
|
|
556
721
|
* Editor
|
557
722
|
*/
|
558
723
|
var Editor = function() {
|
724
|
+
// save current range
|
725
|
+
this.saveRange = function(welEditable) {
|
726
|
+
welEditable.data('range', range.create());
|
727
|
+
}
|
728
|
+
|
729
|
+
// restore lately range
|
730
|
+
this.restoreRange = function(welEditable) {
|
731
|
+
var rng = welEditable.data('range');
|
732
|
+
if (rng) { rng.select(); }
|
733
|
+
}
|
734
|
+
|
559
735
|
//currentStyle
|
560
736
|
var style = new Style();
|
561
737
|
this.currentStyle = function(elTarget) {
|
562
|
-
|
563
|
-
return style.current(
|
738
|
+
var rng = range.create();
|
739
|
+
return rng.isOnEditable() && style.current(rng, elTarget);
|
740
|
+
};
|
741
|
+
|
742
|
+
this.tab = function(welEditable) {
|
743
|
+
recordUndo(welEditable);
|
744
|
+
var rng = range.create();
|
745
|
+
var sNbsp = new Array(welEditable.data('tabsize') + 1).join(' ');
|
746
|
+
rng.insertNode($('<span id="noteTab">' + sNbsp + '</span>')[0]);
|
747
|
+
var welTab = $('#noteTab').removeAttr('id');
|
748
|
+
rng = range.create(welTab[0], 1);
|
749
|
+
rng.select();
|
750
|
+
dom.remove(welTab[0]);
|
564
751
|
};
|
565
752
|
|
566
753
|
// undo
|
@@ -583,7 +770,7 @@
|
|
583
770
|
'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',
|
584
771
|
'insertOrderedList', 'insertUnorderedList',
|
585
772
|
'indent', 'outdent', 'formatBlock', 'removeFormat',
|
586
|
-
'backColor', 'foreColor', '
|
773
|
+
'backColor', 'foreColor', 'insertHorizontalRule'];
|
587
774
|
|
588
775
|
for (var idx = 0, len=aCmd.length; idx < len; idx ++) {
|
589
776
|
this[aCmd[idx]] = function(sCmd) {
|
@@ -594,57 +781,78 @@
|
|
594
781
|
}(aCmd[idx]);
|
595
782
|
}
|
596
783
|
|
784
|
+
this.insertImage = function(welEditable, sUrl) {
|
785
|
+
async.loadImage(sUrl).done(function(image) {
|
786
|
+
recordUndo(welEditable);
|
787
|
+
var welImage = $('<img>').attr('src', sUrl);
|
788
|
+
welImage.css('width', Math.min(welEditable.width(), image.width));
|
789
|
+
range.create().insertNode(welImage[0]);
|
790
|
+
}).fail(function(image) {
|
791
|
+
var callbacks = welEditable.data('callbacks');
|
792
|
+
if (callbacks.onImageUploadError) {
|
793
|
+
callbacks.onImageUploadError();
|
794
|
+
}
|
795
|
+
});
|
796
|
+
};
|
797
|
+
|
597
798
|
this.formatBlock = function(welEditable, sValue) {
|
598
|
-
|
599
|
-
|
799
|
+
recordUndo(welEditable);
|
800
|
+
sValue = agent.bMSIE ? '<' + sValue + '>' : sValue;
|
801
|
+
document.execCommand('FormatBlock', false, sValue);
|
600
802
|
};
|
601
803
|
|
602
804
|
this.fontSize = function(welEditable, sValue) {
|
603
805
|
recordUndo(welEditable);
|
604
806
|
document.execCommand('fontSize', false, 3);
|
605
|
-
|
606
|
-
|
607
|
-
|
807
|
+
if (agent.bFF) {
|
808
|
+
// firefox: <font size="3"> to <span style='font-size={sValue}px;'>, buggy
|
809
|
+
welEditable.find('font[size=3]').removeAttr('size').css('font-size', sValue + 'px');
|
810
|
+
} else {
|
811
|
+
// chrome: <span style="font-size: medium"> to <span style='font-size={sValue}px;'>
|
812
|
+
welEditable.find('span').filter(function() {
|
813
|
+
return this.style.fontSize == 'medium';
|
814
|
+
}).css('font-size', sValue + 'px');
|
815
|
+
}
|
608
816
|
};
|
609
817
|
|
610
818
|
this.lineHeight = function(welEditable, sValue) {
|
611
819
|
recordUndo(welEditable);
|
612
|
-
style.stylePara(
|
820
|
+
style.stylePara(range.create(), {lineHeight: sValue});
|
613
821
|
};
|
614
822
|
|
615
823
|
this.unlink = function(welEditable) {
|
616
|
-
var rng =
|
824
|
+
var rng = range.create();
|
617
825
|
if (rng.isOnAnchor()) {
|
618
826
|
recordUndo(welEditable);
|
619
827
|
var elAnchor = dom.ancestor(rng.sc, dom.isAnchor);
|
620
|
-
rng =
|
828
|
+
rng = range.create(elAnchor, 0, elAnchor, 1);
|
621
829
|
rng.select();
|
622
830
|
document.execCommand('unlink');
|
623
831
|
}
|
624
832
|
};
|
625
833
|
|
626
834
|
this.setLinkDialog = function(welEditable, fnShowDialog) {
|
627
|
-
var rng =
|
835
|
+
var rng = range.create();
|
628
836
|
if (rng.isOnAnchor()) {
|
629
837
|
var elAnchor = dom.ancestor(rng.sc, dom.isAnchor);
|
630
|
-
rng =
|
838
|
+
rng = range.create(elAnchor, 0, elAnchor, 1);
|
631
839
|
}
|
632
840
|
fnShowDialog({
|
633
841
|
range: rng,
|
634
842
|
text: rng.toString(),
|
635
|
-
url: rng.isOnAnchor() ? dom.ancestor(rng.sc, dom.isAnchor).href :
|
843
|
+
url: rng.isOnAnchor() ? dom.ancestor(rng.sc, dom.isAnchor).href : ''
|
636
844
|
}, function(sLinkUrl) {
|
637
845
|
rng.select(); recordUndo(welEditable);
|
638
846
|
|
639
|
-
var bProtocol = sLinkUrl.toLowerCase().indexOf(
|
640
|
-
var sLinkUrlWithProtocol = bProtocol ? sLinkUrl :
|
847
|
+
var bProtocol = sLinkUrl.toLowerCase().indexOf('://') !== -1;
|
848
|
+
var sLinkUrlWithProtocol = bProtocol ? sLinkUrl : 'http://' + sLinkUrl;
|
641
849
|
|
642
850
|
//IE: createLink when range collapsed.
|
643
|
-
if (bMSIE && rng.isCollapsed()) {
|
851
|
+
if (agent.bMSIE && rng.isCollapsed()) {
|
644
852
|
rng.insertNode($('<A id="linkAnchor">' + sLinkUrl + '</A>')[0]);
|
645
|
-
var welAnchor = $('#linkAnchor').removeAttr(
|
853
|
+
var welAnchor = $('#linkAnchor').removeAttr('id')
|
646
854
|
.attr('href', sLinkUrlWithProtocol);
|
647
|
-
rng =
|
855
|
+
rng = range.create(welAnchor[0], 0, welAnchor[0], 1);
|
648
856
|
rng.select();
|
649
857
|
} else {
|
650
858
|
document.execCommand('createlink', false, sLinkUrlWithProtocol);
|
@@ -654,10 +862,11 @@
|
|
654
862
|
|
655
863
|
this.color = function(welEditable, sObjColor) {
|
656
864
|
var oColor = JSON.parse(sObjColor);
|
865
|
+
var foreColor = oColor.foreColor, backColor = oColor.backColor;
|
657
866
|
|
658
867
|
recordUndo(welEditable);
|
659
|
-
document.execCommand('foreColor', false,
|
660
|
-
document.execCommand('backColor', false,
|
868
|
+
if (foreColor) { document.execCommand('foreColor', false, foreColor); }
|
869
|
+
if (backColor) { document.execCommand('backColor', false, backColor); }
|
661
870
|
};
|
662
871
|
|
663
872
|
this.insertTable = function(welEditable, sDim) {
|
@@ -666,7 +875,7 @@
|
|
666
875
|
var nCol = aDim[0], nRow = aDim[1];
|
667
876
|
|
668
877
|
var aTD = [], sTD;
|
669
|
-
var sWhitespace = bMSIE ? ' ' : '<br/>';
|
878
|
+
var sWhitespace = agent.bMSIE ? ' ' : '<br/>';
|
670
879
|
for (var idxCol = 0; idxCol < nCol; idxCol++) {
|
671
880
|
aTD.push('<td>' + sWhitespace + '</td>');
|
672
881
|
}
|
@@ -678,10 +887,10 @@
|
|
678
887
|
}
|
679
888
|
sTR = aTR.join('');
|
680
889
|
var sTable = '<table class="table table-bordered">' + sTR + '</table>';
|
681
|
-
(
|
890
|
+
range.create().insertNode($(sTable)[0]);
|
682
891
|
};
|
683
892
|
|
684
|
-
this.
|
893
|
+
this.floatMe = function(welEditable, sValue, elTarget) {
|
685
894
|
recordUndo(welEditable);
|
686
895
|
elTarget.style.cssFloat = sValue;
|
687
896
|
};
|
@@ -689,12 +898,17 @@
|
|
689
898
|
this.resize = function(welEditable, sValue, elTarget) {
|
690
899
|
recordUndo(welEditable);
|
691
900
|
elTarget.style.width = welEditable.width() * sValue + 'px';
|
692
|
-
elTarget.style.height =
|
901
|
+
elTarget.style.height = '';
|
693
902
|
};
|
694
903
|
|
695
|
-
this.resizeTo = function(pos,
|
696
|
-
|
697
|
-
|
904
|
+
this.resizeTo = function(pos, welTarget) {
|
905
|
+
var newRatio = pos.y / pos.x;
|
906
|
+
var ratio = welTarget.data('ratio');
|
907
|
+
|
908
|
+
welTarget.css({
|
909
|
+
width: ratio > newRatio ? pos.x : pos.y / ratio,
|
910
|
+
height: ratio > newRatio ? pos.x * ratio : pos.y
|
911
|
+
});
|
698
912
|
};
|
699
913
|
};
|
700
914
|
|
@@ -759,39 +973,55 @@
|
|
759
973
|
var oColor = JSON.parse(welRecentColor.attr('data-value'));
|
760
974
|
oColor[sEvent] = sValue;
|
761
975
|
welRecentColor.attr('data-value', JSON.stringify(oColor));
|
762
|
-
var sKey = sEvent ===
|
976
|
+
var sKey = sEvent === 'backColor' ? 'background-color' : 'color';
|
763
977
|
welRecentColor.find('i').css(sKey, sValue);
|
764
978
|
};
|
979
|
+
|
980
|
+
this.updateFullscreen = function(welToolbar, bFullscreen) {
|
981
|
+
var welBtn = welToolbar.find('button[data-event="fullscreen"]');
|
982
|
+
welBtn[bFullscreen ? 'addClass' : 'removeClass']('active');
|
983
|
+
};
|
984
|
+
this.updateCodeview = function(welToolbar, bCodeview) {
|
985
|
+
var welBtn = welToolbar.find('button[data-event="codeview"]');
|
986
|
+
welBtn[bCodeview ? 'addClass' : 'removeClass']('active');
|
987
|
+
};
|
988
|
+
|
989
|
+
this.enable = function(welToolbar) {
|
990
|
+
welToolbar.find('button').not('button[data-event="codeview"]').removeClass('disabled');
|
991
|
+
};
|
992
|
+
|
993
|
+
this.disable = function(welToolbar) {
|
994
|
+
welToolbar.find('button').not('button[data-event="codeview"]').addClass('disabled');
|
995
|
+
};
|
765
996
|
};
|
766
997
|
|
767
998
|
/**
|
768
|
-
* Popover
|
999
|
+
* Popover (http://getbootstrap.com/javascript/#popovers)
|
769
1000
|
*/
|
770
1001
|
var Popover = function() {
|
1002
|
+
var showPopover = function(welPopover, elPlaceholder) {
|
1003
|
+
var welPlaceHolder = $(elPlaceholder);
|
1004
|
+
var pos = welPlaceHolder.position(), height = welPlaceHolder.height();
|
1005
|
+
welPopover.css({
|
1006
|
+
display: 'block',
|
1007
|
+
left: pos.left,
|
1008
|
+
top: pos.top + height
|
1009
|
+
});
|
1010
|
+
};
|
1011
|
+
|
771
1012
|
this.update = function(welPopover, oStyle) {
|
772
1013
|
var welLinkPopover = welPopover.find('.note-link-popover'),
|
773
1014
|
welImagePopover = welPopover.find('.note-image-popover');
|
774
1015
|
if (oStyle.anchor) {
|
775
1016
|
var welAnchor = welLinkPopover.find('a');
|
776
1017
|
welAnchor.attr('href', oStyle.anchor.href).html(oStyle.anchor.href);
|
777
|
-
|
778
|
-
var rect = oStyle.anchor.getBoundingClientRect();
|
779
|
-
welLinkPopover.css({
|
780
|
-
display: 'block',
|
781
|
-
left: rect.left,
|
782
|
-
top: $(document).scrollTop() + rect.bottom
|
783
|
-
});
|
1018
|
+
showPopover(welLinkPopover, oStyle.anchor);
|
784
1019
|
} else {
|
785
1020
|
welLinkPopover.hide();
|
786
1021
|
}
|
787
1022
|
|
788
1023
|
if (oStyle.image) {
|
789
|
-
|
790
|
-
welImagePopover.css({
|
791
|
-
display: 'block',
|
792
|
-
left: rect.left,
|
793
|
-
top: $(document).scrollTop() + rect.bottom
|
794
|
-
});
|
1024
|
+
showPopover(welImagePopover, oStyle.image);
|
795
1025
|
} else {
|
796
1026
|
welImagePopover.hide();
|
797
1027
|
}
|
@@ -809,15 +1039,15 @@
|
|
809
1039
|
this.update = function(welHandle, oStyle) {
|
810
1040
|
var welSelection = welHandle.find('.note-control-selection');
|
811
1041
|
if (oStyle.image) {
|
812
|
-
var
|
1042
|
+
var welImage = $(oStyle.image);
|
1043
|
+
var pos = welImage.position();
|
1044
|
+
var szImage = {w: welImage.width(), h: welImage.height()};
|
813
1045
|
welSelection.css({
|
814
1046
|
display: 'block',
|
815
|
-
left:
|
816
|
-
|
817
|
-
width: rect.width + 'px',
|
818
|
-
height: rect.height + 'px'
|
1047
|
+
left: pos.left, top: pos.top,
|
1048
|
+
width: szImage.w, height: szImage.h
|
819
1049
|
}).data('target', oStyle.image); // save current image element.
|
820
|
-
var sSizing =
|
1050
|
+
var sSizing = szImage.w + 'x' + szImage.h;
|
821
1051
|
welSelection.find('.note-control-selection-info').text(sSizing);
|
822
1052
|
} else {
|
823
1053
|
welSelection.hide();
|
@@ -833,23 +1063,40 @@
|
|
833
1063
|
* Dialog
|
834
1064
|
*/
|
835
1065
|
var Dialog = function() {
|
836
|
-
this.showImageDialog = function(welDialog, hDropImage, fnInsertImages) {
|
1066
|
+
this.showImageDialog = function(welDialog, hDropImage, fnInsertImages, fnInsertImage) {
|
837
1067
|
var welImageDialog = welDialog.find('.note-image-dialog');
|
838
1068
|
var welDropzone = welDialog.find('.note-dropzone'),
|
839
|
-
welImageInput = welDialog.find('.note-image-input')
|
1069
|
+
welImageInput = welDialog.find('.note-image-input'),
|
1070
|
+
welImageUrl = welDialog.find('.note-image-url'),
|
1071
|
+
welImageBtn = welDialog.find('.note-image-btn');
|
840
1072
|
|
841
1073
|
welImageDialog.on('shown.bs.modal', function(e) {
|
842
1074
|
welDropzone.on('dragenter dragover dragleave', false);
|
843
1075
|
welDropzone.on('drop', function(e) {
|
844
1076
|
hDropImage(e); welImageDialog.modal('hide');
|
845
1077
|
});
|
846
|
-
welImageInput.on('change', function() {
|
1078
|
+
welImageInput.on('change', function(event) {
|
847
1079
|
fnInsertImages(this.files); $(this).val('');
|
848
1080
|
welImageDialog.modal('hide');
|
849
1081
|
});
|
1082
|
+
welImageUrl.val('').keyup(function(event) {
|
1083
|
+
if (welImageUrl.val()) {
|
1084
|
+
welImageBtn.removeClass('disabled').attr('disabled', false);
|
1085
|
+
} else {
|
1086
|
+
welImageBtn.addClass('disabled').attr('disabled', true);
|
1087
|
+
}
|
1088
|
+
}).trigger('focus');
|
1089
|
+
welImageBtn.click(function(event) {
|
1090
|
+
welImageDialog.modal('hide');
|
1091
|
+
fnInsertImage(welImageUrl.val());
|
1092
|
+
event.preventDefault();
|
1093
|
+
});
|
850
1094
|
}).on('hidden.bs.modal', function(e) {
|
851
1095
|
welDropzone.off('dragenter dragover dragleave drop');
|
852
1096
|
welImageInput.off('change');
|
1097
|
+
welImageDialog.off('shown.bs.modal hidden.bs.modal');
|
1098
|
+
welImageUrl.off('keyup');
|
1099
|
+
welImageBtn.off('click');
|
853
1100
|
}).modal('show');
|
854
1101
|
};
|
855
1102
|
|
@@ -868,7 +1115,7 @@
|
|
868
1115
|
welLinkBtn.addClass('disabled').attr('disabled', true);
|
869
1116
|
}
|
870
1117
|
|
871
|
-
if (!linkInfo.text) { welLinkText.html(welLinkUrl.val()); }
|
1118
|
+
if (!linkInfo.text) { welLinkText.html(welLinkUrl.val()); }
|
872
1119
|
}).trigger('focus');
|
873
1120
|
welLinkBtn.click(function(event) {
|
874
1121
|
welLinkDialog.modal('hide'); //hide and createLink (ie9+)
|
@@ -877,8 +1124,8 @@
|
|
877
1124
|
});
|
878
1125
|
}).on('hidden.bs.modal', function(e) {
|
879
1126
|
welLinkUrl.off('keyup');
|
880
|
-
welLinkDialog.off('shown.bs.modal hidden.bs.modal');
|
881
1127
|
welLinkBtn.off('click');
|
1128
|
+
welLinkDialog.off('shown.bs.modal hidden.bs.modal');
|
882
1129
|
}).modal('show');
|
883
1130
|
};
|
884
1131
|
|
@@ -910,6 +1157,7 @@
|
|
910
1157
|
editor: function() { return welEditor; },
|
911
1158
|
toolbar: function() { return welEditor.find('.note-toolbar'); },
|
912
1159
|
editable: function() { return welEditor.find('.note-editable'); },
|
1160
|
+
codable: function() { return welEditor.find('.note-codable'); },
|
913
1161
|
statusbar: function() { return welEditor.find('.note-statusbar'); },
|
914
1162
|
popover: function() { return welEditor.find('.note-popover'); },
|
915
1163
|
handle: function() { return welEditor.find('.note-handle'); },
|
@@ -918,14 +1166,16 @@
|
|
918
1166
|
};
|
919
1167
|
|
920
1168
|
var hKeydown = function(event) {
|
921
|
-
var bCmd = bMac ? event.metaKey : event.ctrlKey,
|
1169
|
+
var bCmd = agent.bMac ? event.metaKey : event.ctrlKey,
|
922
1170
|
bShift = event.shiftKey, keyCode = event.keyCode;
|
923
1171
|
|
924
1172
|
// optimize
|
925
1173
|
var bExecCmd = (bCmd || bShift || keyCode === key.TAB);
|
926
1174
|
var oLayoutInfo = (bExecCmd) ? makeLayoutInfo(event.target) : null;
|
927
1175
|
|
928
|
-
if (
|
1176
|
+
if (keyCode === key.TAB && oLayoutInfo.editable().data('tabsize')) {
|
1177
|
+
editor.tab(oLayoutInfo.editable());
|
1178
|
+
} else if (bCmd && ((bShift && keyCode === key.Z) || keyCode === key.Y)) {
|
929
1179
|
editor.redo(oLayoutInfo.editable());
|
930
1180
|
} else if (bCmd && keyCode === key.Z) {
|
931
1181
|
editor.undo(oLayoutInfo.editable());
|
@@ -940,6 +1190,7 @@
|
|
940
1190
|
} else if (bCmd && keyCode === key.BACKSLACH) {
|
941
1191
|
editor.removeFormat(oLayoutInfo.editable());
|
942
1192
|
} else if (bCmd && keyCode === key.K) {
|
1193
|
+
oLayoutInfo.editable();
|
943
1194
|
editor.setLinkDialog(oLayoutInfo.editable(), function(linkInfo, cb) {
|
944
1195
|
dialog.showLinkDialog(oLayoutInfo.dialog(), linkInfo, cb);
|
945
1196
|
});
|
@@ -979,14 +1230,21 @@
|
|
979
1230
|
};
|
980
1231
|
|
981
1232
|
var insertImages = function(welEditable, files) {
|
982
|
-
welEditable.
|
983
|
-
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
|
989
|
-
|
1233
|
+
var callbacks = welEditable.data('callbacks');
|
1234
|
+
editor.restoreRange(welEditable);
|
1235
|
+
if (callbacks.onImageUpload) { // call custom handler
|
1236
|
+
callbacks.onImageUpload(files, editor, welEditable);
|
1237
|
+
} else {
|
1238
|
+
$.each(files, function(idx, file) {
|
1239
|
+
async.readFile(file).done(function(sURL) {
|
1240
|
+
editor.insertImage(welEditable, sURL);
|
1241
|
+
}).fail(function() {
|
1242
|
+
if (callbacks.onImageUploadError) {
|
1243
|
+
callbacks.onImageUploadError();
|
1244
|
+
}
|
1245
|
+
});
|
1246
|
+
});
|
1247
|
+
}
|
990
1248
|
};
|
991
1249
|
|
992
1250
|
var hDropImage = function(event) {
|
@@ -1001,12 +1259,11 @@
|
|
1001
1259
|
|
1002
1260
|
var hMousedown = function(event) {
|
1003
1261
|
//preventDefault Selection for FF, IE8+
|
1004
|
-
if (dom.isImg(event.target)) { event.preventDefault(); }
|
1262
|
+
if (dom.isImg(event.target)) { event.preventDefault(); }
|
1005
1263
|
};
|
1006
1264
|
|
1007
1265
|
var hToolbarAndPopoverUpdate = function(event) {
|
1008
1266
|
var oLayoutInfo = makeLayoutInfo(event.currentTarget || event.target);
|
1009
|
-
|
1010
1267
|
var oStyle = editor.currentStyle(event.target);
|
1011
1268
|
if (!oStyle) { return; }
|
1012
1269
|
toolbar.update(oLayoutInfo.toolbar(), oStyle);
|
@@ -1027,19 +1284,25 @@
|
|
1027
1284
|
welHandle = oLayoutInfo.handle(), welPopover = oLayoutInfo.popover(),
|
1028
1285
|
welEditable = oLayoutInfo.editable(), welEditor = oLayoutInfo.editor();
|
1029
1286
|
|
1030
|
-
var elTarget = welHandle.find('.note-control-selection').data('target')
|
1031
|
-
|
1287
|
+
var elTarget = welHandle.find('.note-control-selection').data('target'),
|
1288
|
+
welTarget = $(elTarget);
|
1289
|
+
var posStart = welTarget.offset(),
|
1032
1290
|
scrollTop = $(document).scrollTop(), posDistance;
|
1291
|
+
|
1033
1292
|
welEditor.on('mousemove', function(event) {
|
1034
1293
|
posDistance = {x: event.clientX - posStart.left,
|
1035
1294
|
y: event.clientY - (posStart.top - scrollTop)};
|
1036
|
-
editor.resizeTo(posDistance,
|
1295
|
+
editor.resizeTo(posDistance, welTarget);
|
1037
1296
|
handle.update(welHandle, {image: elTarget});
|
1038
1297
|
popover.update(welPopover, {image: elTarget});
|
1039
1298
|
}).on('mouseup', function() {
|
1040
1299
|
welEditor.off('mousemove').off('mouseup');
|
1041
1300
|
});
|
1042
1301
|
|
1302
|
+
if (!welTarget.data('ratio')) { // original ratio.
|
1303
|
+
welTarget.data('ratio', welTarget.height() / welTarget.width());
|
1304
|
+
}
|
1305
|
+
|
1043
1306
|
editor.recordUndo(welEditable);
|
1044
1307
|
event.stopPropagation(); event.preventDefault();
|
1045
1308
|
}
|
@@ -1060,11 +1323,12 @@
|
|
1060
1323
|
|
1061
1324
|
var oLayoutInfo = makeLayoutInfo(event.target);
|
1062
1325
|
var welDialog = oLayoutInfo.dialog(),
|
1063
|
-
welEditable = oLayoutInfo.editable()
|
1326
|
+
welEditable = oLayoutInfo.editable(),
|
1327
|
+
welCodable = oLayoutInfo.codable();
|
1064
1328
|
|
1065
1329
|
// before command
|
1066
1330
|
var elTarget;
|
1067
|
-
if ($.inArray(sEvent, ['resize', '
|
1331
|
+
if ($.inArray(sEvent, ['resize', 'floatMe']) !== -1) {
|
1068
1332
|
var welHandle = oLayoutInfo.handle();
|
1069
1333
|
var welSelection = welHandle.find('.note-control-selection');
|
1070
1334
|
elTarget = welSelection.data('target');
|
@@ -1076,18 +1340,62 @@
|
|
1076
1340
|
}
|
1077
1341
|
|
1078
1342
|
// after command
|
1079
|
-
if ($.inArray(sEvent, [
|
1343
|
+
if ($.inArray(sEvent, ['backColor', 'foreColor']) !== -1) {
|
1080
1344
|
toolbar.updateRecentColor(welBtn[0], sEvent, sValue);
|
1081
|
-
} else if (sEvent ===
|
1345
|
+
} else if (sEvent === 'showLinkDialog') { // popover to dialog
|
1346
|
+
welEditable.focus();
|
1082
1347
|
editor.setLinkDialog(welEditable, function(linkInfo, cb) {
|
1083
1348
|
dialog.showLinkDialog(welDialog, linkInfo, cb);
|
1084
1349
|
});
|
1085
|
-
} else if (sEvent ===
|
1350
|
+
} else if (sEvent === 'showImageDialog') {
|
1351
|
+
welEditable.focus();
|
1086
1352
|
dialog.showImageDialog(welDialog, hDropImage, function(files) {
|
1087
1353
|
insertImages(welEditable, files);
|
1354
|
+
}, function(sUrl) {
|
1355
|
+
editor.restoreRange(welEditable);
|
1356
|
+
editor.insertImage(welEditable, sUrl);
|
1088
1357
|
});
|
1089
|
-
} else if (sEvent ===
|
1358
|
+
} else if (sEvent === 'showHelpDialog') {
|
1090
1359
|
dialog.showHelpDialog(welDialog);
|
1360
|
+
} else if (sEvent === 'fullscreen') {
|
1361
|
+
var welEditor = oLayoutInfo.editor();
|
1362
|
+
welEditor.toggleClass('fullscreen');
|
1363
|
+
|
1364
|
+
var welToolbar = oLayoutInfo.toolbar();
|
1365
|
+
var hResizeFullscreen = function() {
|
1366
|
+
var nHeight = $(window).height() - welToolbar.outerHeight();
|
1367
|
+
welEditable.css('height', nHeight);
|
1368
|
+
};
|
1369
|
+
|
1370
|
+
var bFullscreen = welEditor.hasClass('fullscreen');
|
1371
|
+
if (bFullscreen) {
|
1372
|
+
welEditable.data('orgHeight', welEditable.css('height'));
|
1373
|
+
$(window).resize(hResizeFullscreen).trigger('resize');
|
1374
|
+
} else {
|
1375
|
+
welEditable.css('height', welEditable.data('orgHeight'));
|
1376
|
+
$(window).off('resize');
|
1377
|
+
}
|
1378
|
+
|
1379
|
+
toolbar.updateFullscreen(welToolbar, bFullscreen);
|
1380
|
+
} else if (sEvent === 'codeview') {
|
1381
|
+
var welEditor = oLayoutInfo.editor(),
|
1382
|
+
welToolbar = oLayoutInfo.toolbar();
|
1383
|
+
welEditor.toggleClass('codeview');
|
1384
|
+
|
1385
|
+
var bCodeview = welEditor.hasClass('codeview');
|
1386
|
+
if (bCodeview) {
|
1387
|
+
welCodable.val(welEditable.html());
|
1388
|
+
welCodable.height(welEditable.height());
|
1389
|
+
toolbar.disable(welToolbar);
|
1390
|
+
welCodable.focus();
|
1391
|
+
} else {
|
1392
|
+
welEditable.html(welCodable.val());
|
1393
|
+
welEditable.height(welCodable.height());
|
1394
|
+
toolbar.enable(welToolbar);
|
1395
|
+
welEditable.focus();
|
1396
|
+
}
|
1397
|
+
|
1398
|
+
toolbar.updateCodeview(oLayoutInfo.toolbar(), bCodeview);
|
1091
1399
|
}
|
1092
1400
|
|
1093
1401
|
hToolbarAndPopoverUpdate(event);
|
@@ -1097,7 +1405,9 @@
|
|
1097
1405
|
var EDITABLE_PADDING = 24;
|
1098
1406
|
var hStatusbarMousedown = function(event) {
|
1099
1407
|
var welDocument = $(document);
|
1100
|
-
var
|
1408
|
+
var oLayoutInfo = makeLayoutInfo(event.target);
|
1409
|
+
var welEditable = oLayoutInfo.editable(),
|
1410
|
+
welCodable = oLayoutInfo.codable();
|
1101
1411
|
|
1102
1412
|
var nEditableTop = welEditable.offset().top - welDocument.scrollTop();
|
1103
1413
|
var hMousemove = function(event) {
|
@@ -1106,7 +1416,7 @@
|
|
1106
1416
|
var hMouseup = function() {
|
1107
1417
|
welDocument.unbind('mousemove', hMousemove)
|
1108
1418
|
.unbind('mouseup', hMouseup);
|
1109
|
-
}
|
1419
|
+
};
|
1110
1420
|
welDocument.mousemove(hMousemove).mouseup(hMouseup);
|
1111
1421
|
event.stopPropagation(); event.preventDefault();
|
1112
1422
|
};
|
@@ -1145,6 +1455,12 @@
|
|
1145
1455
|
welDimensionDisplay.html(dim.c + ' x ' + dim.r);
|
1146
1456
|
};
|
1147
1457
|
|
1458
|
+
/**
|
1459
|
+
* Attach eventhandler
|
1460
|
+
* @param {object} oLayoutInfo - layout Informations
|
1461
|
+
* @param {object} options - user options include custom event handlers
|
1462
|
+
* @param {function} options.enter - enter key handler
|
1463
|
+
*/
|
1148
1464
|
this.attach = function(oLayoutInfo, options) {
|
1149
1465
|
oLayoutInfo.editable.on('keydown', hKeydown);
|
1150
1466
|
oLayoutInfo.editable.on('mousedown', hMousedown);
|
@@ -1168,8 +1484,13 @@
|
|
1168
1484
|
var welCatcher = welToolbar.find('.note-dimension-picker-mousecatcher');
|
1169
1485
|
welCatcher.on('mousemove', hDimensionPickerMove);
|
1170
1486
|
|
1171
|
-
//
|
1172
|
-
|
1487
|
+
// save selection when focusout
|
1488
|
+
oLayoutInfo.editable.on('blur', function() {
|
1489
|
+
editor.saveRange(oLayoutInfo.editable);
|
1490
|
+
});
|
1491
|
+
|
1492
|
+
// basic event callbacks (lowercase)
|
1493
|
+
// enter, focus, blur, keyup, keydown
|
1173
1494
|
if (options.onenter) {
|
1174
1495
|
oLayoutInfo.editable.keypress(function(event) {
|
1175
1496
|
if (event.keyCode === key.ENTER) { options.onenter(event);}
|
@@ -1177,11 +1498,18 @@
|
|
1177
1498
|
}
|
1178
1499
|
if (options.onfocus) { oLayoutInfo.editable.focus(options.onfocus); }
|
1179
1500
|
if (options.onblur) { oLayoutInfo.editable.blur(options.onblur); }
|
1180
|
-
if (options.onkeyup) { oLayoutInfo.editable.
|
1181
|
-
if (options.onkeydown) { oLayoutInfo.editable.
|
1182
|
-
|
1183
|
-
//
|
1184
|
-
//
|
1501
|
+
if (options.onkeyup) { oLayoutInfo.editable.keyup(options.onkeyup); }
|
1502
|
+
if (options.onkeydown) { oLayoutInfo.editable.keydown(options.onkeydown); }
|
1503
|
+
|
1504
|
+
// callbacks for advanced features (camel)
|
1505
|
+
// All editor status will be saved on editable with jquery's data
|
1506
|
+
// for support multiple editor with singleton object.
|
1507
|
+
oLayoutInfo.editable.data('callbacks', {
|
1508
|
+
onChange: options.onChange, onAutoSave: options.onAutoSave,
|
1509
|
+
onPasteBefore: options.onPasteBefore, onPasteAfter: options.onPasteAfter,
|
1510
|
+
onImageUpload: options.onImageUpload, onImageUploadError: options.onImageUpload,
|
1511
|
+
onFileUpload: options.onFileUpload, onFileUploadError: options.onFileUpload
|
1512
|
+
});
|
1185
1513
|
};
|
1186
1514
|
|
1187
1515
|
this.dettach = function(oLayoutInfo) {
|
@@ -1200,11 +1528,11 @@
|
|
1200
1528
|
var Renderer = function() {
|
1201
1529
|
var aToolbarItem = {
|
1202
1530
|
picture:
|
1203
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Picture" data-event="showImageDialog" tabindex="-1"><i class="icon-picture"></i></button>',
|
1531
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Picture" data-event="showImageDialog" tabindex="-1"><i class="fa fa-picture-o icon-picture"></i></button>',
|
1204
1532
|
link:
|
1205
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Link" data-event="showLinkDialog" data-shortcut="Ctrl+K" data-mac-shortcut="⌘+K" tabindex="-1"><i class="icon-link"></i></button>',
|
1533
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Link" data-event="showLinkDialog" data-shortcut="Ctrl+K" data-mac-shortcut="⌘+K" tabindex="-1"><i class="fa fa-link icon-link"></i></button>',
|
1206
1534
|
table:
|
1207
|
-
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" title="Table" data-toggle="dropdown" tabindex="-1"><i class="icon-table"></i> <span class="caret"></span></button>' +
|
1535
|
+
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" title="Table" data-toggle="dropdown" tabindex="-1"><i class="fa fa-table icon-table"></i> <span class="caret"></span></button>' +
|
1208
1536
|
'<ul class="dropdown-menu">' +
|
1209
1537
|
'<div class="note-dimension-picker">' +
|
1210
1538
|
'<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>' +
|
@@ -1214,7 +1542,7 @@
|
|
1214
1542
|
'<div class="note-dimension-display"> 1 x 1 </div>' +
|
1215
1543
|
'</ul>',
|
1216
1544
|
style:
|
1217
|
-
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" title="Style" data-toggle="dropdown" tabindex="-1"><i class="icon-magic"></i> <span class="caret"></span></button>' +
|
1545
|
+
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" title="Style" data-toggle="dropdown" tabindex="-1"><i class="fa fa-magic icon-magic"></i> <span class="caret"></span></button>' +
|
1218
1546
|
'<ul class="dropdown-menu">' +
|
1219
1547
|
'<li><a data-event="formatBlock" data-value="p">Normal</a></li>' +
|
1220
1548
|
'<li><a data-event="formatBlock" data-value="blockquote"><blockquote>Quote</blockquote></a></li>' +
|
@@ -1229,18 +1557,18 @@
|
|
1229
1557
|
fontsize:
|
1230
1558
|
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" data-toggle="dropdown" title="Font Size" tabindex="-1"><span class="note-current-fontsize">11</span> <b class="caret"></b></button>' +
|
1231
1559
|
'<ul class="dropdown-menu">' +
|
1232
|
-
'<li><a data-event="fontSize" data-value="8"><i class="icon-ok"></i> 8</a></li>' +
|
1233
|
-
'<li><a data-event="fontSize" data-value="9"><i class="icon-ok"></i> 9</a></li>' +
|
1234
|
-
'<li><a data-event="fontSize" data-value="10"><i class="icon-ok"></i> 10</a></li>' +
|
1235
|
-
'<li><a data-event="fontSize" data-value="11"><i class="icon-ok"></i> 11</a></li>' +
|
1236
|
-
'<li><a data-event="fontSize" data-value="12"><i class="icon-ok"></i> 12</a></li>' +
|
1237
|
-
'<li><a data-event="fontSize" data-value="14"><i class="icon-ok"></i> 14</a></li>' +
|
1238
|
-
'<li><a data-event="fontSize" data-value="18"><i class="icon-ok"></i> 18</a></li>' +
|
1239
|
-
'<li><a data-event="fontSize" data-value="24"><i class="icon-ok"></i> 24</a></li>' +
|
1240
|
-
'<li><a data-event="fontSize" data-value="36"><i class="icon-ok"></i> 36</a></li>' +
|
1560
|
+
'<li><a data-event="fontSize" data-value="8"><i class="fa fa-check icon-ok"></i> 8</a></li>' +
|
1561
|
+
'<li><a data-event="fontSize" data-value="9"><i class="fa fa-check icon-ok"></i> 9</a></li>' +
|
1562
|
+
'<li><a data-event="fontSize" data-value="10"><i class="fa fa-check icon-ok"></i> 10</a></li>' +
|
1563
|
+
'<li><a data-event="fontSize" data-value="11"><i class="fa fa-check icon-ok"></i> 11</a></li>' +
|
1564
|
+
'<li><a data-event="fontSize" data-value="12"><i class="fa fa-check icon-ok"></i> 12</a></li>' +
|
1565
|
+
'<li><a data-event="fontSize" data-value="14"><i class="fa fa-check icon-ok"></i> 14</a></li>' +
|
1566
|
+
'<li><a data-event="fontSize" data-value="18"><i class="fa fa-check icon-ok"></i> 18</a></li>' +
|
1567
|
+
'<li><a data-event="fontSize" data-value="24"><i class="fa fa-check icon-ok"></i> 24</a></li>' +
|
1568
|
+
'<li><a data-event="fontSize" data-value="36"><i class="fa fa-check icon-ok"></i> 36</a></li>' +
|
1241
1569
|
'</ul>',
|
1242
1570
|
color:
|
1243
|
-
'<button type="button" class="btn btn-default btn-sm btn-small note-recent-color" title="Recent Color" data-event="color" data-value=\'{"
|
1571
|
+
'<button type="button" class="btn btn-default btn-sm btn-small note-recent-color" title="Recent Color" data-event="color" data-value=\'{"backColor":"yellow"}\' tabindex="-1"><i class="fa fa-font icon-font" style="color:black;background-color:yellow;"></i></button>' +
|
1244
1572
|
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" title="More Color" data-toggle="dropdown" tabindex="-1">' +
|
1245
1573
|
'<span class="caret"></span>' +
|
1246
1574
|
'</button>' +
|
@@ -1248,82 +1576,87 @@
|
|
1248
1576
|
'<li>' +
|
1249
1577
|
'<div class="btn-group">' +
|
1250
1578
|
'<div class="note-palette-title">BackColor</div>' +
|
1579
|
+
'<div class="note-color-reset" data-event="backColor" data-value="inherit" title="Transparent">Set transparent</div>' +
|
1251
1580
|
'<div class="note-color-palette" data-target-event="backColor"></div>' +
|
1252
1581
|
'</div>' +
|
1253
1582
|
'<div class="btn-group">' +
|
1254
1583
|
'<div class="note-palette-title">FontColor</div>' +
|
1584
|
+
'<div class="note-color-reset" data-event="foreColor" data-value="inherit" title="Reset">Reset to default</div>' +
|
1255
1585
|
'<div class="note-color-palette" data-target-event="foreColor"></div>' +
|
1256
1586
|
'</div>' +
|
1257
1587
|
'</li>' +
|
1258
1588
|
'</ul>',
|
1259
1589
|
bold:
|
1260
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Bold" data-shortcut="Ctrl+B" data-mac-shortcut="⌘+B" data-event="bold" tabindex="-1"><i class="icon-bold"></i></button>',
|
1590
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Bold" data-shortcut="Ctrl+B" data-mac-shortcut="⌘+B" data-event="bold" tabindex="-1"><i class="fa fa-bold icon-bold"></i></button>',
|
1261
1591
|
italic:
|
1262
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Italic" data-shortcut="Ctrl+I" data-mac-shortcut="⌘+I" data-event="italic" tabindex="-1"><i class="icon-italic"></i></button>',
|
1592
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Italic" data-shortcut="Ctrl+I" data-mac-shortcut="⌘+I" data-event="italic" tabindex="-1"><i class="fa fa-italic icon-italic"></i></button>',
|
1263
1593
|
underline:
|
1264
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Underline" data-shortcut="Ctrl+U" data-mac-shortcut="⌘+U" data-event="underline" tabindex="-1"><i class="icon-underline"></i></button>',
|
1594
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Underline" data-shortcut="Ctrl+U" data-mac-shortcut="⌘+U" data-event="underline" tabindex="-1"><i class="fa fa-underline icon-underline"></i></button>',
|
1265
1595
|
clear:
|
1266
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Remove Font Style" data-shortcut="Ctrl+\\" data-mac-shortcut="⌘+\\" data-event="removeFormat" tabindex="-1"><i class="icon-eraser"></i></button>',
|
1596
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Remove Font Style" data-shortcut="Ctrl+\\" data-mac-shortcut="⌘+\\" data-event="removeFormat" tabindex="-1"><i class="fa fa-eraser icon-eraser"></i></button>',
|
1267
1597
|
ul:
|
1268
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Unordered list" data-shortcut="Ctrl+Shift+8" data-mac-shortcut="⌘+⇧+7" data-event="insertUnorderedList" tabindex="-1"><i class="icon-list-ul"></i></button>',
|
1598
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Unordered list" data-shortcut="Ctrl+Shift+8" data-mac-shortcut="⌘+⇧+7" data-event="insertUnorderedList" tabindex="-1"><i class="fa fa-list-ul icon-list-ul"></i></button>',
|
1269
1599
|
ol:
|
1270
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Ordered list" data-shortcut="Ctrl+Shift+7" data-mac-shortcut="⌘+⇧+8" data-event="insertOrderedList" tabindex="-1"><i class="icon-list-ol"></i></button>',
|
1600
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Ordered list" data-shortcut="Ctrl+Shift+7" data-mac-shortcut="⌘+⇧+8" data-event="insertOrderedList" tabindex="-1"><i class="fa fa-list-ol icon-list-ol"></i></button>',
|
1271
1601
|
paragraph:
|
1272
|
-
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" title="Paragraph" data-toggle="dropdown" tabindex="-1"><i class="icon-align-left"></i> <span class="caret"></span></button>' +
|
1602
|
+
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" title="Paragraph" data-toggle="dropdown" tabindex="-1"><i class="fa fa-align-left icon-align-left"></i> <span class="caret"></span></button>' +
|
1273
1603
|
'<ul class="dropdown-menu">' +
|
1274
1604
|
'<li>' +
|
1275
1605
|
'<div class="note-align btn-group">' +
|
1276
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Align left" data-shortcut="Ctrl+Shift+L" data-mac-shortcut="⌘+⇧+L" data-event="justifyLeft" tabindex="-1"><i class="icon-align-left"></i></button>' +
|
1277
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Align center" data-shortcut="Ctrl+Shift+E" data-mac-shortcut="⌘+⇧+E" data-event="justifyCenter" tabindex="-1"><i class="icon-align-center"></i></button>' +
|
1278
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Align right" data-shortcut="Ctrl+Shift+R" data-mac-shortcut="⌘+⇧+R" data-event="justifyRight" tabindex="-1"><i class="icon-align-right"></i></button>' +
|
1279
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Justify full" data-shortcut="Ctrl+Shift+J" data-mac-shortcut="⌘+⇧+J" data-event="justifyFull" tabindex="-1"><i class="icon-align-justify"></i></button>' +
|
1606
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Align left" data-shortcut="Ctrl+Shift+L" data-mac-shortcut="⌘+⇧+L" data-event="justifyLeft" tabindex="-1"><i class="fa fa-align-left icon-align-left"></i></button>' +
|
1607
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Align center" data-shortcut="Ctrl+Shift+E" data-mac-shortcut="⌘+⇧+E" data-event="justifyCenter" tabindex="-1"><i class="fa fa-align-center icon-align-center"></i></button>' +
|
1608
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Align right" data-shortcut="Ctrl+Shift+R" data-mac-shortcut="⌘+⇧+R" data-event="justifyRight" tabindex="-1"><i class="fa fa-align-right icon-align-right"></i></button>' +
|
1609
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Justify full" data-shortcut="Ctrl+Shift+J" data-mac-shortcut="⌘+⇧+J" data-event="justifyFull" tabindex="-1"><i class="fa fa-align-justify icon-align-justify"></i></button>' +
|
1280
1610
|
'</div>' +
|
1281
1611
|
'</li>' +
|
1282
1612
|
'<li>' +
|
1283
1613
|
'<div class="note-list btn-group">' +
|
1284
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Outdent" data-shortcut="Ctrl+[" data-mac-shortcut="⌘+[" data-event="outdent" tabindex="-1"><i class="icon-indent-left"></i></button>' +
|
1285
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Indent" data-shortcut="Ctrl+]" data-mac-shortcut="⌘+]" data-event="indent" tabindex="-1"><i class="icon-indent-right"></i></button>' +
|
1614
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Outdent" data-shortcut="Ctrl+[" data-mac-shortcut="⌘+[" data-event="outdent" tabindex="-1"><i class="fa fa-outdent icon-indent-left"></i></button>' +
|
1615
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Indent" data-shortcut="Ctrl+]" data-mac-shortcut="⌘+]" data-event="indent" tabindex="-1"><i class="fa fa-indent icon-indent-right"></i></button>' +
|
1286
1616
|
'</li>' +
|
1287
1617
|
'</ul>',
|
1288
1618
|
height:
|
1289
|
-
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" data-toggle="dropdown" title="Line Height" tabindex="-1"><i class="icon-text-height"></i> <b class="caret"></b></button>' +
|
1619
|
+
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" data-toggle="dropdown" title="Line Height" tabindex="-1"><i class="fa fa-text-height icon-text-height"></i> <b class="caret"></b></button>' +
|
1290
1620
|
'<ul class="dropdown-menu">' +
|
1291
|
-
'<li><a data-event="lineHeight" data-value="1.0"><i class="icon-ok"></i> 1.0</a></li>' +
|
1292
|
-
'<li><a data-event="lineHeight" data-value="1.2"><i class="icon-ok"></i> 1.2</a></li>' +
|
1293
|
-
'<li><a data-event="lineHeight" data-value="1.4"><i class="icon-ok"></i> 1.4</a></li>' +
|
1294
|
-
'<li><a data-event="lineHeight" data-value="1.5"><i class="icon-ok"></i> 1.5</a></li>' +
|
1295
|
-
'<li><a data-event="lineHeight" data-value="1.6"><i class="icon-ok"></i> 1.6</a></li>' +
|
1296
|
-
'<li><a data-event="lineHeight" data-value="1.8"><i class="icon-ok"></i> 1.8</a></li>' +
|
1297
|
-
'<li><a data-event="lineHeight" data-value="2.0"><i class="icon-ok"></i> 2.0</a></li>' +
|
1298
|
-
'<li><a data-event="lineHeight" data-value="3.0"><i class="icon-ok"></i> 3.0</a></li>' +
|
1621
|
+
'<li><a data-event="lineHeight" data-value="1.0"><i class="fa fa-check icon-ok"></i> 1.0</a></li>' +
|
1622
|
+
'<li><a data-event="lineHeight" data-value="1.2"><i class="fa fa-check icon-ok"></i> 1.2</a></li>' +
|
1623
|
+
'<li><a data-event="lineHeight" data-value="1.4"><i class="fa fa-check icon-ok"></i> 1.4</a></li>' +
|
1624
|
+
'<li><a data-event="lineHeight" data-value="1.5"><i class="fa fa-check icon-ok"></i> 1.5</a></li>' +
|
1625
|
+
'<li><a data-event="lineHeight" data-value="1.6"><i class="fa fa-check icon-ok"></i> 1.6</a></li>' +
|
1626
|
+
'<li><a data-event="lineHeight" data-value="1.8"><i class="fa fa-check icon-ok"></i> 1.8</a></li>' +
|
1627
|
+
'<li><a data-event="lineHeight" data-value="2.0"><i class="fa fa-check icon-ok"></i> 2.0</a></li>' +
|
1628
|
+
'<li><a data-event="lineHeight" data-value="3.0"><i class="fa fa-check icon-ok"></i> 3.0</a></li>' +
|
1299
1629
|
'</ul>',
|
1300
1630
|
help:
|
1301
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Help" data-shortcut="Ctrl+/" data-mac-shortcut="⌘+/" data-event="showHelpDialog" tabindex="-1"><i class="icon-question"></i></button>'
|
1631
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Help" data-shortcut="Ctrl+/" data-mac-shortcut="⌘+/" data-event="showHelpDialog" tabindex="-1"><i class="fa fa-question icon-question"></i></button>',
|
1632
|
+
fullscreen:
|
1633
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Full Screen" data-event="fullscreen" tabindex="-1"><i class="fa fa-arrows-alt icon-fullscreen"></i></button>',
|
1634
|
+
codeview:
|
1635
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Code View" data-event="codeview" tabindex="-1"><i class="fa fa-code icon-code"></i></button>'
|
1302
1636
|
};
|
1303
1637
|
var sPopover = '<div class="note-popover">' +
|
1304
|
-
'<div class="note-link-popover popover
|
1638
|
+
'<div class="note-link-popover popover bottom in" style="display: none;">' +
|
1305
1639
|
'<div class="arrow"></div>' +
|
1306
1640
|
'<div class="popover-content note-link-content">' +
|
1307
1641
|
'<a href="http://www.google.com" target="_blank">www.google.com</a> ' +
|
1308
1642
|
'<div class="note-insert btn-group">' +
|
1309
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Edit" data-event="showLinkDialog" tabindex="-1"><i class="icon-edit"></i></button>' +
|
1310
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Unlink" data-event="unlink" tabindex="-1"><i class="icon-unlink"></i></button>' +
|
1643
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Edit" data-event="showLinkDialog" tabindex="-1"><i class="fa fa-edit icon-edit"></i></button>' +
|
1644
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Unlink" data-event="unlink" tabindex="-1"><i class="fa fa-unlink icon-unlink"></i></button>' +
|
1311
1645
|
'</div>' +
|
1312
1646
|
'</div>' +
|
1313
1647
|
'</div>' +
|
1314
|
-
'<div class="note-image-popover popover
|
1648
|
+
'<div class="note-image-popover popover bottom in" style="display: none;">' +
|
1315
1649
|
'<div class="arrow"></div>' +
|
1316
1650
|
'<div class="popover-content note-image-content">' +
|
1317
1651
|
'<div class="btn-group">' +
|
1318
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Resize Full" data-event="resize" data-value="1" tabindex="-1"><
|
1319
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Resize Half" data-event="resize" data-value="0.5" tabindex="-1"
|
1320
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Resize
|
1321
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Resize Quarter" data-event="resize" data-value="0.25" tabindex="-1">¼</button>' +
|
1652
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Resize Full" data-event="resize" data-value="1" tabindex="-1"><span class="note-fontsize-10">100%</span> </button>' +
|
1653
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Resize Half" data-event="resize" data-value="0.5" tabindex="-1"><span class="note-fontsize-10">50%</span> </button>' +
|
1654
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Resize Quarter" data-event="resize" data-value="0.25" tabindex="-1"><span class="note-fontsize-10">25%</span> </button>' +
|
1322
1655
|
'</div>' +
|
1323
1656
|
'<div class="btn-group">' +
|
1324
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Float Left" data-event="
|
1325
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Float Right" data-event="
|
1326
|
-
'<button type="button" class="btn btn-default btn-sm btn-small" title="Float None" data-event="
|
1657
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Float Left" data-event="floatMe" data-value="left" tabindex="-1"><i class="fa fa-align-left icon-align-left"></i></button>' +
|
1658
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Float Right" data-event="floatMe" data-value="right" tabindex="-1"><i class="fa fa-align-right icon-align-right"></i></button>' +
|
1659
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Float None" data-event="floatMe" data-value="none" tabindex="-1"><i class="fa fa-align-justify icon-align-justify"></i></button>' +
|
1327
1660
|
'</div>' +
|
1328
1661
|
'</div>' +
|
1329
1662
|
'</div>' +
|
@@ -1404,21 +1737,30 @@
|
|
1404
1737
|
'</tbody>' +
|
1405
1738
|
'</table>';
|
1406
1739
|
|
1740
|
+
if (!agent.bMac) { // shortcut modifier for windows
|
1741
|
+
sShortcutTable = sShortcutTable.replace(/⌘/g, 'Ctrl').replace(/⇧/g, 'Shift');
|
1742
|
+
}
|
1743
|
+
|
1407
1744
|
var sDialog = '<div class="note-dialog">' +
|
1408
1745
|
'<div class="note-image-dialog modal" aria-hidden="false">' +
|
1409
1746
|
'<div class="modal-dialog">' +
|
1410
1747
|
'<div class="modal-content">' +
|
1411
1748
|
'<div class="modal-header">' +
|
1412
|
-
'<button type="button" class="close"
|
1749
|
+
'<button type="button" class="close" aria-hidden="true" tabindex="-1">×</button>' +
|
1413
1750
|
'<h4>Insert Image</h4>' +
|
1414
1751
|
'</div>' +
|
1415
1752
|
'<div class="modal-body">' +
|
1416
1753
|
'<div class="row-fluid">' +
|
1417
1754
|
'<div class="note-dropzone span12">Drag an image here</div>' +
|
1418
|
-
'<
|
1419
|
-
'<input class="note-image-input" type="file"
|
1755
|
+
'<h5>Select from files</h5>' +
|
1756
|
+
'<input class="note-image-input" type="file" name="files" accept="image/*" capture="camera" />' +
|
1757
|
+
'<h5>Image URL</h5>' +
|
1758
|
+
'<input class="note-image-url form-control span12" type="text" />' +
|
1420
1759
|
'</div>' +
|
1421
1760
|
'</div>' +
|
1761
|
+
'<div class="modal-footer">' +
|
1762
|
+
'<button href="#" class="btn btn-primary note-image-btn disabled" disabled="disabled">Insert</button>' +
|
1763
|
+
'</div>' +
|
1422
1764
|
'</div>' +
|
1423
1765
|
'</div>' +
|
1424
1766
|
'</div>' +
|
@@ -1426,7 +1768,7 @@
|
|
1426
1768
|
'<div class="modal-dialog">' +
|
1427
1769
|
'<div class="modal-content">' +
|
1428
1770
|
'<div class="modal-header">' +
|
1429
|
-
'<button type="button" class="close"
|
1771
|
+
'<button type="button" class="close" aria-hidden="true" tabindex="-1">×</button>' +
|
1430
1772
|
'<h4>Edit Link</h4>' +
|
1431
1773
|
'</div>' +
|
1432
1774
|
'<div class="modal-body">' +
|
@@ -1443,20 +1785,20 @@
|
|
1443
1785
|
'</div>' +
|
1444
1786
|
'</div>' +
|
1445
1787
|
'<div class="modal-footer">' +
|
1446
|
-
'<
|
1788
|
+
'<button href="#" class="btn btn-primary note-link-btn disabled" disabled="disabled">Link</button>' +
|
1447
1789
|
'</div>' +
|
1448
1790
|
'</div>' +
|
1449
1791
|
'</div>' +
|
1450
1792
|
'</div>' +
|
1451
|
-
'<div class="note-help-dialog modal
|
1793
|
+
'<div class="note-help-dialog modal" aria-hidden="false">' +
|
1452
1794
|
'<div class="modal-dialog">' +
|
1453
1795
|
'<div class="modal-content">' +
|
1454
1796
|
'<div class="modal-body">' +
|
1455
1797
|
'<div class="modal-background">' +
|
1456
|
-
'<a class="modal-close pull-right"
|
1798
|
+
'<a class="modal-close pull-right" aria-hidden="true" tabindex="-1">Close</a>' +
|
1457
1799
|
'<div class="title">Keyboard shortcuts</div>' +
|
1458
1800
|
sShortcutTable +
|
1459
|
-
'<p class="text-center"><a href="//hackerwins.github.io/summernote/" target="_blank">Summernote v0.
|
1801
|
+
'<p class="text-center"><a href="//hackerwins.github.io/summernote/" target="_blank">Summernote v0.4</a> · <a href="//github.com/HackerWins/summernote" target="_blank">Project</a> · <a href="//github.com/HackerWins/summernote/issues" target="_blank">Issues</a></p>' +
|
1460
1802
|
'</div>' +
|
1461
1803
|
'</div>' +
|
1462
1804
|
'</div>' +
|
@@ -1467,15 +1809,15 @@
|
|
1467
1809
|
var createTooltip = function(welContainer, sPlacement) {
|
1468
1810
|
welContainer.find('button').each(function(i, elBtn) {
|
1469
1811
|
var welBtn = $(elBtn);
|
1470
|
-
var sShortcut = welBtn.attr(bMac ? 'data-mac-shortcut':'data-shortcut');
|
1471
|
-
if (sShortcut) { welBtn.attr('title', function(i, v) { return v + ' (' + sShortcut + ')'}); }
|
1812
|
+
var sShortcut = welBtn.attr(agent.bMac ? 'data-mac-shortcut': 'data-shortcut');
|
1813
|
+
if (sShortcut) { welBtn.attr('title', function(i, v) { return v + ' (' + sShortcut + ')'; }); }
|
1472
1814
|
//bootstrap tooltip on btn-group bug: https://github.com/twitter/bootstrap/issues/5687
|
1473
1815
|
}).tooltip({container: 'body', placement: sPlacement || 'top'});
|
1474
1816
|
};
|
1475
1817
|
|
1476
1818
|
// pallete colors
|
1477
1819
|
var aaColor = [
|
1478
|
-
['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#
|
1820
|
+
['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'],
|
1479
1821
|
['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'],
|
1480
1822
|
['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'],
|
1481
1823
|
['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'],
|
@@ -1510,7 +1852,7 @@
|
|
1510
1852
|
};
|
1511
1853
|
|
1512
1854
|
// createLayout
|
1513
|
-
var createLayout = this.createLayout = function(welHolder, nHeight,
|
1855
|
+
var createLayout = this.createLayout = function(welHolder, nHeight, nTabsize, aToolbarSetting) {
|
1514
1856
|
//already created
|
1515
1857
|
if (welHolder.next().hasClass('note-editor')) { return; }
|
1516
1858
|
|
@@ -1524,11 +1866,21 @@
|
|
1524
1866
|
|
1525
1867
|
//03. create Editable
|
1526
1868
|
var welEditable = $('<div class="note-editable" contentEditable="true"></div>').prependTo(welEditor);
|
1527
|
-
if (nTabIndex) { welEditable.attr('tabIndex', nTabIndex); }
|
1528
1869
|
if (nHeight) { welEditable.height(nHeight); }
|
1870
|
+
if (nTabsize) {
|
1871
|
+
welEditable.data('tabsize', nTabsize);
|
1872
|
+
}
|
1529
1873
|
|
1530
|
-
welEditable.html(
|
1874
|
+
welEditable.html(dom.html(welHolder));
|
1531
1875
|
welEditable.data('NoteHistory', new History());
|
1876
|
+
|
1877
|
+
//031. create codable
|
1878
|
+
var welCodable = $('<textarea class="note-codable"></textarea>').prependTo(welEditor);
|
1879
|
+
|
1880
|
+
//032. set styleWithCSS for backColor / foreColor clearing with 'inherit'.
|
1881
|
+
setTimeout(function() { // protect FF Error: NS_ERROR_FAILURE: Failure
|
1882
|
+
document.execCommand('styleWithCSS', 0, true);
|
1883
|
+
});
|
1532
1884
|
|
1533
1885
|
//04. create Toolbar
|
1534
1886
|
var sToolbar = '';
|
@@ -1539,7 +1891,7 @@
|
|
1539
1891
|
sToolbar += aToolbarItem[group[1][i]];
|
1540
1892
|
}
|
1541
1893
|
sToolbar += '</div>';
|
1542
|
-
}
|
1894
|
+
}
|
1543
1895
|
|
1544
1896
|
sToolbar = '<div class="note-toolbar btn-toolbar">' + sToolbar + '</div>';
|
1545
1897
|
|
@@ -1555,8 +1907,11 @@
|
|
1555
1907
|
$(sHandle).prependTo(welEditor);
|
1556
1908
|
|
1557
1909
|
//07. create Dialog
|
1558
|
-
$(sDialog).prependTo(welEditor);
|
1559
|
-
|
1910
|
+
var welDialog = $(sDialog).prependTo(welEditor);
|
1911
|
+
welDialog.find('button.close, a.modal-close').click(function(event) {
|
1912
|
+
$(this).closest('.modal').modal('hide');
|
1913
|
+
});
|
1914
|
+
|
1560
1915
|
//08. Editor/Holder switch
|
1561
1916
|
welEditor.insertAfter(welHolder);
|
1562
1917
|
welHolder.hide();
|
@@ -1571,6 +1926,7 @@
|
|
1571
1926
|
editor: welEditor,
|
1572
1927
|
toolbar: welEditor.find('.note-toolbar'),
|
1573
1928
|
editable: welEditor.find('.note-editable'),
|
1929
|
+
codable: welEditor.find('.note-codable'),
|
1574
1930
|
statusbar: welEditor.find('.note-statusbar'),
|
1575
1931
|
popover: welEditor.find('.note-popover'),
|
1576
1932
|
handle: welEditor.find('.note-handle'),
|
@@ -1608,6 +1964,7 @@
|
|
1608
1964
|
['height', ['height']],
|
1609
1965
|
['table', ['table']],
|
1610
1966
|
['insert', ['link', 'picture']],
|
1967
|
+
['view', ['fullscreen', 'codeview']],
|
1611
1968
|
['help', ['help']]
|
1612
1969
|
]
|
1613
1970
|
}, options );
|
@@ -1616,7 +1973,7 @@
|
|
1616
1973
|
var welHolder = $(elHolder);
|
1617
1974
|
|
1618
1975
|
// createLayout with options
|
1619
|
-
renderer.createLayout(welHolder, options.height, options.
|
1976
|
+
renderer.createLayout(welHolder, options.height, options.tabsize, options.toolbar);
|
1620
1977
|
|
1621
1978
|
var info = renderer.layoutInfoFromHolder(welHolder);
|
1622
1979
|
eventHandler.attach(info, options);
|
@@ -1628,17 +1985,20 @@
|
|
1628
1985
|
}
|
1629
1986
|
if (this.length > 0 && options.oninit) { // callback on init
|
1630
1987
|
options.oninit();
|
1631
|
-
}
|
1988
|
+
}
|
1632
1989
|
},
|
1633
1990
|
// get the HTML contents of note or set the HTML contents of note.
|
1634
1991
|
code: function(sHTML) {
|
1635
1992
|
//get the HTML contents
|
1636
1993
|
if (sHTML === undefined) {
|
1637
|
-
|
1638
|
-
|
1639
|
-
|
1640
|
-
|
1641
|
-
|
1994
|
+
var welHolder = this.first();
|
1995
|
+
if (welHolder.length === 0) { return; }
|
1996
|
+
var info = renderer.layoutInfoFromHolder(welHolder);
|
1997
|
+
if (!!(info && info.editable)) {
|
1998
|
+
var bCodeview = info.editor.hasClass('codeview');
|
1999
|
+
return bCodeview ? info.codable.val() : info.editable.html();
|
2000
|
+
}
|
2001
|
+
return welHolder.html();
|
1642
2002
|
}
|
1643
2003
|
|
1644
2004
|
// set the HTML contents
|
@@ -1660,13 +2020,13 @@
|
|
1660
2020
|
},
|
1661
2021
|
// inner object for test
|
1662
2022
|
summernoteInner: function() {
|
1663
|
-
return { dom: dom, list: list, func: func,
|
2023
|
+
return { dom: dom, list: list, func: func, range: range };
|
1664
2024
|
}
|
1665
2025
|
});
|
1666
|
-
})(jQuery); // jQuery
|
2026
|
+
})(window.jQuery); // jQuery
|
1667
2027
|
|
1668
|
-
//Array.prototype.reduce fallback
|
1669
|
-
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
|
2028
|
+
// Array.prototype.reduce fallback
|
2029
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
|
1670
2030
|
if ('function' !== typeof Array.prototype.reduce) {
|
1671
2031
|
Array.prototype.reduce = function(callback, opt_initialValue) {
|
1672
2032
|
'use strict';
|