summernote-rails 0.2.1.4 → 0.3.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 +7 -0
- data/lib/summernote/rails/version.rb +1 -1
- data/vendor/assets/javascripts/summernote.js +389 -290
- data/vendor/assets/javascripts/summernote.min.js +2 -1
- data/vendor/assets/stylesheets/summernote-bootstrap.css +1 -1
- data/vendor/assets/stylesheets/summernote.css +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f890a2cd92ec2c63e55cc5b0b300e8ab770a687
|
4
|
+
data.tar.gz: 8b75e63e1a5541143b78be480408ceaf5cc865d9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a9cee9cffa95724a3fd5f3d55dd0c1e427580194cd0a1aa421a74220483b2fbb6ffc0a549df740e806345f0a272c536dbe9b720f70cb8f6d885268e5f99ceb1
|
7
|
+
data.tar.gz: 94181db624c6369b5e9e4c310d6e022bca36f338129e547a0bb6e6cf0fbf356bd09819d0471cef9606aa0b5fd68fc240ad45d65a81ec5ebbbe5a26d2007fc0d9
|
data/README.md
CHANGED
@@ -126,6 +126,13 @@ That's it.
|
|
126
126
|
|
127
127
|
## Changelogs
|
128
128
|
|
129
|
+
- v0.3.0 : Added the resizing bar at the bottom of editor.
|
130
|
+
* Updated with `v0.3 Summernote, 2013-09-01` as the followings:
|
131
|
+
* `FIXED` bugs(image upload, fontsize, tab, recent color, ...)
|
132
|
+
* `ADDED` help dialog(keyboard shortcut)
|
133
|
+
* `ADDED` init options(event callbacks, custom toolbar)
|
134
|
+
* `ADDED` resize bar
|
135
|
+
* `ADDED` support IE8 Beta(some range bugs, can't insert Image)
|
129
136
|
- v0.2.1.4 : Enable to customize Toolbar Collection
|
130
137
|
- v0.2.1.3 : Added Help button in editor toolbox to popup Hot Key Table
|
131
138
|
- v0.2.1.2 : Added InsertHorizontalRule(Cmd+Enter) in summernote editor /
|
@@ -14,12 +14,12 @@
|
|
14
14
|
* func utils (for high-order func's arg)
|
15
15
|
*/
|
16
16
|
var func = function() {
|
17
|
-
var eq = function(
|
18
|
-
|
19
|
-
};
|
20
|
-
var eq2 = function(nodeA, nodeB) { return nodeA === nodeB; };
|
17
|
+
var eq = function(elA) { return function(elB) { return elA === elB; }; };
|
18
|
+
var eq2 = function(elA, elB) { return elA === elB; };
|
21
19
|
var fail = function() { return false; };
|
22
|
-
|
20
|
+
var not = function(f) { return function() { return !f.apply(f, arguments); }};
|
21
|
+
var self = function(a) { return a; }
|
22
|
+
return { eq: eq, eq2: eq2, fail: fail, not: not, self: self };
|
23
23
|
}();
|
24
24
|
|
25
25
|
/**
|
@@ -30,6 +30,21 @@
|
|
30
30
|
var last = function(array) { return array[array.length - 1]; };
|
31
31
|
var initial = function(array) { return array.slice(0, array.length - 1); };
|
32
32
|
var tail = function(array) { return array.slice(1); };
|
33
|
+
|
34
|
+
var sum = function(array, fn) {
|
35
|
+
fn = fn || func.self;
|
36
|
+
return array.reduce(function(memo, v) {
|
37
|
+
return memo + fn(v);
|
38
|
+
}, 0);
|
39
|
+
};
|
40
|
+
|
41
|
+
var from = function(collection) {
|
42
|
+
var result = [], idx = -1, length = collection.length;
|
43
|
+
while (++idx < length) {
|
44
|
+
result[idx] = collection[idx];
|
45
|
+
}
|
46
|
+
return result;
|
47
|
+
};
|
33
48
|
|
34
49
|
var clusterBy = function(array, fn) {
|
35
50
|
if (array.length === 0) { return []; }
|
@@ -54,7 +69,7 @@
|
|
54
69
|
};
|
55
70
|
|
56
71
|
return { head: head, last: last, initial: initial, tail: tail,
|
57
|
-
compact: compact, clusterBy: clusterBy };
|
72
|
+
sum: sum, from: from, compact: compact, clusterBy: clusterBy };
|
58
73
|
}();
|
59
74
|
|
60
75
|
/**
|
@@ -116,19 +131,35 @@
|
|
116
131
|
// FIXME: nodeA and nodeB must be sorted, use comparePoints later.
|
117
132
|
var listBetween = function(nodeA, nodeB) {
|
118
133
|
var aNode = [];
|
119
|
-
|
120
|
-
|
121
|
-
var
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
134
|
+
|
135
|
+
var bStart = false, bEnd = false;
|
136
|
+
var fnWalk = function(node) {
|
137
|
+
if (!node) { return; } // traverse fisnish
|
138
|
+
if (node === nodeA) { bStart = true; } // start point
|
139
|
+
if (bStart && !bEnd) { aNode.push(node) } // between
|
140
|
+
if (node === nodeB) { bEnd = true; return; } // end point
|
141
|
+
|
142
|
+
for (var idx = 0, sz=node.childNodes.length; idx < sz; idx++) {
|
143
|
+
fnWalk(node.childNodes[idx]);
|
144
|
+
}
|
129
145
|
}
|
146
|
+
|
147
|
+
fnWalk(commonAncestor(nodeA, nodeB)); // DFS with commonAcestor.
|
130
148
|
return aNode;
|
131
149
|
};
|
150
|
+
|
151
|
+
// listPrev: listing prevSiblings (until predicate hit: optional)
|
152
|
+
var listPrev = function(node, pred) {
|
153
|
+
pred = pred || func.fail;
|
154
|
+
|
155
|
+
var aNext = [];
|
156
|
+
while (node) {
|
157
|
+
aNext.push(node);
|
158
|
+
if (pred(node)) { break; }
|
159
|
+
node = node.previousSibling;
|
160
|
+
};
|
161
|
+
return aNext;
|
162
|
+
};
|
132
163
|
|
133
164
|
// listNext: listing nextSiblings (until predicate hit: optional)
|
134
165
|
var listNext = function(node, pred) {
|
@@ -137,7 +168,7 @@
|
|
137
168
|
var aNext = [];
|
138
169
|
while (node) {
|
139
170
|
aNext.push(node);
|
140
|
-
if (node
|
171
|
+
if (pred(node)) { break; }
|
141
172
|
node = node.nextSibling;
|
142
173
|
};
|
143
174
|
return aNext;
|
@@ -209,9 +240,7 @@
|
|
209
240
|
// split: split dom tree by boundaryPoint(pivot and offset)
|
210
241
|
var split = function(root, pivot, offset) {
|
211
242
|
var aAncestor = listAncestor(pivot, func.eq(root));
|
212
|
-
if (aAncestor.length === 1) {
|
213
|
-
return splitData(pivot, offset);
|
214
|
-
}
|
243
|
+
if (aAncestor.length === 1) { return splitData(pivot, offset); }
|
215
244
|
return aAncestor.reduce(function(node, parent) {
|
216
245
|
var clone = parent.cloneNode(false);
|
217
246
|
insertAfter(clone, parent);
|
@@ -232,7 +261,8 @@
|
|
232
261
|
isB: makePredByNodeName('B'), isU: makePredByNodeName('U'),
|
233
262
|
isS: makePredByNodeName('S'), isI: makePredByNodeName('I'),
|
234
263
|
isImg: makePredByNodeName('IMG'),
|
235
|
-
ancestor: ancestor, listAncestor: listAncestor,
|
264
|
+
ancestor: ancestor, listAncestor: listAncestor,
|
265
|
+
listNext: listNext, listPrev: listPrev,
|
236
266
|
commonAncestor: commonAncestor, listBetween: listBetween,
|
237
267
|
insertAfter: insertAfter, position: position,
|
238
268
|
makeOffsetPath: makeOffsetPath, fromOffsetPath: fromOffsetPath,
|
@@ -246,13 +276,101 @@
|
|
246
276
|
* create Range Object From arguments or Browser Selection
|
247
277
|
*/
|
248
278
|
var bW3CRangeSupport = !!document.createRange;
|
279
|
+
|
280
|
+
// return boundary point from TextRange(ie8)
|
281
|
+
// inspired by Andy Na's HuskyRange.js
|
282
|
+
var textRange2bp = function(textRange, bStart) {
|
283
|
+
var elCont = textRange.parentElement(), nOffset;
|
284
|
+
|
285
|
+
var tester = document.body.createTextRange(), elPrevCont;
|
286
|
+
var aChild = list.from(elCont.childNodes);
|
287
|
+
for (nOffset = 0; nOffset < aChild.length; nOffset++) {
|
288
|
+
if (dom.isText(aChild[nOffset])) { continue; }
|
289
|
+
tester.moveToElementText(aChild[nOffset]);
|
290
|
+
if (tester.compareEndPoints("StartToStart", textRange) >= 0) { break; }
|
291
|
+
elPrevCont = aChild[nOffset];
|
292
|
+
}
|
293
|
+
|
294
|
+
if (nOffset != 0 && dom.isText(aChild[nOffset - 1])) {
|
295
|
+
var textRangeStart = document.body.createTextRange(), elCurText = null;
|
296
|
+
textRangeStart.moveToElementText(elPrevCont || elCont);
|
297
|
+
textRangeStart.collapse(!elPrevCont);
|
298
|
+
elCurText = elPrevCont ? elPrevCont.nextSibling : elCont.firstChild;
|
299
|
+
|
300
|
+
var pointTester = textRange.duplicate();
|
301
|
+
pointTester.setEndPoint("StartToStart", textRangeStart);
|
302
|
+
var nTextCount = pointTester.text.replace(/[\r\n]/g, "").length;
|
303
|
+
|
304
|
+
while (nTextCount > elCurText.nodeValue.length && elCurText.nextSibling) {
|
305
|
+
nTextCount -= elCurText.nodeValue.length;
|
306
|
+
elCurText = elCurText.nextSibling;
|
307
|
+
}
|
308
|
+
var sDummy = elCurText.nodeValue; //enforce IE to re-reference elCurText
|
309
|
+
|
310
|
+
if (bStart && elCurText.nextSibling && dom.isText(elCurText.nextSibling) &&
|
311
|
+
nTextCount == elCurText.nodeValue.length) {
|
312
|
+
nTextCount -= elCurText.nodeValue.length;
|
313
|
+
elCurText = elCurText.nextSibling;
|
314
|
+
}
|
315
|
+
|
316
|
+
elCont = elCurText;
|
317
|
+
nOffset = nTextCount;
|
318
|
+
}
|
319
|
+
|
320
|
+
return {cont: elCont, offset: nOffset};
|
321
|
+
};
|
322
|
+
|
323
|
+
// return TextRange(ie8) from boundary point
|
324
|
+
// (inspired by google closure-library)
|
325
|
+
var bp2textRange = function(bp) {
|
326
|
+
var textRangeInfo = function(elCont, nOffset) {
|
327
|
+
var elNode, bCollapseToStart;
|
328
|
+
|
329
|
+
if (dom.isText(elCont)) {
|
330
|
+
var aPrevText = dom.listPrev(elCont, func.not(dom.isText));
|
331
|
+
var elPrevCont = list.last(aPrevText).previousSibling;
|
332
|
+
elNode = elPrevCont || elCont.parentNode;
|
333
|
+
nOffset += list.sum(list.tail(aPrevText), dom.length);
|
334
|
+
bCollapseToStart = !elPrevCont;
|
335
|
+
} else {
|
336
|
+
elNode = elCont.childNodes[nOffset] || elCont;
|
337
|
+
if (dom.isText(elNode)) {
|
338
|
+
return textRangeInfo(elNode, nOffset);
|
339
|
+
}
|
340
|
+
|
341
|
+
nOffset = 0;
|
342
|
+
bCollapseToStart = false;
|
343
|
+
}
|
344
|
+
|
345
|
+
return {cont: elNode, collapseToStart: bCollapseToStart, offset: nOffset};
|
346
|
+
}
|
347
|
+
|
348
|
+
var textRange = document.body.createTextRange();
|
349
|
+
var info = textRangeInfo(bp.cont, bp.offset);
|
350
|
+
|
351
|
+
textRange.moveToElementText(info.cont);
|
352
|
+
textRange.collapse(info.collapseToStart);
|
353
|
+
textRange.moveStart("character", info.offset);
|
354
|
+
return textRange;
|
355
|
+
};
|
356
|
+
|
249
357
|
var Range = function(sc, so, ec, eo) {
|
250
358
|
if (arguments.length === 0) { // from Browser Selection
|
251
|
-
if (
|
359
|
+
if (bW3CRangeSupport) { // webkit, firefox
|
252
360
|
var nativeRng = document.getSelection().getRangeAt(0);
|
253
361
|
sc = nativeRng.startContainer, so = nativeRng.startOffset,
|
254
362
|
ec = nativeRng.endContainer, eo = nativeRng.endOffset;
|
255
|
-
}
|
363
|
+
} else { //TextRange
|
364
|
+
var textRange = document.selection.createRange();
|
365
|
+
var textRangeEnd = textRange.duplicate(); textRangeEnd.collapse(false);
|
366
|
+
var textRangeStart = textRange; textRangeStart.collapse(true);
|
367
|
+
|
368
|
+
var bpStart = textRange2bp(textRangeStart, true),
|
369
|
+
bpEnd = textRange2bp(textRangeEnd, false);
|
370
|
+
|
371
|
+
sc = bpStart.cont, so = bpStart.offset;
|
372
|
+
ec = bpEnd.cont, eo = bpEnd.offset;
|
373
|
+
}
|
256
374
|
}
|
257
375
|
|
258
376
|
this.sc = sc; this.so = so;
|
@@ -265,7 +383,11 @@
|
|
265
383
|
range.setStart(sc, so);
|
266
384
|
range.setEnd(ec, eo);
|
267
385
|
return range;
|
268
|
-
}
|
386
|
+
} else {
|
387
|
+
var textRange = bp2textRange({cont:sc, offset:so});
|
388
|
+
textRange.setEndPoint('EndToEnd', bp2textRange({cont:ec, offset:eo}));
|
389
|
+
return textRange;
|
390
|
+
}
|
269
391
|
};
|
270
392
|
|
271
393
|
// select: update visible range
|
@@ -275,7 +397,9 @@
|
|
275
397
|
var selection = document.getSelection();
|
276
398
|
if (selection.rangeCount > 0) { selection.removeAllRanges(); }
|
277
399
|
selection.addRange(nativeRng);
|
278
|
-
}
|
400
|
+
} else {
|
401
|
+
nativeRng.select();
|
402
|
+
}
|
279
403
|
};
|
280
404
|
|
281
405
|
// listPara: listing paragraphs on range
|
@@ -309,25 +433,18 @@
|
|
309
433
|
var nativeRng = nativeRange();
|
310
434
|
if (bW3CRangeSupport) {
|
311
435
|
nativeRng.insertNode(node);
|
312
|
-
}
|
313
|
-
|
314
|
-
|
315
|
-
// surroundContents
|
316
|
-
this.surroundContents = function(sNodeName) {
|
317
|
-
var node = $('<' + sNodeName + ' />')[0];
|
318
|
-
var nativeRng = nativeRange();
|
319
|
-
if (bW3CRangeSupport) {
|
320
|
-
nativeRng.surroundContents(node);
|
321
|
-
} // TODO: IE8
|
322
|
-
|
323
|
-
return node;
|
436
|
+
} else {
|
437
|
+
nativeRng.pasteHTML(node.outerHTML); // NOTE: missing node reference.
|
438
|
+
}
|
324
439
|
};
|
325
440
|
|
326
441
|
this.toString = function() {
|
327
442
|
var nativeRng = nativeRange();
|
328
443
|
if (bW3CRangeSupport) {
|
329
444
|
return nativeRng.toString();
|
330
|
-
}
|
445
|
+
} else {
|
446
|
+
return nativeRng.text;
|
447
|
+
}
|
331
448
|
};
|
332
449
|
|
333
450
|
//bookmark: offsetPath bookmark
|
@@ -351,16 +468,6 @@
|
|
351
468
|
* Style
|
352
469
|
*/
|
353
470
|
var Style = function() {
|
354
|
-
// font level style
|
355
|
-
this.styleFont = function(rng, oStyle) {
|
356
|
-
//TODO: complete styleFont later only works for webkit
|
357
|
-
//rng.splitInline();
|
358
|
-
var elSpan = rng.surroundContents('span');
|
359
|
-
$.each(oStyle, function(sKey, sValue) {
|
360
|
-
elSpan.style[sKey] = sValue;
|
361
|
-
});
|
362
|
-
};
|
363
|
-
|
364
471
|
// para level style
|
365
472
|
this.stylePara = function(rng, oStyle) {
|
366
473
|
var aPara = rng.listPara();
|
@@ -374,16 +481,15 @@
|
|
374
481
|
// get current style, elTarget: target element on event.
|
375
482
|
this.current = function(rng, elTarget) {
|
376
483
|
var welCont = $(dom.isText(rng.sc) ? rng.sc.parentNode : rng.sc);
|
377
|
-
var oStyle = welCont.css(['font-size', '
|
378
|
-
'text-decoration', 'text-align',
|
484
|
+
var oStyle = welCont.css(['font-size', 'text-align',
|
379
485
|
'list-style-type', 'line-height']) || {};
|
380
|
-
|
486
|
+
|
381
487
|
oStyle['font-size'] = parseInt(oStyle['font-size']);
|
382
488
|
|
383
|
-
//
|
384
|
-
|
385
|
-
|
386
|
-
|
489
|
+
// document.queryCommandState for toggle state
|
490
|
+
oStyle['font-bold'] = document.queryCommandState('bold') ? 'bold' : 'normal';
|
491
|
+
oStyle['font-italic'] = document.queryCommandState('italic') ? 'italic' : 'normal';
|
492
|
+
oStyle['font-underline'] = document.queryCommandState('underline') ? 'underline' : 'normal';
|
387
493
|
|
388
494
|
// list-style-type to list-style(unordered, ordered)
|
389
495
|
if (!rng.isOnList()) {
|
@@ -453,7 +559,7 @@
|
|
453
559
|
//currentStyle
|
454
560
|
var style = new Style();
|
455
561
|
this.currentStyle = function(elTarget) {
|
456
|
-
if (document.getSelection().rangeCount == 0) { return null; }
|
562
|
+
if (document.getSelection && document.getSelection().rangeCount == 0) { return null; }
|
457
563
|
return style.current((new Range()), elTarget);
|
458
564
|
};
|
459
565
|
|
@@ -473,11 +579,11 @@
|
|
473
579
|
};
|
474
580
|
|
475
581
|
// native commands(with execCommand)
|
476
|
-
var aCmd = ['bold', 'italic', 'underline', '
|
477
|
-
'
|
478
|
-
'
|
479
|
-
'
|
480
|
-
'insertHorizontalRule'];
|
582
|
+
var aCmd = ['bold', 'italic', 'underline', 'strikethrough',
|
583
|
+
'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',
|
584
|
+
'insertOrderedList', 'insertUnorderedList',
|
585
|
+
'indent', 'outdent', 'formatBlock', 'removeFormat',
|
586
|
+
'backColor', 'foreColor', 'insertImage', 'insertHorizontalRule'];
|
481
587
|
|
482
588
|
for (var idx = 0, len=aCmd.length; idx < len; idx ++) {
|
483
589
|
this[aCmd[idx]] = function(sCmd) {
|
@@ -488,11 +594,9 @@
|
|
488
594
|
}(aCmd[idx]);
|
489
595
|
}
|
490
596
|
|
491
|
-
this.
|
492
|
-
|
493
|
-
|
494
|
-
return this.indent(welEditable); // return is hack.
|
495
|
-
}
|
597
|
+
this.formatBlock = function(welEditable, sValue) {
|
598
|
+
sValue = bMSIE ? "<" + sValue + ">" : sValue;
|
599
|
+
document.execCommand("FormatBlock", false, sValue);
|
496
600
|
};
|
497
601
|
|
498
602
|
this.fontSize = function(welEditable, sValue) {
|
@@ -530,12 +634,21 @@
|
|
530
634
|
text: rng.toString(),
|
531
635
|
url: rng.isOnAnchor() ? dom.ancestor(rng.sc, dom.isAnchor).href : ""
|
532
636
|
}, function(sLinkUrl) {
|
533
|
-
rng.select();
|
534
|
-
|
535
|
-
|
536
|
-
|
637
|
+
rng.select(); recordUndo(welEditable);
|
638
|
+
|
639
|
+
var bProtocol = sLinkUrl.toLowerCase().indexOf("://") !== -1;
|
640
|
+
var sLinkUrlWithProtocol = bProtocol ? sLinkUrl : "http://" + sLinkUrl;
|
641
|
+
|
642
|
+
//IE: createLink when range collapsed.
|
643
|
+
if (bMSIE && rng.isCollapsed()) {
|
644
|
+
rng.insertNode($('<A id="linkAnchor">' + sLinkUrl + '</A>')[0]);
|
645
|
+
var welAnchor = $('#linkAnchor').removeAttr("id")
|
646
|
+
.attr('href', sLinkUrlWithProtocol);
|
647
|
+
rng = new Range(welAnchor[0], 0, welAnchor[0], 1);
|
648
|
+
rng.select();
|
649
|
+
} else {
|
650
|
+
document.execCommand('createlink', false, sLinkUrlWithProtocol);
|
537
651
|
}
|
538
|
-
document.execCommand('createlink', false, sLinkUrl);
|
539
652
|
});
|
540
653
|
};
|
541
654
|
|
@@ -612,13 +725,13 @@
|
|
612
725
|
};
|
613
726
|
|
614
727
|
btnState('button[data-event="bold"]', function() {
|
615
|
-
return oStyle['font-
|
728
|
+
return oStyle['font-bold'] === 'bold';
|
616
729
|
});
|
617
730
|
btnState('button[data-event="italic"]', function() {
|
618
|
-
return oStyle['font-
|
731
|
+
return oStyle['font-italic'] === 'italic';
|
619
732
|
});
|
620
733
|
btnState('button[data-event="underline"]', function() {
|
621
|
-
return oStyle['
|
734
|
+
return oStyle['font-underline'] === 'underline';
|
622
735
|
});
|
623
736
|
btnState('button[data-event="justifyLeft"]', function() {
|
624
737
|
return oStyle['text-align'] === 'left' || oStyle['text-align'] === 'start';
|
@@ -725,7 +838,7 @@
|
|
725
838
|
var welDropzone = welDialog.find('.note-dropzone'),
|
726
839
|
welImageInput = welDialog.find('.note-image-input');
|
727
840
|
|
728
|
-
welImageDialog.on('shown', function(e) {
|
841
|
+
welImageDialog.on('shown.bs.modal', function(e) {
|
729
842
|
welDropzone.on('dragenter dragover dragleave', false);
|
730
843
|
welDropzone.on('drop', function(e) {
|
731
844
|
hDropImage(e); welImageDialog.modal('hide');
|
@@ -734,7 +847,7 @@
|
|
734
847
|
fnInsertImages(this.files); $(this).val('');
|
735
848
|
welImageDialog.modal('hide');
|
736
849
|
});
|
737
|
-
}).on('hidden', function(e) {
|
850
|
+
}).on('hidden.bs.modal', function(e) {
|
738
851
|
welDropzone.off('dragenter dragover dragleave drop');
|
739
852
|
welImageInput.off('change');
|
740
853
|
}).modal('show');
|
@@ -746,7 +859,7 @@
|
|
746
859
|
welLinkUrl = welLinkDialog.find('.note-link-url'),
|
747
860
|
welLinkBtn = welLinkDialog.find('.note-link-btn');
|
748
861
|
|
749
|
-
welLinkDialog.on('shown', function(e) {
|
862
|
+
welLinkDialog.on('shown.bs.modal', function(e) {
|
750
863
|
welLinkText.html(linkInfo.text);
|
751
864
|
welLinkUrl.val(linkInfo.url).keyup(function(event) {
|
752
865
|
if (welLinkUrl.val()) {
|
@@ -762,9 +875,9 @@
|
|
762
875
|
callback(welLinkUrl.val());
|
763
876
|
event.preventDefault();
|
764
877
|
});
|
765
|
-
}).on('hidden', function(e) {
|
878
|
+
}).on('hidden.bs.modal', function(e) {
|
766
879
|
welLinkUrl.off('keyup');
|
767
|
-
welLinkDialog.off('shown hidden');
|
880
|
+
welLinkDialog.off('shown.bs.modal hidden.bs.modal');
|
768
881
|
welLinkBtn.off('click');
|
769
882
|
}).modal('show');
|
770
883
|
};
|
@@ -786,16 +899,18 @@
|
|
786
899
|
|
787
900
|
var key = { BACKSPACE: 8, TAB: 9, ENTER: 13, SPACE: 32,
|
788
901
|
NUM0: 48, NUM1: 49, NUM6: 54, NUM7: 55, NUM8: 56,
|
789
|
-
B: 66, E: 69, I: 73, J: 74, K: 75, L: 76, R: 82,
|
790
|
-
|
902
|
+
B: 66, E: 69, I: 73, J: 74, K: 75, L: 76, R: 82, S: 83, U: 85,
|
903
|
+
Y: 89, Z: 90, SLASH: 191,
|
904
|
+
LEFTBRACKET: 219, BACKSLACH: 220, RIGHTBRACKET: 221 };
|
791
905
|
|
792
906
|
// makeLayoutInfo from editor's descendant node.
|
793
907
|
var makeLayoutInfo = function(descendant) {
|
794
908
|
var welEditor = $(descendant).closest('.note-editor');
|
795
909
|
return {
|
796
910
|
editor: function() { return welEditor; },
|
797
|
-
editable: function() { return welEditor.find('.note-editable'); },
|
798
911
|
toolbar: function() { return welEditor.find('.note-toolbar'); },
|
912
|
+
editable: function() { return welEditor.find('.note-editable'); },
|
913
|
+
statusbar: function() { return welEditor.find('.note-statusbar'); },
|
799
914
|
popover: function() { return welEditor.find('.note-popover'); },
|
800
915
|
handle: function() { return welEditor.find('.note-handle'); },
|
801
916
|
dialog: function() { return welEditor.find('.note-dialog'); }
|
@@ -820,12 +935,16 @@
|
|
820
935
|
editor.italic(oLayoutInfo.editable());
|
821
936
|
} else if (bCmd && keyCode === key.U) {
|
822
937
|
editor.underline(oLayoutInfo.editable());
|
938
|
+
} else if (bCmd && bShift && keyCode === key.S) {
|
939
|
+
editor.strikethrough(oLayoutInfo.editable());
|
823
940
|
} else if (bCmd && keyCode === key.BACKSLACH) {
|
824
941
|
editor.removeFormat(oLayoutInfo.editable());
|
825
942
|
} else if (bCmd && keyCode === key.K) {
|
826
943
|
editor.setLinkDialog(oLayoutInfo.editable(), function(linkInfo, cb) {
|
827
944
|
dialog.showLinkDialog(oLayoutInfo.dialog(), linkInfo, cb);
|
828
945
|
});
|
946
|
+
} else if (bCmd && keyCode === key.SLASH) {
|
947
|
+
dialog.showHelpDialog(oLayoutInfo.dialog());
|
829
948
|
} else if (bCmd && bShift && keyCode === key.L) {
|
830
949
|
editor.justifyLeft(oLayoutInfo.editable());
|
831
950
|
} else if (bCmd && bShift && keyCode === key.E) {
|
@@ -838,10 +957,10 @@
|
|
838
957
|
editor.insertUnorderedList(oLayoutInfo.editable());
|
839
958
|
} else if (bCmd && bShift && keyCode === key.NUM8) {
|
840
959
|
editor.insertOrderedList(oLayoutInfo.editable());
|
841
|
-
} else if (
|
960
|
+
} else if (bCmd && keyCode === key.LEFTBRACKET) {
|
842
961
|
editor.outdent(oLayoutInfo.editable());
|
843
|
-
} else if (keyCode === key.
|
844
|
-
editor.
|
962
|
+
} else if (bCmd && keyCode === key.RIGHTBRACKET) {
|
963
|
+
editor.indent(oLayoutInfo.editable());
|
845
964
|
} else if (bCmd && keyCode === key.NUM0) { // formatBlock Paragraph
|
846
965
|
editor.formatBlock(oLayoutInfo.editable(), 'P');
|
847
966
|
} else if (bCmd && (key.NUM1 <= keyCode && keyCode <= key.NUM6)) {
|
@@ -860,6 +979,7 @@
|
|
860
979
|
};
|
861
980
|
|
862
981
|
var insertImages = function(welEditable, files) {
|
982
|
+
welEditable.trigger('focus');
|
863
983
|
$.each(files, function(idx, file) {
|
864
984
|
var fileReader = new FileReader;
|
865
985
|
fileReader.onload = function(event) {
|
@@ -973,6 +1093,23 @@
|
|
973
1093
|
hToolbarAndPopoverUpdate(event);
|
974
1094
|
}
|
975
1095
|
};
|
1096
|
+
|
1097
|
+
var EDITABLE_PADDING = 24;
|
1098
|
+
var hStatusbarMousedown = function(event) {
|
1099
|
+
var welDocument = $(document);
|
1100
|
+
var welEditable = makeLayoutInfo(event.target).editable();
|
1101
|
+
|
1102
|
+
var nEditableTop = welEditable.offset().top - welDocument.scrollTop();
|
1103
|
+
var hMousemove = function(event) {
|
1104
|
+
welEditable.height(event.clientY - (nEditableTop + EDITABLE_PADDING));
|
1105
|
+
};
|
1106
|
+
var hMouseup = function() {
|
1107
|
+
welDocument.unbind('mousemove', hMousemove)
|
1108
|
+
.unbind('mouseup', hMouseup);
|
1109
|
+
}
|
1110
|
+
welDocument.mousemove(hMousemove).mouseup(hMouseup);
|
1111
|
+
event.stopPropagation(); event.preventDefault();
|
1112
|
+
};
|
976
1113
|
|
977
1114
|
var PX_PER_EM = 18;
|
978
1115
|
var hDimensionPickerMove = function(event) {
|
@@ -997,11 +1134,11 @@
|
|
997
1134
|
welHighlighted.css({ width: dim.c +'em', height: dim.r + 'em' });
|
998
1135
|
welCatcher.attr('data-value', dim.c + 'x' + dim.r);
|
999
1136
|
|
1000
|
-
if (3 < dim.c && dim.c <
|
1137
|
+
if (3 < dim.c && dim.c < 10) { // 5~10
|
1001
1138
|
welUnhighlighted.css({ width: dim.c + 1 + 'em'});
|
1002
1139
|
}
|
1003
1140
|
|
1004
|
-
if (3 < dim.r && dim.r <
|
1141
|
+
if (3 < dim.r && dim.r < 10) { // 5~10
|
1005
1142
|
welUnhighlighted.css({ height: dim.r + 1 + 'em'});
|
1006
1143
|
}
|
1007
1144
|
|
@@ -1023,6 +1160,8 @@
|
|
1023
1160
|
oLayoutInfo.popover.on('click', hToolbarAndPopoverClick);
|
1024
1161
|
oLayoutInfo.toolbar.on('mousedown', hToolbarAndPopoverMousedown);
|
1025
1162
|
oLayoutInfo.popover.on('mousedown', hToolbarAndPopoverMousedown);
|
1163
|
+
|
1164
|
+
oLayoutInfo.statusbar.on('mousedown', hStatusbarMousedown);
|
1026
1165
|
|
1027
1166
|
//toolbar table dimension
|
1028
1167
|
var welToolbar = oLayoutInfo.toolbar;
|
@@ -1061,11 +1200,11 @@
|
|
1061
1200
|
var Renderer = function() {
|
1062
1201
|
var aToolbarItem = {
|
1063
1202
|
picture:
|
1064
|
-
'<button type="button" class="btn btn-small" title="Picture" data-event="showImageDialog" tabindex="-1"><i class="icon-picture"></i></button>',
|
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>',
|
1065
1204
|
link:
|
1066
|
-
'<button type="button" class="btn btn-small" title="Link" data-event="showLinkDialog" data-shortcut="Ctrl+K" data-mac-shortcut="⌘+K" tabindex="-1"><i class="icon-link"></i></button>',
|
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>',
|
1067
1206
|
table:
|
1068
|
-
'<button type="button" class="btn btn-small dropdown-toggle" title="Table" data-toggle="dropdown" tabindex="-1"><i class="icon-table"></i> <span class="caret"></span></button>' +
|
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>' +
|
1069
1208
|
'<ul class="dropdown-menu">' +
|
1070
1209
|
'<div class="note-dimension-picker">' +
|
1071
1210
|
'<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>' +
|
@@ -1075,7 +1214,7 @@
|
|
1075
1214
|
'<div class="note-dimension-display"> 1 x 1 </div>' +
|
1076
1215
|
'</ul>',
|
1077
1216
|
style:
|
1078
|
-
'<button type="button" class="btn btn-small dropdown-toggle" title="Style" data-toggle="dropdown" tabindex="-1"><i class="icon-magic"></i> <span class="caret"></span></button>' +
|
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>' +
|
1079
1218
|
'<ul class="dropdown-menu">' +
|
1080
1219
|
'<li><a data-event="formatBlock" data-value="p">Normal</a></li>' +
|
1081
1220
|
'<li><a data-event="formatBlock" data-value="blockquote"><blockquote>Quote</blockquote></a></li>' +
|
@@ -1088,7 +1227,7 @@
|
|
1088
1227
|
'<li><a data-event="formatBlock" data-value="h6"><h6>Header 6</h6></a></li>' +
|
1089
1228
|
'</ul>',
|
1090
1229
|
fontsize:
|
1091
|
-
'<button type="button" class="btn btn-small dropdown-toggle" data-toggle="dropdown" title="Font Size" tabindex="-1"><span class="note-current-fontsize">11</span> <b class="caret"></b></button>' +
|
1230
|
+
'<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>' +
|
1092
1231
|
'<ul class="dropdown-menu">' +
|
1093
1232
|
'<li><a data-event="fontSize" data-value="8"><i class="icon-ok"></i> 8</a></li>' +
|
1094
1233
|
'<li><a data-event="fontSize" data-value="9"><i class="icon-ok"></i> 9</a></li>' +
|
@@ -1101,8 +1240,8 @@
|
|
1101
1240
|
'<li><a data-event="fontSize" data-value="36"><i class="icon-ok"></i> 36</a></li>' +
|
1102
1241
|
'</ul>',
|
1103
1242
|
color:
|
1104
|
-
'<button type="button" class="btn btn-small note-recent-color" title="Recent Color" data-event="color" data-value=\'{"foreColor":"black","backColor":"yellow"}\' tabindex="-1"><i class="icon-font" style="color:black;background-color:yellow;"></i></button>' +
|
1105
|
-
'<button type="button" class="btn btn-small dropdown-toggle" title="More Color" data-toggle="dropdown" tabindex="-1">' +
|
1243
|
+
'<button type="button" class="btn btn-default btn-sm btn-small note-recent-color" title="Recent Color" data-event="color" data-value=\'{"foreColor":"black","backColor":"yellow"}\' tabindex="-1"><i class="icon-font" style="color:black;background-color:yellow;"></i></button>' +
|
1244
|
+
'<button type="button" class="btn btn-default btn-sm btn-small dropdown-toggle" title="More Color" data-toggle="dropdown" tabindex="-1">' +
|
1106
1245
|
'<span class="caret"></span>' +
|
1107
1246
|
'</button>' +
|
1108
1247
|
'<ul class="dropdown-menu">' +
|
@@ -1118,37 +1257,37 @@
|
|
1118
1257
|
'</li>' +
|
1119
1258
|
'</ul>',
|
1120
1259
|
bold:
|
1121
|
-
'<button type="button" class="btn btn-small" title="Bold" data-shortcut="Ctrl+B" data-mac-shortcut="⌘+B" data-event="bold" tabindex="-1"><i class="icon-bold"></i></button>',
|
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>',
|
1122
1261
|
italic:
|
1123
|
-
'<button type="button" class="btn btn-small" title="Italic" data-shortcut="Ctrl+I" data-mac-shortcut="⌘+I" data-event="italic" tabindex="-1"><i class="icon-italic"></i></button>',
|
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>',
|
1124
1263
|
underline:
|
1125
|
-
'<button type="button" class="btn btn-small" title="Underline" data-shortcut="Ctrl+U" data-mac-shortcut="⌘+U" data-event="underline" tabindex="-1"><i class="icon-underline"></i></button>',
|
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>',
|
1126
1265
|
clear:
|
1127
|
-
'<button type="button" class="btn btn-small" title="Remove Font Style" data-shortcut="Ctrl+\\" data-mac-shortcut="⌘+\\" data-event="removeFormat" tabindex="-1"><i class="icon-eraser"></i></button>',
|
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>',
|
1128
1267
|
ul:
|
1129
|
-
'<button type="button" class="btn 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>',
|
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>',
|
1130
1269
|
ol:
|
1131
|
-
'<button type="button" class="btn 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>',
|
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>',
|
1132
1271
|
paragraph:
|
1133
|
-
'<button type="button" class="btn btn-small dropdown-toggle" title="Paragraph" data-toggle="dropdown" tabindex="-1"><i class="icon-align-left"></i> <span class="caret"></span></button>' +
|
1134
|
-
'<ul class="dropdown-menu
|
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>' +
|
1273
|
+
'<ul class="dropdown-menu">' +
|
1135
1274
|
'<li>' +
|
1136
1275
|
'<div class="note-align btn-group">' +
|
1137
|
-
'<button type="button" class="btn 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>' +
|
1138
|
-
'<button type="button" class="btn 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>' +
|
1139
|
-
'<button type="button" class="btn 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>' +
|
1140
|
-
'<button type="button" class="btn 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>' +
|
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>' +
|
1141
1280
|
'</div>' +
|
1142
1281
|
'</li>' +
|
1143
1282
|
'<li>' +
|
1144
1283
|
'<div class="note-list btn-group">' +
|
1145
|
-
'<button type="button" class="btn btn-small" title="Outdent" data-shortcut="
|
1146
|
-
'<button type="button" class="btn btn-small" title="Indent" data-shortcut="
|
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>' +
|
1147
1286
|
'</li>' +
|
1148
1287
|
'</ul>',
|
1149
1288
|
height:
|
1150
|
-
'<button type="button" class="btn btn-small dropdown-toggle" data-toggle="dropdown" title="Line Height" tabindex="-1"><i class="icon-text-height"></i> <b class="caret"></b></button>' +
|
1151
|
-
'<ul class="dropdown-menu
|
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>' +
|
1290
|
+
'<ul class="dropdown-menu">' +
|
1152
1291
|
'<li><a data-event="lineHeight" data-value="1.0"><i class="icon-ok"></i> 1.0</a></li>' +
|
1153
1292
|
'<li><a data-event="lineHeight" data-value="1.2"><i class="icon-ok"></i> 1.2</a></li>' +
|
1154
1293
|
'<li><a data-event="lineHeight" data-value="1.4"><i class="icon-ok"></i> 1.4</a></li>' +
|
@@ -1159,7 +1298,7 @@
|
|
1159
1298
|
'<li><a data-event="lineHeight" data-value="3.0"><i class="icon-ok"></i> 3.0</a></li>' +
|
1160
1299
|
'</ul>',
|
1161
1300
|
help:
|
1162
|
-
'<button type="button" class="btn btn-small" title="Help" data-event="showHelpDialog" tabindex="-1"><i class="icon-question"></i></button>'
|
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>'
|
1163
1302
|
};
|
1164
1303
|
var sPopover = '<div class="note-popover">' +
|
1165
1304
|
'<div class="note-link-popover popover fade bottom in" style="display: none;">' +
|
@@ -1167,8 +1306,8 @@
|
|
1167
1306
|
'<div class="popover-content note-link-content">' +
|
1168
1307
|
'<a href="http://www.google.com" target="_blank">www.google.com</a> ' +
|
1169
1308
|
'<div class="note-insert btn-group">' +
|
1170
|
-
'<button type="button" class="btn btn-small" title="Edit" data-event="showLinkDialog" tabindex="-1"><i class="icon-edit"></i></button>' +
|
1171
|
-
'<button type="button" class="btn btn-small" title="Unlink" data-event="unlink" tabindex="-1"><i class="icon-unlink"></i></button>' +
|
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>' +
|
1172
1311
|
'</div>' +
|
1173
1312
|
'</div>' +
|
1174
1313
|
'</div>' +
|
@@ -1176,15 +1315,15 @@
|
|
1176
1315
|
'<div class="arrow"></div>' +
|
1177
1316
|
'<div class="popover-content note-image-content">' +
|
1178
1317
|
'<div class="btn-group">' +
|
1179
|
-
'<button type="button" class="btn btn-small" title="Resize Full" data-event="resize" data-value="1" tabindex="-1"><i class="icon-resize-full"></i></button>' +
|
1180
|
-
'<button type="button" class="btn btn-small" title="Resize Half" data-event="resize" data-value="0.5" tabindex="-1">½</button>' +
|
1181
|
-
'<button type="button" class="btn btn-small" title="Resize Thrid" data-event="resize" data-value="0.33" tabindex="-1">⅓</button>' +
|
1182
|
-
'<button type="button" class="btn btn-small" title="Resize Quarter" data-event="resize" data-value="0.25" tabindex="-1">¼</button>' +
|
1318
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Resize Full" data-event="resize" data-value="1" tabindex="-1"><i class="icon-resize-full"></i></button>' +
|
1319
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Resize Half" data-event="resize" data-value="0.5" tabindex="-1">½</button>' +
|
1320
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Resize Thrid" data-event="resize" data-value="0.33" tabindex="-1">⅓</button>' +
|
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>' +
|
1183
1322
|
'</div>' +
|
1184
1323
|
'<div class="btn-group">' +
|
1185
|
-
'<button type="button" class="btn btn-small" title="Float Left" data-event="float" data-value="left" tabindex="-1"><i class="icon-align-left"></i></button>' +
|
1186
|
-
'<button type="button" class="btn btn-small" title="Float Right" data-event="float" data-value="right" tabindex="-1"><i class="icon-align-right"></i></button>' +
|
1187
|
-
'<button type="button" class="btn btn-small" title="Float None" data-event="float" data-value="none" tabindex="-1"><i class="icon-reorder"></i></button>' +
|
1324
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Float Left" data-event="float" data-value="left" tabindex="-1"><i class="icon-align-left"></i></button>' +
|
1325
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Float Right" data-event="float" data-value="right" tabindex="-1"><i class="icon-align-right"></i></button>' +
|
1326
|
+
'<button type="button" class="btn btn-default btn-sm btn-small" title="Float None" data-event="float" data-value="none" tabindex="-1"><i class="icon-reorder"></i></button>' +
|
1188
1327
|
'</div>' +
|
1189
1328
|
'</div>' +
|
1190
1329
|
'</div>' +
|
@@ -1203,192 +1342,123 @@
|
|
1203
1342
|
|
1204
1343
|
var sShortcutText = '<table class="note-shortcut">' +
|
1205
1344
|
'<thead>' +
|
1206
|
-
'<tr>' +
|
1207
|
-
'<th></th>' +
|
1208
|
-
'<th>Text formatting</th>' +
|
1209
|
-
'</tr>' +
|
1345
|
+
'<tr><th></th><th>Text formatting</th></tr>' +
|
1210
1346
|
'</thead>' +
|
1211
1347
|
'<tbody>' +
|
1212
|
-
'<tr>' +
|
1213
|
-
|
1214
|
-
|
1215
|
-
'</tr>' +
|
1216
|
-
'<tr>' +
|
1217
|
-
'<td>⌘ + I</td>' +
|
1218
|
-
'<td>Italic</td>' +
|
1219
|
-
'</tr>' +
|
1220
|
-
'<tr>' +
|
1221
|
-
'<td>⌘ + U</td>' +
|
1222
|
-
'<td>Underline</td>' +
|
1223
|
-
'</tr>' +
|
1224
|
-
'<tr>' +
|
1225
|
-
'<td>⌘ + \\</td>' +
|
1226
|
-
'<td>Remove Font Style</td>' +
|
1227
|
-
'</tr>' +
|
1348
|
+
'<tr><td>⌘ + B</td><td>Toggle Bold</td></tr>' +
|
1349
|
+
'<tr><td>⌘ + I</td><td>Toggle Italic</td></tr>' +
|
1350
|
+
'<tr><td>⌘ + U</td><td>Toggle Underline</td></tr>' +
|
1351
|
+
'<tr><td>⌘ + ⇧ + S</td><td>Toggle Strike</td></tr>' +
|
1352
|
+
'<tr><td>⌘ + \\</td><td>Remove Font Style</td></tr>' +
|
1228
1353
|
'</tr>' +
|
1229
1354
|
'</tbody>' +
|
1230
1355
|
'</table>';
|
1231
1356
|
|
1232
1357
|
var sShortcutAction = '<table class="note-shortcut">' +
|
1233
1358
|
'<thead>' +
|
1234
|
-
'<tr>' +
|
1235
|
-
'<th></th>' +
|
1236
|
-
'<th>Action</th>' +
|
1237
|
-
'</tr>' +
|
1359
|
+
'<tr><th></th><th>Action</th></tr>' +
|
1238
1360
|
'</thead>' +
|
1239
1361
|
'<tbody>' +
|
1240
|
-
'<tr>' +
|
1241
|
-
|
1242
|
-
|
1243
|
-
'</tr>' +
|
1244
|
-
'<tr>' +
|
1245
|
-
|
1246
|
-
'<td>Redo</td>' +
|
1247
|
-
'</tr>' +
|
1248
|
-
'<tr>' +
|
1249
|
-
'<td>Tab</td>' +
|
1250
|
-
'<td>Indent</td>' +
|
1251
|
-
'</tr>' +
|
1252
|
-
'<tr>' +
|
1253
|
-
'<td>⇧ + Tab</td>' +
|
1254
|
-
'<td>Outdent</td>' +
|
1255
|
-
'</tr>' +
|
1256
|
-
'<tr>' +
|
1257
|
-
'<td>⌘ + K</td>' +
|
1258
|
-
'<td>Insert Link</td>' +
|
1259
|
-
'</tr>' +
|
1260
|
-
'<tr>' +
|
1261
|
-
'<td>⌘ + ENTER</td>' +
|
1262
|
-
'<td>Insert Horizontal Rule</td>' +
|
1263
|
-
'</tr>' +
|
1362
|
+
'<tr><td>⌘ + Z</td><td>Undo</td></tr>' +
|
1363
|
+
'<tr><td>⌘ + ⇧ + Z</td><td>Redo</td></tr>' +
|
1364
|
+
'<tr><td>⌘ + ]</td><td>Indent</td></tr>' +
|
1365
|
+
'<tr><td>⌘ + [</td><td>Outdent</td></tr>' +
|
1366
|
+
'<tr><td>⌘ + K</td><td>Insert Link</td></tr>' +
|
1367
|
+
'<tr><td>⌘ + ENTER</td><td>Insert Horizontal Rule</td></tr>' +
|
1264
1368
|
'</tbody>' +
|
1265
1369
|
'</table>';
|
1266
1370
|
|
1267
1371
|
var sShortcutPara = '<table class="note-shortcut">' +
|
1268
1372
|
'<thead>' +
|
1269
|
-
'<tr>' +
|
1270
|
-
'<th></th>' +
|
1271
|
-
'<th>Paragraph formatting</th>' +
|
1272
|
-
'</tr>' +
|
1373
|
+
'<tr><th></th><th>Paragraph formatting</th></tr>' +
|
1273
1374
|
'</thead>' +
|
1274
1375
|
'<tbody>' +
|
1275
|
-
'<tr>' +
|
1276
|
-
|
1277
|
-
|
1278
|
-
'</tr>' +
|
1279
|
-
'<tr>' +
|
1280
|
-
|
1281
|
-
'<td>Align Center</td>' +
|
1282
|
-
'</tr>' +
|
1283
|
-
'<tr>' +
|
1284
|
-
'<td>⌘ + ⇧ + R</td>' +
|
1285
|
-
'<td>Align Right</td>' +
|
1286
|
-
'</tr>' +
|
1287
|
-
'<tr>' +
|
1288
|
-
'<td>⌘ + ⇧ + J</td>' +
|
1289
|
-
'<td>Justify Full</td>' +
|
1290
|
-
'</tr>' +
|
1291
|
-
'<tr>' +
|
1292
|
-
'<td>⌘ + ⇧ + NUM7</td>' +
|
1293
|
-
'<td>Ordered List</td>' +
|
1294
|
-
'</tr>' +
|
1295
|
-
'<tr>' +
|
1296
|
-
'<td>⌘ + ⇧ + NUM8</td>' +
|
1297
|
-
'<td>Unordered List</td>' +
|
1298
|
-
'</tr>' +
|
1376
|
+
'<tr><td>⌘ + ⇧ + L</td><td>Align Left</td></tr>' +
|
1377
|
+
'<tr><td>⌘ + ⇧ + E</td><td>Align Center</td></tr>' +
|
1378
|
+
'<tr><td>⌘ + ⇧ + R</td><td>Align Right</td></tr>' +
|
1379
|
+
'<tr><td>⌘ + ⇧ + J</td><td>Justify Full</td></tr>' +
|
1380
|
+
'<tr><td>⌘ + ⇧ + NUM7</td><td>Ordered List</td></tr>' +
|
1381
|
+
'<tr><td>⌘ + ⇧ + NUM8</td><td>Unordered List</td></tr>' +
|
1299
1382
|
'</tbody>' +
|
1300
1383
|
'</table>';
|
1301
1384
|
|
1302
1385
|
var sShortcutStyle = '<table class="note-shortcut">' +
|
1303
1386
|
'<thead>' +
|
1304
|
-
'<tr>' +
|
1305
|
-
'<th></th>' +
|
1306
|
-
'<th>Document Style</th>' +
|
1307
|
-
'</tr>' +
|
1387
|
+
'<tr><th></th><th>Document Style</th></tr>' +
|
1308
1388
|
'</thead>' +
|
1309
1389
|
'<tbody>' +
|
1310
|
-
'<tr>' +
|
1311
|
-
|
1312
|
-
|
1313
|
-
'</tr>' +
|
1314
|
-
'<tr>' +
|
1315
|
-
|
1316
|
-
|
1317
|
-
'</tr>' +
|
1318
|
-
'<tr>' +
|
1319
|
-
'<td>⌘ + NUM2</td>' +
|
1320
|
-
'<td>Heading 2</td>' +
|
1321
|
-
'</tr>' +
|
1322
|
-
'<tr>' +
|
1323
|
-
'<td>⌘ + NUM3</td>' +
|
1324
|
-
'<td>Heading 3</td>' +
|
1325
|
-
'</tr>' +
|
1326
|
-
'<tr>' +
|
1327
|
-
'<td>⌘ + NUM4</td>' +
|
1328
|
-
'<td>Heading 4</td>' +
|
1329
|
-
'</tr>' +
|
1330
|
-
'<tr>' +
|
1331
|
-
'<td>⌘ + NUM5</td>' +
|
1332
|
-
'<td>Heading 5</td>' +
|
1333
|
-
'</tr>' +
|
1334
|
-
'<tr>' +
|
1335
|
-
'<td>⌘ + NUM6</td>' +
|
1336
|
-
'<td>Heading 6</td>' +
|
1337
|
-
'</tr>' +
|
1338
|
-
|
1390
|
+
'<tr><td>⌘ + NUM0</td><td>Normal Text</td></tr>' +
|
1391
|
+
'<tr><td>⌘ + NUM1</td><td>Heading 1</td></tr>' +
|
1392
|
+
'<tr><td>⌘ + NUM2</td><td>Heading 2</td></tr>' +
|
1393
|
+
'<tr><td>⌘ + NUM3</td><td>Heading 3</td></tr>' +
|
1394
|
+
'<tr><td>⌘ + NUM4</td><td>Heading 4</td></tr>' +
|
1395
|
+
'<tr><td>⌘ + NUM5</td><td>Heading 5</td></tr>' +
|
1396
|
+
'<tr><td>⌘ + NUM6</td><td>Heading 6</td></tr>' +
|
1339
1397
|
'</tbody>' +
|
1340
1398
|
'</table>';
|
1399
|
+
|
1341
1400
|
var sShortcutTable = '<table class="note-shortcut-layout">' +
|
1342
1401
|
'<tbody>' +
|
1343
|
-
'<tr>' +
|
1344
|
-
|
1345
|
-
'<td>' + sShortcutText +'</td>' +
|
1346
|
-
'</tr>' +
|
1347
|
-
'<tr>' +
|
1348
|
-
'<td>' + sShortcutStyle +'</td>' +
|
1349
|
-
'<td>' + sShortcutPara +'</td>' +
|
1350
|
-
'</tr>' +
|
1402
|
+
'<tr><td>' + sShortcutAction +'</td><td>' + sShortcutText +'</td></tr>' +
|
1403
|
+
'<tr><td>' + sShortcutStyle +'</td><td>' + sShortcutPara +'</td></tr>' +
|
1351
1404
|
'</tbody>' +
|
1352
1405
|
'</table>';
|
1353
1406
|
|
1354
1407
|
var sDialog = '<div class="note-dialog">' +
|
1355
|
-
'<div class="note-image-dialog modal
|
1356
|
-
'<div class="modal-
|
1357
|
-
'<
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1362
|
-
'<div class="
|
1363
|
-
|
1364
|
-
|
1408
|
+
'<div class="note-image-dialog modal" aria-hidden="false">' +
|
1409
|
+
'<div class="modal-dialog">' +
|
1410
|
+
'<div class="modal-content">' +
|
1411
|
+
'<div class="modal-header">' +
|
1412
|
+
'<button type="button" class="close" data-dismiss="modal" aria-hidden="true" tabindex="-1">×</button>' +
|
1413
|
+
'<h4>Insert Image</h4>' +
|
1414
|
+
'</div>' +
|
1415
|
+
'<div class="modal-body">' +
|
1416
|
+
'<div class="row-fluid">' +
|
1417
|
+
'<div class="note-dropzone span12">Drag an image here</div>' +
|
1418
|
+
'<div>or if you prefer...</div>' +
|
1419
|
+
'<input class="note-image-input" type="file" class="note-link-url" type="text" />' +
|
1420
|
+
'</div>' +
|
1421
|
+
'</div>' +
|
1365
1422
|
'</div>' +
|
1366
1423
|
'</div>' +
|
1367
1424
|
'</div>' +
|
1368
|
-
'<div class="note-link-dialog modal
|
1369
|
-
'<div class="modal-
|
1370
|
-
'<
|
1371
|
-
|
1372
|
-
|
1373
|
-
|
1374
|
-
|
1375
|
-
'<
|
1376
|
-
|
1377
|
-
|
1378
|
-
|
1425
|
+
'<div class="note-link-dialog modal" aria-hidden="false">' +
|
1426
|
+
'<div class="modal-dialog">' +
|
1427
|
+
'<div class="modal-content">' +
|
1428
|
+
'<div class="modal-header">' +
|
1429
|
+
'<button type="button" class="close" data-dismiss="modal" aria-hidden="true" tabindex="-1">×</button>' +
|
1430
|
+
'<h4>Edit Link</h4>' +
|
1431
|
+
'</div>' +
|
1432
|
+
'<div class="modal-body">' +
|
1433
|
+
'<div class="row-fluid">' +
|
1434
|
+
|
1435
|
+
'<div class="form-group">' +
|
1436
|
+
'<label>Text to display</label>' +
|
1437
|
+
'<span class="note-link-text form-control input-xlarge uneditable-input" />' +
|
1438
|
+
'</div>' +
|
1439
|
+
'<div class="form-group">' +
|
1440
|
+
'<label>To what URL should this link go?</label>' +
|
1441
|
+
'<input class="note-link-url form-control span12" type="text" />' +
|
1442
|
+
'</div>' +
|
1443
|
+
'</div>' +
|
1444
|
+
'</div>' +
|
1445
|
+
'<div class="modal-footer">' +
|
1446
|
+
'<a href="#" class="btn disabled note-link-btn" disabled="disabled">Link</a>' +
|
1447
|
+
'</div>' +
|
1379
1448
|
'</div>' +
|
1380
1449
|
'</div>' +
|
1381
|
-
'<div class="modal-footer">' +
|
1382
|
-
'<a href="#" class="btn disabled note-link-btn" disabled="disabled">Link</a>' +
|
1383
|
-
'</div>' +
|
1384
1450
|
'</div>' +
|
1385
|
-
'<div class="note-help-dialog modal
|
1386
|
-
'<div class="modal-
|
1387
|
-
'<div class="modal-
|
1388
|
-
|
1389
|
-
|
1390
|
-
|
1391
|
-
|
1451
|
+
'<div class="note-help-dialog modal fade" aria-hidden="false">' +
|
1452
|
+
'<div class="modal-dialog">' +
|
1453
|
+
'<div class="modal-content">' +
|
1454
|
+
'<div class="modal-body">' +
|
1455
|
+
'<div class="modal-background">' +
|
1456
|
+
'<a class="modal-close pull-right" data-dismiss="modal" aria-hidden="true" tabindex="-1">Close</a>' +
|
1457
|
+
'<div class="title">Keyboard shortcuts</div>' +
|
1458
|
+
sShortcutTable +
|
1459
|
+
'<p class="text-center"><a href="//hackerwins.github.io/summernote/" target="_blank">Summernote v0.3</a> · <a href="//github.com/HackerWins/summernote" target="_blank">Project</a> · <a href="//github.com/HackerWins/summernote/issues" target="_blank">Issues</a></p>' +
|
1460
|
+
'</div>' +
|
1461
|
+
'</div>' +
|
1392
1462
|
'</div>' +
|
1393
1463
|
'</div>' +
|
1394
1464
|
'</div>';
|
@@ -1447,7 +1517,12 @@
|
|
1447
1517
|
//01. create Editor
|
1448
1518
|
var welEditor = $('<div class="note-editor"></div>');
|
1449
1519
|
|
1450
|
-
//02.
|
1520
|
+
//02. statusbar
|
1521
|
+
if (nHeight > 0) {
|
1522
|
+
var welStatusbar = $('<div class="note-statusbar"><div class="note-resizebar"><div class="note-icon-bar"></div><div class="note-icon-bar"></div><div class="note-icon-bar"></div></div></div>').prependTo(welEditor);
|
1523
|
+
}
|
1524
|
+
|
1525
|
+
//03. create Editable
|
1451
1526
|
var welEditable = $('<div class="note-editable" contentEditable="true"></div>').prependTo(welEditor);
|
1452
1527
|
if (nTabIndex) { welEditable.attr('tabIndex', nTabIndex); }
|
1453
1528
|
if (nHeight) { welEditable.height(nHeight); }
|
@@ -1455,12 +1530,12 @@
|
|
1455
1530
|
welEditable.html(welHolder.html());
|
1456
1531
|
welEditable.data('NoteHistory', new History());
|
1457
1532
|
|
1458
|
-
//
|
1533
|
+
//04. create Toolbar
|
1459
1534
|
var sToolbar = '';
|
1460
|
-
for (var idx
|
1535
|
+
for (var idx = 0, sz = aToolbarSetting.length; idx < sz; idx ++) {
|
1461
1536
|
var group = aToolbarSetting[idx];
|
1462
1537
|
sToolbar += '<div class="note-' + group[0] + ' btn-group">';
|
1463
|
-
for (var i
|
1538
|
+
for (var i = 0, szGroup = group[1].length; i < szGroup; i++) {
|
1464
1539
|
sToolbar += aToolbarItem[group[1][i]];
|
1465
1540
|
}
|
1466
1541
|
sToolbar += '</div>';
|
@@ -1472,17 +1547,17 @@
|
|
1472
1547
|
createPalette(welToolbar);
|
1473
1548
|
createTooltip(welToolbar, 'bottom');
|
1474
1549
|
|
1475
|
-
//
|
1550
|
+
//05. create Popover
|
1476
1551
|
var welPopover = $(sPopover).prependTo(welEditor);
|
1477
1552
|
createTooltip(welPopover);
|
1478
1553
|
|
1479
|
-
//
|
1554
|
+
//06. handle(control selection, ...)
|
1480
1555
|
$(sHandle).prependTo(welEditor);
|
1481
1556
|
|
1482
|
-
//
|
1557
|
+
//07. create Dialog
|
1483
1558
|
$(sDialog).prependTo(welEditor);
|
1484
1559
|
|
1485
|
-
//
|
1560
|
+
//08. Editor/Holder switch
|
1486
1561
|
welEditor.insertAfter(welHolder);
|
1487
1562
|
welHolder.hide();
|
1488
1563
|
};
|
@@ -1494,8 +1569,9 @@
|
|
1494
1569
|
|
1495
1570
|
return {
|
1496
1571
|
editor: welEditor,
|
1497
|
-
editable: welEditor.find('.note-editable'),
|
1498
1572
|
toolbar: welEditor.find('.note-toolbar'),
|
1573
|
+
editable: welEditor.find('.note-editable'),
|
1574
|
+
statusbar: welEditor.find('.note-statusbar'),
|
1499
1575
|
popover: welEditor.find('.note-popover'),
|
1500
1576
|
handle: welEditor.find('.note-handle'),
|
1501
1577
|
dialog: welEditor.find('.note-dialog')
|
@@ -1523,18 +1599,18 @@
|
|
1523
1599
|
// create Editor Layout and attach Key and Mouse Event
|
1524
1600
|
summernote: function(options) {
|
1525
1601
|
options = $.extend({
|
1526
|
-
|
1527
|
-
|
1528
|
-
|
1529
|
-
|
1530
|
-
|
1531
|
-
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1602
|
+
toolbar: [
|
1603
|
+
['style', ['style']],
|
1604
|
+
['font', ['bold', 'italic', 'underline', 'clear']],
|
1605
|
+
['fontsize', ['fontsize']],
|
1606
|
+
['color', ['color']],
|
1607
|
+
['para', ['ul', 'ol', 'paragraph']],
|
1608
|
+
['height', ['height']],
|
1609
|
+
['table', ['table']],
|
1610
|
+
['insert', ['link', 'picture']],
|
1611
|
+
['help', ['help']]
|
1612
|
+
]
|
1613
|
+
}, options );
|
1538
1614
|
|
1539
1615
|
this.each(function(idx, elHolder) {
|
1540
1616
|
var welHolder = $(elHolder);
|
@@ -1587,4 +1663,27 @@
|
|
1587
1663
|
return { dom: dom, list: list, func: func, Range: Range };
|
1588
1664
|
}
|
1589
1665
|
});
|
1590
|
-
})(jQuery); // jQuery
|
1666
|
+
})(jQuery); // jQuery
|
1667
|
+
|
1668
|
+
//Array.prototype.reduce fallback
|
1669
|
+
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
|
1670
|
+
if ('function' !== typeof Array.prototype.reduce) {
|
1671
|
+
Array.prototype.reduce = function(callback, opt_initialValue) {
|
1672
|
+
'use strict';
|
1673
|
+
var idx, value, length = this.length >>> 0, isValueSet = false;
|
1674
|
+
if (1 < arguments.length) { value = opt_initialValue, isValueSet = true; }
|
1675
|
+
for (idx = 0; length > idx; ++idx) {
|
1676
|
+
if (this.hasOwnProperty(idx)) {
|
1677
|
+
if (isValueSet) {
|
1678
|
+
value = callback(value, this[idx], idx, this);
|
1679
|
+
} else {
|
1680
|
+
value = this[idx], isValueSet = true;
|
1681
|
+
}
|
1682
|
+
}
|
1683
|
+
}
|
1684
|
+
if (!isValueSet) {
|
1685
|
+
throw new TypeError('Reduce of empty array with no initial value');
|
1686
|
+
}
|
1687
|
+
return value;
|
1688
|
+
};
|
1689
|
+
}
|