summernote-rails 0.6.10.0 → 0.6.16.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/lib/summernote-rails/version.rb +1 -1
- data/vendor/assets/javascripts/summernote/locales/de-DE.js +6 -0
- data/vendor/assets/javascripts/summernote/locales/lt-LT.js +107 -0
- data/vendor/assets/javascripts/summernote/locales/zh-CN.js +19 -9
- data/vendor/assets/javascripts/summernote/locales/zh-TW.js +14 -3
- data/vendor/assets/javascripts/summernote/summernote.js +344 -215
- 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: 1f980d45866bbcf650bb0b08d938d53d25bbea16
|
|
4
|
+
data.tar.gz: 3026217d30c1fed40150e6c72f34f2a47f2c03eb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 02d890be63fbcc32719d9cd8393f55c339bfab7b9e2df3475896b378678594834ef59b931cda1b350e31953f31f0c58d996e48eaad62bea3e0fb30f155d87cdf
|
|
7
|
+
data.tar.gz: bd0080560c3e877f668948e14f703dd35335e4bc73d3a70b2d90ef6c9a267558e5fb023c15ad83e1d9698ae8970d93e5c0886223cf39a5ff3366f19ad767e17a
|
|
@@ -19,8 +19,14 @@
|
|
|
19
19
|
floatLeft: 'Linksbündig',
|
|
20
20
|
floatRight: 'Rechtsbündig',
|
|
21
21
|
floatNone: 'Kein Textfluss',
|
|
22
|
+
shapeRounded: 'Rahmen: Abgerundet',
|
|
23
|
+
shapeCircle: 'Rahmen: Kreisförmig',
|
|
24
|
+
shapeThumbnail: 'Rahmen: Thumbnail',
|
|
25
|
+
shapeNone: 'Kein Rahmen',
|
|
22
26
|
dragImageHere: 'Ziehen Sie ein Bild mit der Maus hierher',
|
|
23
27
|
selectFromFiles: 'Wählen Sie eine Datei aus',
|
|
28
|
+
maximumFileSize: 'Maximale Dateigröße',
|
|
29
|
+
maximumFileSizeError: 'Maximale Dateigröße überschritten',
|
|
24
30
|
url: 'Grafik URL',
|
|
25
31
|
remove: 'Grafik entfernen'
|
|
26
32
|
},
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
(function ($) {
|
|
2
|
+
$.extend($.summernote.lang, {
|
|
3
|
+
'lt-LT': {
|
|
4
|
+
font: {
|
|
5
|
+
bold: 'Paryškintas',
|
|
6
|
+
italic: 'Kursyvas',
|
|
7
|
+
underline: 'Pabrėžtas',
|
|
8
|
+
clear: 'Be formatavimo',
|
|
9
|
+
height: 'Eilutės aukštis',
|
|
10
|
+
name: 'Šrifto pavadinimas',
|
|
11
|
+
strikethrough: 'Perbrauktas',
|
|
12
|
+
superscript: 'Viršutinis',
|
|
13
|
+
subscript: 'Indeksas',
|
|
14
|
+
size: 'Šrifto dydis'
|
|
15
|
+
},
|
|
16
|
+
image: {
|
|
17
|
+
image: 'Paveikslėlis',
|
|
18
|
+
insert: 'Įterpti paveikslėlį',
|
|
19
|
+
resizeFull: 'Pilnas dydis',
|
|
20
|
+
resizeHalf: 'Sumažinti dydį 50%',
|
|
21
|
+
resizeQuarter: 'Sumažinti dydį 25%',
|
|
22
|
+
floatLeft: 'Kairinis lygiavimas',
|
|
23
|
+
floatRight: 'Dešininis lygiavimas',
|
|
24
|
+
floatNone: 'Jokio lygiavimo',
|
|
25
|
+
shapeRounded: 'Forma: apvalūs kraštai',
|
|
26
|
+
shapeCircle: 'Forma: apskritimas',
|
|
27
|
+
shapeThumbnail: 'Forma: miniatiūra',
|
|
28
|
+
shapeNone: 'Forma: jokia',
|
|
29
|
+
dragImageHere: 'Vilkite paveikslėlį čia',
|
|
30
|
+
selectFromFiles: 'Pasirinkite failą',
|
|
31
|
+
maximumFileSize: 'Maskimalus failo dydis',
|
|
32
|
+
maximumFileSizeError: 'Maskimalus failo dydis viršytas!',
|
|
33
|
+
url: 'Paveikslėlio URL adresas',
|
|
34
|
+
remove: 'Ištrinti paveikslėlį'
|
|
35
|
+
},
|
|
36
|
+
link: {
|
|
37
|
+
link: 'Nuoroda',
|
|
38
|
+
insert: 'Įterpti nuorodą',
|
|
39
|
+
unlink: 'Pašalinti nuorodą',
|
|
40
|
+
edit: 'Redaguoti',
|
|
41
|
+
textToDisplay: 'Rodomas tekstas',
|
|
42
|
+
url: 'Koks URL adresas yra susietas?',
|
|
43
|
+
openInNewWindow: 'Atidaryti naujame lange'
|
|
44
|
+
},
|
|
45
|
+
table: {
|
|
46
|
+
table: 'Lentelė'
|
|
47
|
+
},
|
|
48
|
+
hr: {
|
|
49
|
+
insert: 'Įterpti horizontalią liniją'
|
|
50
|
+
},
|
|
51
|
+
style: {
|
|
52
|
+
style: 'Stilius',
|
|
53
|
+
normal: 'Normalus',
|
|
54
|
+
blockquote: 'Citata',
|
|
55
|
+
pre: 'Kodas',
|
|
56
|
+
h1: 'Antraštė 1',
|
|
57
|
+
h2: 'Antraštė 2',
|
|
58
|
+
h3: 'Antraštė 3',
|
|
59
|
+
h4: 'Antraštė 4',
|
|
60
|
+
h5: 'Antraštė 5',
|
|
61
|
+
h6: 'Antraštė 6'
|
|
62
|
+
},
|
|
63
|
+
lists: {
|
|
64
|
+
unordered: 'Suženklintasis sąrašas',
|
|
65
|
+
ordered: 'Sunumeruotas sąrašas'
|
|
66
|
+
},
|
|
67
|
+
options: {
|
|
68
|
+
help: 'Pagalba',
|
|
69
|
+
fullscreen: 'Viso ekrano režimas',
|
|
70
|
+
codeview: 'HTML kodo peržiūra'
|
|
71
|
+
},
|
|
72
|
+
paragraph: {
|
|
73
|
+
paragraph: 'Pastraipa',
|
|
74
|
+
outdent: 'Sumažinti įtrauką',
|
|
75
|
+
indent: 'Padidinti įtrauką',
|
|
76
|
+
left: 'Kairinė lygiuotė',
|
|
77
|
+
center: 'Centrinė lygiuotė',
|
|
78
|
+
right: 'Dešininė lygiuotė',
|
|
79
|
+
justify: 'Abipusis išlyginimas'
|
|
80
|
+
},
|
|
81
|
+
color: {
|
|
82
|
+
recent: 'Paskutinė naudota spalva',
|
|
83
|
+
more: 'Daugiau spalvų',
|
|
84
|
+
background: 'Fono spalva',
|
|
85
|
+
foreground: 'Šrifto spalva',
|
|
86
|
+
transparent: 'Permatoma',
|
|
87
|
+
setTransparent: 'Nustatyti skaidrumo intensyvumą',
|
|
88
|
+
reset: 'Atkurti',
|
|
89
|
+
resetToDefault: 'Atstatyti numatytąją spalvą'
|
|
90
|
+
},
|
|
91
|
+
shortcut: {
|
|
92
|
+
shortcuts: 'Spartieji klavišai',
|
|
93
|
+
close: 'Uždaryti',
|
|
94
|
+
textFormatting: 'Teksto formatavimas',
|
|
95
|
+
action: 'Veiksmas',
|
|
96
|
+
paragraphFormatting: 'Pastraipos formatavimas',
|
|
97
|
+
documentStyle: 'Dokumento stilius',
|
|
98
|
+
extraKeys: 'Papildomi klavišų deriniai'
|
|
99
|
+
},
|
|
100
|
+
history: {
|
|
101
|
+
undo: 'Anuliuoti veiksmą',
|
|
102
|
+
redo: 'Perdaryti veiksmą'
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
})(jQuery);
|
|
@@ -9,20 +9,29 @@
|
|
|
9
9
|
height: '行高',
|
|
10
10
|
name: '字体',
|
|
11
11
|
strikethrough: '删除线',
|
|
12
|
+
subscript: '下标',
|
|
13
|
+
superscript: '上标',
|
|
12
14
|
size: '字号'
|
|
13
15
|
},
|
|
14
16
|
image: {
|
|
15
17
|
image: '图片',
|
|
16
18
|
insert: '插入图片',
|
|
17
|
-
resizeFull: '
|
|
18
|
-
resizeHalf: '
|
|
19
|
-
resizeQuarter: '
|
|
20
|
-
floatLeft: '
|
|
21
|
-
floatRight: '
|
|
22
|
-
floatNone: '
|
|
23
|
-
|
|
19
|
+
resizeFull: '缩放至 100%',
|
|
20
|
+
resizeHalf: '缩放至 50%',
|
|
21
|
+
resizeQuarter: '缩放至 25%',
|
|
22
|
+
floatLeft: '靠左浮动',
|
|
23
|
+
floatRight: '靠右浮动',
|
|
24
|
+
floatNone: '取消浮动',
|
|
25
|
+
shapeRounded: '形状: 圆角',
|
|
26
|
+
shapeCircle: '形状: 圆',
|
|
27
|
+
shapeThumbnail: '形状: 缩略图',
|
|
28
|
+
shapeNone: '形状: 无',
|
|
29
|
+
dragImageHere: '将图片拖拽至此处',
|
|
24
30
|
selectFromFiles: '从本地上传',
|
|
25
|
-
|
|
31
|
+
maximumFileSize: '文件大小最大值',
|
|
32
|
+
maximumFileSizeError: '文件大小超出最大值。',
|
|
33
|
+
url: '图片地址',
|
|
34
|
+
remove: '移除图片'
|
|
26
35
|
},
|
|
27
36
|
link: {
|
|
28
37
|
link: '链接',
|
|
@@ -85,7 +94,8 @@
|
|
|
85
94
|
textFormatting: '文本格式',
|
|
86
95
|
action: '动作',
|
|
87
96
|
paragraphFormatting: '段落格式',
|
|
88
|
-
documentStyle: '文档样式'
|
|
97
|
+
documentStyle: '文档样式',
|
|
98
|
+
extraKeys: '额外按键'
|
|
89
99
|
},
|
|
90
100
|
history: {
|
|
91
101
|
undo: '撤销',
|
|
@@ -7,8 +7,11 @@
|
|
|
7
7
|
underline: '底線',
|
|
8
8
|
clear: '清除格式',
|
|
9
9
|
height: '行高',
|
|
10
|
+
name: '字體',
|
|
10
11
|
strikethrough: '刪除線',
|
|
11
|
-
|
|
12
|
+
subscript: '下標',
|
|
13
|
+
superscript: '上標',
|
|
14
|
+
size: '字號'
|
|
12
15
|
},
|
|
13
16
|
image: {
|
|
14
17
|
image: '圖片',
|
|
@@ -19,9 +22,16 @@
|
|
|
19
22
|
floatLeft: '靠左浮動',
|
|
20
23
|
floatRight: '靠右浮動',
|
|
21
24
|
floatNone: '取消浮動',
|
|
25
|
+
shapeRounded: '形狀: 圓角',
|
|
26
|
+
shapeCircle: '形狀: 圓',
|
|
27
|
+
shapeThumbnail: '形狀: 縮略圖',
|
|
28
|
+
shapeNone: '形狀: 無',
|
|
22
29
|
dragImageHere: '將圖片拖曳至此處',
|
|
23
30
|
selectFromFiles: '從本機上傳',
|
|
24
|
-
|
|
31
|
+
maximumFileSize: '文件大小最大值',
|
|
32
|
+
maximumFileSizeError: '文件大小超出最大值。',
|
|
33
|
+
url: '圖片網址',
|
|
34
|
+
remove: '移除圖片'
|
|
25
35
|
},
|
|
26
36
|
link: {
|
|
27
37
|
link: '連結',
|
|
@@ -84,7 +94,8 @@
|
|
|
84
94
|
textFormatting: '文字格式',
|
|
85
95
|
action: '動作',
|
|
86
96
|
paragraphFormatting: '段落格式',
|
|
87
|
-
documentStyle: '文件格式'
|
|
97
|
+
documentStyle: '文件格式',
|
|
98
|
+
extraKeys: '額外按鍵'
|
|
88
99
|
},
|
|
89
100
|
history: {
|
|
90
101
|
undo: '復原',
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Super simple wysiwyg editor on Bootstrap v0.6.
|
|
2
|
+
* Super simple wysiwyg editor on Bootstrap v0.6.16
|
|
3
3
|
* http://summernote.org/
|
|
4
4
|
*
|
|
5
5
|
* summernote.js
|
|
6
6
|
* Copyright 2013-2015 Alan Hong. and other contributors
|
|
7
7
|
* summernote may be freely distributed under the MIT license./
|
|
8
8
|
*
|
|
9
|
-
* Date: 2015-
|
|
9
|
+
* Date: 2015-08-03T16:40Z
|
|
10
10
|
*/
|
|
11
11
|
(function (factory) {
|
|
12
12
|
/* global define */
|
|
@@ -80,6 +80,47 @@
|
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
if (!Array.prototype.map) {
|
|
84
|
+
/**
|
|
85
|
+
* Array.prototype.map polyfill
|
|
86
|
+
*
|
|
87
|
+
* @param {Function} callback
|
|
88
|
+
* @return {Array}
|
|
89
|
+
*
|
|
90
|
+
* @see https://goo.gl/SMWaMK
|
|
91
|
+
*/
|
|
92
|
+
Array.prototype.map = function (callback, thisArg) {
|
|
93
|
+
var T, A, k;
|
|
94
|
+
if (this === null) {
|
|
95
|
+
throw new TypeError(' this is null or not defined');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
var O = Object(this);
|
|
99
|
+
var len = O.length >>> 0;
|
|
100
|
+
if (typeof callback !== 'function') {
|
|
101
|
+
throw new TypeError(callback + ' is not a function');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (arguments.length > 1) {
|
|
105
|
+
T = thisArg;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
A = new Array(len);
|
|
109
|
+
k = 0;
|
|
110
|
+
|
|
111
|
+
while (k < len) {
|
|
112
|
+
var kValue, mappedValue;
|
|
113
|
+
if (k in O) {
|
|
114
|
+
kValue = O[k];
|
|
115
|
+
mappedValue = callback.call(T, kValue, k, O);
|
|
116
|
+
A[k] = mappedValue;
|
|
117
|
+
}
|
|
118
|
+
k++;
|
|
119
|
+
}
|
|
120
|
+
return A;
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
83
124
|
var isSupportAmd = typeof define === 'function' && define.amd;
|
|
84
125
|
|
|
85
126
|
/**
|
|
@@ -106,6 +147,18 @@
|
|
|
106
147
|
};
|
|
107
148
|
|
|
108
149
|
var userAgent = navigator.userAgent;
|
|
150
|
+
var isMSIE = /MSIE|Trident/i.test(userAgent);
|
|
151
|
+
var browserVersion;
|
|
152
|
+
if (isMSIE) {
|
|
153
|
+
var matches = /MSIE (\d+[.]\d+)/.exec(userAgent);
|
|
154
|
+
if (matches) {
|
|
155
|
+
browserVersion = parseFloat(matches[1]);
|
|
156
|
+
}
|
|
157
|
+
matches = /Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/.exec(userAgent);
|
|
158
|
+
if (matches) {
|
|
159
|
+
browserVersion = parseFloat(matches[1]);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
109
162
|
|
|
110
163
|
/**
|
|
111
164
|
* @class core.agent
|
|
@@ -119,12 +172,14 @@
|
|
|
119
172
|
/** @property {Boolean} [isMac=false] true if this agent is Mac */
|
|
120
173
|
isMac: navigator.appVersion.indexOf('Mac') > -1,
|
|
121
174
|
/** @property {Boolean} [isMSIE=false] true if this agent is a Internet Explorer */
|
|
122
|
-
isMSIE:
|
|
175
|
+
isMSIE: isMSIE,
|
|
123
176
|
/** @property {Boolean} [isFF=false] true if this agent is a Firefox */
|
|
124
177
|
isFF: /firefox/i.test(userAgent),
|
|
125
178
|
isWebkit: /webkit/i.test(userAgent),
|
|
126
179
|
/** @property {Boolean} [isSafari=false] true if this agent is a Safari */
|
|
127
180
|
isSafari: /safari/i.test(userAgent),
|
|
181
|
+
/** @property {Float} browserVersion current browser version */
|
|
182
|
+
browserVersion: browserVersion,
|
|
128
183
|
/** @property {String} jqueryVersion current jQuery version string */
|
|
129
184
|
jqueryVersion: parseFloat($.fn.jquery),
|
|
130
185
|
isSupportAmd: isSupportAmd,
|
|
@@ -329,11 +384,18 @@
|
|
|
329
384
|
return true;
|
|
330
385
|
};
|
|
331
386
|
|
|
387
|
+
/**
|
|
388
|
+
* returns index of item
|
|
389
|
+
*/
|
|
390
|
+
var indexOf = function (array, item) {
|
|
391
|
+
return $.inArray(item, array);
|
|
392
|
+
};
|
|
393
|
+
|
|
332
394
|
/**
|
|
333
395
|
* returns true if the value is present in the list.
|
|
334
396
|
*/
|
|
335
397
|
var contains = function (array, item) {
|
|
336
|
-
return
|
|
398
|
+
return indexOf(array, item) !== -1;
|
|
337
399
|
};
|
|
338
400
|
|
|
339
401
|
/**
|
|
@@ -418,7 +480,7 @@
|
|
|
418
480
|
* @param {Array} array
|
|
419
481
|
*/
|
|
420
482
|
var next = function (array, item) {
|
|
421
|
-
var idx =
|
|
483
|
+
var idx = indexOf(array, item);
|
|
422
484
|
if (idx === -1) { return null; }
|
|
423
485
|
|
|
424
486
|
return array[idx + 1];
|
|
@@ -429,12 +491,11 @@
|
|
|
429
491
|
* @param {Array} array
|
|
430
492
|
*/
|
|
431
493
|
var prev = function (array, item) {
|
|
432
|
-
var idx =
|
|
494
|
+
var idx = indexOf(array, item);
|
|
433
495
|
if (idx === -1) { return null; }
|
|
434
496
|
|
|
435
497
|
return array[idx - 1];
|
|
436
498
|
};
|
|
437
|
-
|
|
438
499
|
|
|
439
500
|
return { head: head, last: last, initial: initial, tail: tail,
|
|
440
501
|
prev: prev, next: next, find: find, contains: contains,
|
|
@@ -516,13 +577,13 @@
|
|
|
516
577
|
|
|
517
578
|
// frame mode
|
|
518
579
|
} else {
|
|
519
|
-
makeFinder = function (
|
|
520
|
-
|
|
521
|
-
return function () { return $
|
|
580
|
+
makeFinder = function (className, $base) {
|
|
581
|
+
$base = $base || $editor;
|
|
582
|
+
return function () { return $base.find(className); };
|
|
522
583
|
};
|
|
523
584
|
|
|
524
585
|
var options = $editor.data('options');
|
|
525
|
-
var dialogHolder = (options && options.dialogsInBody) ? document.body : null;
|
|
586
|
+
var $dialogHolder = (options && options.dialogsInBody) ? $(document.body) : null;
|
|
526
587
|
|
|
527
588
|
return {
|
|
528
589
|
editor: function () { return $editor; },
|
|
@@ -534,7 +595,7 @@
|
|
|
534
595
|
statusbar: makeFinder('.note-statusbar'),
|
|
535
596
|
popover: makeFinder('.note-popover'),
|
|
536
597
|
handle: makeFinder('.note-handle'),
|
|
537
|
-
dialog: makeFinder('.note-dialog', dialogHolder)
|
|
598
|
+
dialog: makeFinder('.note-dialog', $dialogHolder)
|
|
538
599
|
};
|
|
539
600
|
}
|
|
540
601
|
};
|
|
@@ -595,7 +656,7 @@
|
|
|
595
656
|
* @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements
|
|
596
657
|
*/
|
|
597
658
|
var isVoid = function (node) {
|
|
598
|
-
return node && /^BR|^IMG|^HR/.test(node.nodeName.toUpperCase());
|
|
659
|
+
return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON/.test(node.nodeName.toUpperCase());
|
|
599
660
|
};
|
|
600
661
|
|
|
601
662
|
var isPara = function (node) {
|
|
@@ -618,6 +679,7 @@
|
|
|
618
679
|
var isInline = function (node) {
|
|
619
680
|
return !isBodyContainer(node) &&
|
|
620
681
|
!isList(node) &&
|
|
682
|
+
!isHr(node) &&
|
|
621
683
|
!isPara(node) &&
|
|
622
684
|
!isTable(node) &&
|
|
623
685
|
!isBlockquote(node);
|
|
@@ -627,6 +689,8 @@
|
|
|
627
689
|
return node && /^UL|^OL/.test(node.nodeName.toUpperCase());
|
|
628
690
|
};
|
|
629
691
|
|
|
692
|
+
var isHr = makePredByNodeName('HR');
|
|
693
|
+
|
|
630
694
|
var isCell = function (node) {
|
|
631
695
|
return node && /^TD|^TH/.test(node.nodeName.toUpperCase());
|
|
632
696
|
};
|
|
@@ -684,9 +748,10 @@
|
|
|
684
748
|
|
|
685
749
|
/**
|
|
686
750
|
* blank HTML for cursor position
|
|
687
|
-
* - [workaround]
|
|
751
|
+
* - [workaround] old IE only works with
|
|
752
|
+
* - [workaround] IE11 and other browser works with bogus br
|
|
688
753
|
*/
|
|
689
|
-
var blankHTML = agent.isMSIE ? ' ' : '<br>';
|
|
754
|
+
var blankHTML = agent.isMSIE && agent.browserVersion < 11 ? ' ' : '<br>';
|
|
690
755
|
|
|
691
756
|
/**
|
|
692
757
|
* @method nodeLength
|
|
@@ -1200,7 +1265,7 @@
|
|
|
1200
1265
|
*/
|
|
1201
1266
|
var makeOffsetPath = function (ancestor, node) {
|
|
1202
1267
|
var ancestors = listAncestor(node, func.eq(ancestor));
|
|
1203
|
-
return
|
|
1268
|
+
return ancestors.map(position).reverse();
|
|
1204
1269
|
};
|
|
1205
1270
|
|
|
1206
1271
|
/**
|
|
@@ -1750,8 +1815,8 @@
|
|
|
1750
1815
|
|
|
1751
1816
|
// point on block's edge
|
|
1752
1817
|
var block = dom.ancestor(point.node, dom.isBlock);
|
|
1753
|
-
if ((dom.isLeftEdgePointOf(point, block) && !isLeftToRight) ||
|
|
1754
|
-
(dom.isRightEdgePointOf(point, block) && isLeftToRight)) {
|
|
1818
|
+
if (((dom.isLeftEdgePointOf(point, block) || dom.isVoid(dom.prevPoint(point).node)) && !isLeftToRight) ||
|
|
1819
|
+
((dom.isRightEdgePointOf(point, block) || dom.isVoid(dom.nextPoint(point).node)) && isLeftToRight)) {
|
|
1755
1820
|
|
|
1756
1821
|
// returns point already on visible point
|
|
1757
1822
|
if (dom.isVisiblePoint(point)) {
|
|
@@ -2059,14 +2124,13 @@
|
|
|
2059
2124
|
* insert html at current cursor
|
|
2060
2125
|
*/
|
|
2061
2126
|
this.pasteHTML = function (markup) {
|
|
2062
|
-
var self = this;
|
|
2063
2127
|
var contentsContainer = $('<div></div>').html(markup)[0];
|
|
2064
2128
|
var childNodes = list.from(contentsContainer.childNodes);
|
|
2065
2129
|
|
|
2066
|
-
this.wrapBodyInlineWithPara().deleteContents();
|
|
2130
|
+
var rng = this.wrapBodyInlineWithPara().deleteContents();
|
|
2067
2131
|
|
|
2068
|
-
return
|
|
2069
|
-
return
|
|
2132
|
+
return childNodes.reverse().map(function (childNode) {
|
|
2133
|
+
return rng.insertNode(childNode);
|
|
2070
2134
|
}).reverse();
|
|
2071
2135
|
};
|
|
2072
2136
|
|
|
@@ -2320,7 +2384,7 @@
|
|
|
2320
2384
|
*/
|
|
2321
2385
|
var defaults = {
|
|
2322
2386
|
/** @property */
|
|
2323
|
-
version: '0.6.
|
|
2387
|
+
version: '0.6.16',
|
|
2324
2388
|
|
|
2325
2389
|
/**
|
|
2326
2390
|
*
|
|
@@ -2361,9 +2425,12 @@
|
|
|
2361
2425
|
disableLinkTarget: false, // hide link Target Checkbox
|
|
2362
2426
|
disableDragAndDrop: false, // disable drag and drop event
|
|
2363
2427
|
disableResizeEditor: false, // disable resizing editor
|
|
2428
|
+
disableResizeImage: false, // disable resizing image
|
|
2364
2429
|
|
|
2365
2430
|
shortcuts: true, // enable keyboard shortcuts
|
|
2366
2431
|
|
|
2432
|
+
textareaAutoSync: true, // enable textarea auto sync
|
|
2433
|
+
|
|
2367
2434
|
placeholder: false, // enable placeholder text
|
|
2368
2435
|
prettifyHtml: true, // enable prettifying html while toggling codeview
|
|
2369
2436
|
|
|
@@ -2435,6 +2502,8 @@
|
|
|
2435
2502
|
}
|
|
2436
2503
|
},
|
|
2437
2504
|
|
|
2505
|
+
dialogsInBody: false, // false will add dialogs into editor
|
|
2506
|
+
|
|
2438
2507
|
codemirror: { // codemirror options
|
|
2439
2508
|
mode: 'text/html',
|
|
2440
2509
|
htmlMode: true,
|
|
@@ -2822,6 +2891,7 @@
|
|
|
2822
2891
|
'R': 82,
|
|
2823
2892
|
'S': 83,
|
|
2824
2893
|
'U': 85,
|
|
2894
|
+
'V': 86,
|
|
2825
2895
|
'Y': 89,
|
|
2826
2896
|
'Z': 90,
|
|
2827
2897
|
|
|
@@ -2892,6 +2962,11 @@
|
|
|
2892
2962
|
* undo
|
|
2893
2963
|
*/
|
|
2894
2964
|
this.undo = function () {
|
|
2965
|
+
// Create snap shot if not yet recorded
|
|
2966
|
+
if ($editable.html() !== stack[stackOffset].contents) {
|
|
2967
|
+
this.recordUndo();
|
|
2968
|
+
}
|
|
2969
|
+
|
|
2895
2970
|
if (0 < stackOffset) {
|
|
2896
2971
|
stackOffset--;
|
|
2897
2972
|
applySnapshot(stack[stackOffset]);
|
|
@@ -2958,6 +3033,19 @@
|
|
|
2958
3033
|
return $obj.css.call($obj, propertyNames);
|
|
2959
3034
|
};
|
|
2960
3035
|
|
|
3036
|
+
/**
|
|
3037
|
+
* returns style object from node
|
|
3038
|
+
*
|
|
3039
|
+
* @param {jQuery} $node
|
|
3040
|
+
* @return {Object}
|
|
3041
|
+
*/
|
|
3042
|
+
this.fromNode = function ($node) {
|
|
3043
|
+
var properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];
|
|
3044
|
+
var styleInfo = jQueryCSS($node, properties) || {};
|
|
3045
|
+
styleInfo['font-size'] = parseInt(styleInfo['font-size'], 10);
|
|
3046
|
+
return styleInfo;
|
|
3047
|
+
};
|
|
3048
|
+
|
|
2961
3049
|
/**
|
|
2962
3050
|
* paragraph level style
|
|
2963
3051
|
*
|
|
@@ -2994,9 +3082,9 @@
|
|
|
2994
3082
|
}
|
|
2995
3083
|
|
|
2996
3084
|
var pred = dom.makePredByNodeName(nodeName);
|
|
2997
|
-
var nodes =
|
|
3085
|
+
var nodes = rng.nodes(dom.isText, {
|
|
2998
3086
|
fullyContains: true
|
|
2999
|
-
})
|
|
3087
|
+
}).map(function (text) {
|
|
3000
3088
|
return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);
|
|
3001
3089
|
});
|
|
3002
3090
|
|
|
@@ -3009,7 +3097,7 @@
|
|
|
3009
3097
|
});
|
|
3010
3098
|
}
|
|
3011
3099
|
|
|
3012
|
-
return
|
|
3100
|
+
return nodes.map(function (node) {
|
|
3013
3101
|
var siblings = dom.withClosestSiblings(node, pred);
|
|
3014
3102
|
var head = list.head(siblings);
|
|
3015
3103
|
var tails = list.tail(siblings);
|
|
@@ -3028,15 +3116,11 @@
|
|
|
3028
3116
|
* get current style on cursor
|
|
3029
3117
|
*
|
|
3030
3118
|
* @param {WrappedRange} rng
|
|
3031
|
-
* @param {Node} target - target element on event
|
|
3032
3119
|
* @return {Object} - object contains style properties.
|
|
3033
3120
|
*/
|
|
3034
|
-
this.current = function (rng
|
|
3121
|
+
this.current = function (rng) {
|
|
3035
3122
|
var $cont = $(dom.isText(rng.sc) ? rng.sc.parentNode : rng.sc);
|
|
3036
|
-
var
|
|
3037
|
-
var styleInfo = jQueryCSS($cont, properties) || {};
|
|
3038
|
-
|
|
3039
|
-
styleInfo['font-size'] = parseInt(styleInfo['font-size'], 10);
|
|
3123
|
+
var styleInfo = this.fromNode($cont);
|
|
3040
3124
|
|
|
3041
3125
|
// document.queryCommandState for toggle state
|
|
3042
3126
|
styleInfo['font-bold'] = document.queryCommandState('bold') ? 'bold' : 'normal';
|
|
@@ -3063,7 +3147,6 @@
|
|
|
3063
3147
|
styleInfo['line-height'] = lineHeight.toFixed(1);
|
|
3064
3148
|
}
|
|
3065
3149
|
|
|
3066
|
-
styleInfo.image = dom.isImg(target) && target;
|
|
3067
3150
|
styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);
|
|
3068
3151
|
styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);
|
|
3069
3152
|
styleInfo.range = rng;
|
|
@@ -3221,7 +3304,7 @@
|
|
|
3221
3304
|
var listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last);
|
|
3222
3305
|
|
|
3223
3306
|
// P to LI
|
|
3224
|
-
paras =
|
|
3307
|
+
paras = paras.map(function (para) {
|
|
3225
3308
|
return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;
|
|
3226
3309
|
});
|
|
3227
3310
|
|
|
@@ -3271,7 +3354,7 @@
|
|
|
3271
3354
|
|
|
3272
3355
|
// LI to P
|
|
3273
3356
|
if (isEscapseToBody || !dom.isList(headList.parentNode)) {
|
|
3274
|
-
paras =
|
|
3357
|
+
paras = paras.map(function (para) {
|
|
3275
3358
|
return dom.replace(para, 'P');
|
|
3276
3359
|
});
|
|
3277
3360
|
}
|
|
@@ -3515,17 +3598,32 @@
|
|
|
3515
3598
|
$editable[0].appendChild(child[index]);
|
|
3516
3599
|
}
|
|
3517
3600
|
};
|
|
3601
|
+
|
|
3518
3602
|
/**
|
|
3519
3603
|
* @method currentStyle
|
|
3520
3604
|
*
|
|
3521
3605
|
* current style
|
|
3522
3606
|
*
|
|
3523
3607
|
* @param {Node} target
|
|
3524
|
-
* @return {Boolean}
|
|
3608
|
+
* @return {Object|Boolean} unfocus
|
|
3525
3609
|
*/
|
|
3526
3610
|
this.currentStyle = function (target) {
|
|
3527
|
-
var rng = range.create()
|
|
3528
|
-
|
|
3611
|
+
var rng = range.create();
|
|
3612
|
+
var styleInfo = rng && rng.isOnEditable() ? style.current(rng.normalize()) : {};
|
|
3613
|
+
if (dom.isImg(target)) {
|
|
3614
|
+
styleInfo.image = target;
|
|
3615
|
+
}
|
|
3616
|
+
return styleInfo;
|
|
3617
|
+
};
|
|
3618
|
+
|
|
3619
|
+
/**
|
|
3620
|
+
* style from node
|
|
3621
|
+
*
|
|
3622
|
+
* @param {jQuery} $node
|
|
3623
|
+
* @return {Object}
|
|
3624
|
+
*/
|
|
3625
|
+
this.styleFromNode = function ($node) {
|
|
3626
|
+
return style.fromNode($node);
|
|
3529
3627
|
};
|
|
3530
3628
|
|
|
3531
3629
|
var triggerOnBeforeChange = function ($editable) {
|
|
@@ -3698,7 +3796,7 @@
|
|
|
3698
3796
|
var commands = ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',
|
|
3699
3797
|
'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',
|
|
3700
3798
|
'formatBlock', 'removeFormat',
|
|
3701
|
-
'backColor', 'foreColor', '
|
|
3799
|
+
'backColor', 'foreColor', 'fontName'];
|
|
3702
3800
|
|
|
3703
3801
|
for (var idx = 0, len = commands.length; idx < len; idx ++) {
|
|
3704
3802
|
this[commands[idx]] = (function (sCmd) {
|
|
@@ -3920,6 +4018,22 @@
|
|
|
3920
4018
|
}
|
|
3921
4019
|
};
|
|
3922
4020
|
|
|
4021
|
+
/**
|
|
4022
|
+
* insert horizontal rule
|
|
4023
|
+
* @param {jQuery} $editable
|
|
4024
|
+
*/
|
|
4025
|
+
this.insertHorizontalRule = function ($editable) {
|
|
4026
|
+
beforeCommand($editable);
|
|
4027
|
+
|
|
4028
|
+
var rng = range.create();
|
|
4029
|
+
var hrNode = rng.insertNode($('<HR/>')[0]);
|
|
4030
|
+
if (hrNode.nextSibling) {
|
|
4031
|
+
range.create(hrNode.nextSibling, 0).normalize().select();
|
|
4032
|
+
}
|
|
4033
|
+
|
|
4034
|
+
afterCommand($editable);
|
|
4035
|
+
};
|
|
4036
|
+
|
|
3923
4037
|
/**
|
|
3924
4038
|
* remove bogus node and character
|
|
3925
4039
|
*/
|
|
@@ -3986,7 +4100,7 @@
|
|
|
3986
4100
|
this.createLink = function ($editable, linkInfo, options) {
|
|
3987
4101
|
var linkUrl = linkInfo.url;
|
|
3988
4102
|
var linkText = linkInfo.text;
|
|
3989
|
-
var isNewWindow = linkInfo.
|
|
4103
|
+
var isNewWindow = linkInfo.isNewWindow;
|
|
3990
4104
|
var rng = linkInfo.range || this.createRange($editable);
|
|
3991
4105
|
var isTextChanged = rng.toString() !== linkText;
|
|
3992
4106
|
|
|
@@ -4104,6 +4218,13 @@
|
|
|
4104
4218
|
*/
|
|
4105
4219
|
this.floatMe = function ($editable, value, $target) {
|
|
4106
4220
|
beforeCommand($editable);
|
|
4221
|
+
// bootstrap
|
|
4222
|
+
$target.removeClass('pull-left pull-right');
|
|
4223
|
+
if (value && value !== 'none') {
|
|
4224
|
+
$target.addClass('pull-' + value);
|
|
4225
|
+
}
|
|
4226
|
+
|
|
4227
|
+
// fallback for non-bootstrap
|
|
4107
4228
|
$target.css('float', value);
|
|
4108
4229
|
afterCommand($editable);
|
|
4109
4230
|
};
|
|
@@ -4522,15 +4643,17 @@
|
|
|
4522
4643
|
*
|
|
4523
4644
|
* @private
|
|
4524
4645
|
* @param {Node} placeholder
|
|
4525
|
-
* @param {
|
|
4526
|
-
* @
|
|
4527
|
-
* @return {
|
|
4528
|
-
* @return {Number} return.top
|
|
4646
|
+
* @param {Object} options
|
|
4647
|
+
* @param {Boolean} options.isAirMode
|
|
4648
|
+
* @return {Position}
|
|
4529
4649
|
*/
|
|
4530
|
-
var posFromPlaceholder = function (placeholder,
|
|
4650
|
+
var posFromPlaceholder = function (placeholder, options) {
|
|
4651
|
+
var isAirMode = options && options.isAirMode;
|
|
4652
|
+
var isLeftTop = options && options.isLeftTop;
|
|
4653
|
+
|
|
4531
4654
|
var $placeholder = $(placeholder);
|
|
4532
4655
|
var pos = isAirMode ? $placeholder.offset() : $placeholder.position();
|
|
4533
|
-
var height = $placeholder.outerHeight(true); // include margin
|
|
4656
|
+
var height = isLeftTop ? 0 : $placeholder.outerHeight(true); // include margin
|
|
4534
4657
|
|
|
4535
4658
|
// popover below placeholder.
|
|
4536
4659
|
return {
|
|
@@ -4576,20 +4699,25 @@
|
|
|
4576
4699
|
} else {
|
|
4577
4700
|
$anchor.attr('target', '_blank');
|
|
4578
4701
|
}
|
|
4579
|
-
showPopover($linkPopover, posFromPlaceholder(styleInfo.anchor,
|
|
4702
|
+
showPopover($linkPopover, posFromPlaceholder(styleInfo.anchor, {
|
|
4703
|
+
isAirMode: isAirMode
|
|
4704
|
+
}));
|
|
4580
4705
|
} else {
|
|
4581
4706
|
$linkPopover.hide();
|
|
4582
4707
|
}
|
|
4583
4708
|
|
|
4584
4709
|
var $imagePopover = $popover.find('.note-image-popover');
|
|
4585
4710
|
if (styleInfo.image) {
|
|
4586
|
-
showPopover($imagePopover, posFromPlaceholder(styleInfo.image,
|
|
4711
|
+
showPopover($imagePopover, posFromPlaceholder(styleInfo.image, {
|
|
4712
|
+
isAirMode: isAirMode,
|
|
4713
|
+
isLeftTop: true
|
|
4714
|
+
}));
|
|
4587
4715
|
} else {
|
|
4588
4716
|
$imagePopover.hide();
|
|
4589
4717
|
}
|
|
4590
4718
|
|
|
4591
4719
|
var $airPopover = $popover.find('.note-air-popover');
|
|
4592
|
-
if (isAirMode && !styleInfo.range.isCollapsed()) {
|
|
4720
|
+
if (isAirMode && styleInfo.range && !styleInfo.range.isCollapsed()) {
|
|
4593
4721
|
var rect = list.last(styleInfo.range.getClientRects());
|
|
4594
4722
|
if (rect) {
|
|
4595
4723
|
var bnd = func.rect2bnd(rect);
|
|
@@ -4990,106 +5118,84 @@
|
|
|
4990
5118
|
};
|
|
4991
5119
|
|
|
4992
5120
|
var Clipboard = function (handler) {
|
|
4993
|
-
|
|
4994
5121
|
var $paste;
|
|
4995
5122
|
|
|
4996
5123
|
this.attach = function (layoutInfo) {
|
|
4997
|
-
|
|
4998
|
-
|
|
5124
|
+
// [workaround] getting image from clipboard
|
|
5125
|
+
// - IE11 and Firefox: CTRL+v hook
|
|
5126
|
+
// - Webkit: event.clipboardData
|
|
5127
|
+
if ((agent.isMSIE && agent.browserVersion > 10) || agent.isFF) {
|
|
4999
5128
|
$paste = $('<div />').attr('contenteditable', true).css({
|
|
5000
5129
|
position : 'absolute',
|
|
5001
5130
|
left : -100000,
|
|
5002
5131
|
opacity : 0
|
|
5003
5132
|
});
|
|
5004
|
-
layoutInfo.editable().after($paste);
|
|
5005
|
-
$paste.on('paste', hPasteClipboardImage);
|
|
5006
5133
|
|
|
5007
5134
|
layoutInfo.editable().on('keydown', function (e) {
|
|
5008
|
-
if (e.ctrlKey && e.keyCode ===
|
|
5135
|
+
if (e.ctrlKey && e.keyCode === key.code.V) {
|
|
5009
5136
|
handler.invoke('saveRange', layoutInfo.editable());
|
|
5010
|
-
|
|
5011
|
-
|
|
5012
|
-
|
|
5137
|
+
$paste.focus();
|
|
5138
|
+
|
|
5139
|
+
setTimeout(function () {
|
|
5140
|
+
pasteByHook(layoutInfo);
|
|
5141
|
+
}, 0);
|
|
5013
5142
|
}
|
|
5014
5143
|
});
|
|
5015
|
-
}
|
|
5016
5144
|
|
|
5017
|
-
|
|
5145
|
+
layoutInfo.editable().before($paste);
|
|
5146
|
+
} else {
|
|
5147
|
+
layoutInfo.editable().on('paste', pasteByEvent);
|
|
5148
|
+
}
|
|
5018
5149
|
};
|
|
5019
5150
|
|
|
5020
|
-
var
|
|
5021
|
-
var
|
|
5151
|
+
var pasteByHook = function (layoutInfo) {
|
|
5152
|
+
var $editable = layoutInfo.editable();
|
|
5153
|
+
var node = $paste[0].firstChild;
|
|
5154
|
+
|
|
5155
|
+
if (dom.isImg(node)) {
|
|
5156
|
+
var dataURI = node.src;
|
|
5157
|
+
var decodedData = atob(dataURI.split(',')[1]);
|
|
5158
|
+
var array = new Uint8Array(decodedData.length);
|
|
5159
|
+
for (var i = 0; i < decodedData.length; i++) {
|
|
5160
|
+
array[i] = decodedData.charCodeAt(i);
|
|
5161
|
+
}
|
|
5162
|
+
|
|
5163
|
+
var blob = new Blob([array], { type : 'image/png' });
|
|
5164
|
+
blob.name = 'clipboard.png';
|
|
5165
|
+
|
|
5166
|
+
handler.invoke('restoreRange', $editable);
|
|
5167
|
+
handler.invoke('focus', $editable);
|
|
5168
|
+
handler.insertImages(layoutInfo, [blob]);
|
|
5169
|
+
} else {
|
|
5170
|
+
var pasteContent = $('<div />').html($paste.html()).html();
|
|
5171
|
+
handler.invoke('restoreRange', $editable);
|
|
5172
|
+
handler.invoke('focus', $editable);
|
|
5173
|
+
|
|
5174
|
+
if (pasteContent) {
|
|
5175
|
+
handler.invoke('pasteHTML', $editable, pasteContent);
|
|
5176
|
+
}
|
|
5177
|
+
}
|
|
5022
5178
|
|
|
5023
|
-
handler.invoke('restoreRange', $editable);
|
|
5024
|
-
handler.invoke('focus', $editable);
|
|
5025
|
-
handler.invoke('pasteHTML', $editable, pasteContent.html());
|
|
5026
5179
|
$paste.empty();
|
|
5027
5180
|
};
|
|
5028
5181
|
|
|
5029
5182
|
/**
|
|
5030
|
-
* paste clipboard
|
|
5183
|
+
* paste by clipboard event
|
|
5031
5184
|
*
|
|
5032
5185
|
* @param {Event} event
|
|
5033
5186
|
*/
|
|
5034
|
-
var
|
|
5035
|
-
|
|
5187
|
+
var pasteByEvent = function (event) {
|
|
5036
5188
|
var clipboardData = event.originalEvent.clipboardData;
|
|
5037
5189
|
var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
|
|
5038
5190
|
var $editable = layoutInfo.editable();
|
|
5039
5191
|
|
|
5040
|
-
if (
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
if (!callbacks.onImageUpload) {
|
|
5045
|
-
hPasteContent(handler, $paste, $editable);
|
|
5046
|
-
return;
|
|
5192
|
+
if (clipboardData && clipboardData.items && clipboardData.items.length) {
|
|
5193
|
+
var item = list.head(clipboardData.items);
|
|
5194
|
+
if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
|
|
5195
|
+
handler.insertImages(layoutInfo, [item.getAsFile()]);
|
|
5047
5196
|
}
|
|
5048
|
-
|
|
5049
|
-
setTimeout(function () {
|
|
5050
|
-
if (!$paste) {
|
|
5051
|
-
return;
|
|
5052
|
-
}
|
|
5053
|
-
|
|
5054
|
-
var imgNode = $paste[0].firstChild;
|
|
5055
|
-
if (!imgNode) {
|
|
5056
|
-
hPasteContent(handler, $paste, $editable);
|
|
5057
|
-
return;
|
|
5058
|
-
}
|
|
5059
|
-
|
|
5060
|
-
if (!dom.isImg(imgNode)) {
|
|
5061
|
-
hPasteContent(handler, $paste, $editable);
|
|
5062
|
-
} else {
|
|
5063
|
-
handler.invoke('restoreRange', $editable);
|
|
5064
|
-
var datauri = imgNode.src;
|
|
5065
|
-
|
|
5066
|
-
var data = atob(datauri.split(',')[1]);
|
|
5067
|
-
var array = new Uint8Array(data.length);
|
|
5068
|
-
for (var i = 0; i < data.length; i++) {
|
|
5069
|
-
array[i] = data.charCodeAt(i);
|
|
5070
|
-
}
|
|
5071
|
-
|
|
5072
|
-
var blob = new Blob([array], { type : 'image/png' });
|
|
5073
|
-
blob.name = 'clipboard.png';
|
|
5074
|
-
handler.invoke('focus', $editable);
|
|
5075
|
-
handler.insertImages(layoutInfo, [blob]);
|
|
5076
|
-
|
|
5077
|
-
$paste.empty();
|
|
5078
|
-
}
|
|
5079
|
-
|
|
5080
|
-
}, 0);
|
|
5081
|
-
|
|
5082
|
-
return;
|
|
5083
|
-
}
|
|
5084
|
-
|
|
5085
|
-
var item = list.head(clipboardData.items);
|
|
5086
|
-
var isClipboardImage = item.kind === 'file' && item.type.indexOf('image/') !== -1;
|
|
5087
|
-
|
|
5088
|
-
if (isClipboardImage) {
|
|
5089
|
-
handler.insertImages(layoutInfo, [item.getAsFile()]);
|
|
5197
|
+
handler.invoke('editor.afterCommand', $editable);
|
|
5090
5198
|
}
|
|
5091
|
-
|
|
5092
|
-
handler.invoke('editor.afterCommand', $editable);
|
|
5093
5199
|
};
|
|
5094
5200
|
};
|
|
5095
5201
|
|
|
@@ -5167,7 +5273,7 @@
|
|
|
5167
5273
|
bindEnterKey($linkUrl, $linkBtn);
|
|
5168
5274
|
bindEnterKey($linkText, $linkBtn);
|
|
5169
5275
|
|
|
5170
|
-
$openInNewWindow.prop('checked', linkInfo.
|
|
5276
|
+
$openInNewWindow.prop('checked', linkInfo.isNewWindow);
|
|
5171
5277
|
|
|
5172
5278
|
$linkBtn.one('click', function (event) {
|
|
5173
5279
|
event.preventDefault();
|
|
@@ -5176,7 +5282,7 @@
|
|
|
5176
5282
|
range: linkInfo.range,
|
|
5177
5283
|
url: $linkUrl.val(),
|
|
5178
5284
|
text: $linkText.val(),
|
|
5179
|
-
|
|
5285
|
+
isNewWindow: $openInNewWindow.is(':checked')
|
|
5180
5286
|
});
|
|
5181
5287
|
$linkDialog.modal('hide');
|
|
5182
5288
|
});
|
|
@@ -5362,6 +5468,8 @@
|
|
|
5362
5468
|
* - TODO: new instance per a editor
|
|
5363
5469
|
*/
|
|
5364
5470
|
var EventHandler = function () {
|
|
5471
|
+
var self = this;
|
|
5472
|
+
|
|
5365
5473
|
/**
|
|
5366
5474
|
* Modules
|
|
5367
5475
|
*/
|
|
@@ -5513,20 +5621,31 @@
|
|
|
5513
5621
|
hToolbarAndPopoverUpdate(event);
|
|
5514
5622
|
};
|
|
5515
5623
|
|
|
5624
|
+
/**
|
|
5625
|
+
* update sytle info
|
|
5626
|
+
* @param {Object} styleInfo
|
|
5627
|
+
* @param {Object} layoutInfo
|
|
5628
|
+
*/
|
|
5629
|
+
this.updateStyleInfo = function (styleInfo, layoutInfo) {
|
|
5630
|
+
if (!styleInfo) {
|
|
5631
|
+
return;
|
|
5632
|
+
}
|
|
5633
|
+
var isAirMode = layoutInfo.editor().data('options').airMode;
|
|
5634
|
+
if (!isAirMode) {
|
|
5635
|
+
modules.toolbar.update(layoutInfo.toolbar(), styleInfo);
|
|
5636
|
+
}
|
|
5637
|
+
|
|
5638
|
+
modules.popover.update(layoutInfo.popover(), styleInfo, isAirMode);
|
|
5639
|
+
modules.handle.update(layoutInfo.handle(), styleInfo, isAirMode);
|
|
5640
|
+
};
|
|
5641
|
+
|
|
5516
5642
|
var hToolbarAndPopoverUpdate = function (event) {
|
|
5643
|
+
var target = event.target;
|
|
5517
5644
|
// delay for range after mouseup
|
|
5518
5645
|
setTimeout(function () {
|
|
5519
|
-
var layoutInfo = dom.makeLayoutInfo(
|
|
5520
|
-
var styleInfo = modules.editor.currentStyle(
|
|
5521
|
-
|
|
5522
|
-
|
|
5523
|
-
var isAirMode = layoutInfo.editor().data('options').airMode;
|
|
5524
|
-
if (!isAirMode) {
|
|
5525
|
-
modules.toolbar.update(layoutInfo.toolbar(), styleInfo);
|
|
5526
|
-
}
|
|
5527
|
-
|
|
5528
|
-
modules.popover.update(layoutInfo.popover(), styleInfo, isAirMode);
|
|
5529
|
-
modules.handle.update(layoutInfo.handle(), styleInfo, isAirMode);
|
|
5646
|
+
var layoutInfo = dom.makeLayoutInfo(target);
|
|
5647
|
+
var styleInfo = modules.editor.currentStyle(target);
|
|
5648
|
+
self.updateStyleInfo(styleInfo, layoutInfo);
|
|
5530
5649
|
}, 0);
|
|
5531
5650
|
};
|
|
5532
5651
|
|
|
@@ -5548,47 +5667,49 @@
|
|
|
5548
5667
|
var hToolbarAndPopoverClick = function (event) {
|
|
5549
5668
|
var $btn = $(event.target).closest('[data-event]');
|
|
5550
5669
|
|
|
5551
|
-
if (
|
|
5552
|
-
|
|
5553
|
-
|
|
5554
|
-
hide = $btn.attr('data-hide');
|
|
5670
|
+
if (!$btn.length) {
|
|
5671
|
+
return;
|
|
5672
|
+
}
|
|
5555
5673
|
|
|
5556
|
-
|
|
5674
|
+
var eventName = $btn.attr('data-event'),
|
|
5675
|
+
value = $btn.attr('data-value'),
|
|
5676
|
+
hide = $btn.attr('data-hide');
|
|
5557
5677
|
|
|
5558
|
-
|
|
5559
|
-
var $target;
|
|
5560
|
-
if ($.inArray(eventName, ['resize', 'floatMe', 'removeMedia', 'imageShape']) !== -1) {
|
|
5561
|
-
var $selection = layoutInfo.handle().find('.note-control-selection');
|
|
5562
|
-
$target = $($selection.data('target'));
|
|
5563
|
-
}
|
|
5678
|
+
var layoutInfo = dom.makeLayoutInfo(event.target);
|
|
5564
5679
|
|
|
5565
|
-
|
|
5566
|
-
|
|
5567
|
-
|
|
5568
|
-
|
|
5569
|
-
|
|
5680
|
+
// before command: detect control selection element($target)
|
|
5681
|
+
var $target;
|
|
5682
|
+
if ($.inArray(eventName, ['resize', 'floatMe', 'removeMedia', 'imageShape']) !== -1) {
|
|
5683
|
+
var $selection = layoutInfo.handle().find('.note-control-selection');
|
|
5684
|
+
$target = $($selection.data('target'));
|
|
5685
|
+
}
|
|
5570
5686
|
|
|
5571
|
-
|
|
5572
|
-
|
|
5573
|
-
|
|
5574
|
-
|
|
5575
|
-
|
|
5576
|
-
modules.editor[eventName]($editable, value, $target);
|
|
5577
|
-
event.preventDefault();
|
|
5578
|
-
} else if (commands[eventName]) {
|
|
5579
|
-
commands[eventName].call(this, layoutInfo);
|
|
5580
|
-
event.preventDefault();
|
|
5581
|
-
}
|
|
5687
|
+
// If requested, hide the popover when the button is clicked.
|
|
5688
|
+
// Useful for things like showHelpDialog.
|
|
5689
|
+
if (hide) {
|
|
5690
|
+
$btn.parents('.popover').hide();
|
|
5691
|
+
}
|
|
5582
5692
|
|
|
5583
|
-
|
|
5584
|
-
|
|
5585
|
-
|
|
5586
|
-
|
|
5587
|
-
|
|
5588
|
-
|
|
5693
|
+
if ($.isFunction($.summernote.pluginEvents[eventName])) {
|
|
5694
|
+
$.summernote.pluginEvents[eventName](event, modules.editor, layoutInfo, value);
|
|
5695
|
+
} else if (modules.editor[eventName]) { // on command
|
|
5696
|
+
var $editable = layoutInfo.editable();
|
|
5697
|
+
$editable.focus();
|
|
5698
|
+
modules.editor[eventName]($editable, value, $target);
|
|
5699
|
+
event.preventDefault();
|
|
5700
|
+
} else if (commands[eventName]) {
|
|
5701
|
+
commands[eventName].call(this, layoutInfo);
|
|
5702
|
+
event.preventDefault();
|
|
5703
|
+
}
|
|
5589
5704
|
|
|
5590
|
-
|
|
5705
|
+
// after command
|
|
5706
|
+
if ($.inArray(eventName, ['backColor', 'foreColor']) !== -1) {
|
|
5707
|
+
var options = layoutInfo.editor().data('options', options);
|
|
5708
|
+
var module = options.airMode ? modules.popover : modules.toolbar;
|
|
5709
|
+
module.updateRecentColor(list.head($btn), eventName, value);
|
|
5591
5710
|
}
|
|
5711
|
+
|
|
5712
|
+
hToolbarAndPopoverUpdate(event);
|
|
5592
5713
|
};
|
|
5593
5714
|
|
|
5594
5715
|
var PX_PER_EM = 18;
|
|
@@ -5769,12 +5890,8 @@
|
|
|
5769
5890
|
onToolbarClick: options.onToolbarClick
|
|
5770
5891
|
});
|
|
5771
5892
|
|
|
5772
|
-
|
|
5773
|
-
|
|
5774
|
-
layoutInfo.holder().closest('form').submit(function () {
|
|
5775
|
-
layoutInfo.holder().val(layoutInfo.holder().code());
|
|
5776
|
-
});
|
|
5777
|
-
}
|
|
5893
|
+
var styleInfo = modules.editor.styleFromNode(layoutInfo.editable());
|
|
5894
|
+
this.updateStyleInfo(styleInfo, layoutInfo);
|
|
5778
5895
|
};
|
|
5779
5896
|
|
|
5780
5897
|
/**
|
|
@@ -5804,8 +5921,8 @@
|
|
|
5804
5921
|
|
|
5805
5922
|
$editable.on('paste', bindCustomEvent($holder, callbacks, 'paste'));
|
|
5806
5923
|
|
|
5807
|
-
// [workaround]
|
|
5808
|
-
// -
|
|
5924
|
+
// [workaround] IE doesn't have input events for contentEditable
|
|
5925
|
+
// - see: https://goo.gl/4bfIvA
|
|
5809
5926
|
var changeEventName = agent.isMSIE ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';
|
|
5810
5927
|
$editable.on(changeEventName, function () {
|
|
5811
5928
|
bindCustomEvent($holder, callbacks, 'change')($editable.html(), $editable);
|
|
@@ -5819,10 +5936,18 @@
|
|
|
5819
5936
|
// Textarea: auto filling the code before form submit.
|
|
5820
5937
|
if (dom.isTextarea(list.head($holder))) {
|
|
5821
5938
|
$holder.closest('form').submit(function (e) {
|
|
5939
|
+
layoutInfo.holder().val(layoutInfo.holder().code());
|
|
5822
5940
|
bindCustomEvent($holder, callbacks, 'submit').call(this, e, $holder.code());
|
|
5823
5941
|
});
|
|
5824
5942
|
}
|
|
5825
5943
|
|
|
5944
|
+
// textarea auto sync
|
|
5945
|
+
if (dom.isTextarea(list.head($holder)) && options.textareaAutoSync) {
|
|
5946
|
+
$holder.on('summernote.change', function () {
|
|
5947
|
+
layoutInfo.holder().val(layoutInfo.holder().code());
|
|
5948
|
+
});
|
|
5949
|
+
}
|
|
5950
|
+
|
|
5826
5951
|
// fire init event
|
|
5827
5952
|
bindCustomEvent($holder, callbacks, 'init')(layoutInfo);
|
|
5828
5953
|
|
|
@@ -5882,7 +6007,7 @@
|
|
|
5882
6007
|
return (dropdown ? '<div class="btn-group' +
|
|
5883
6008
|
(className ? ' ' + className : '') + '">' : '') +
|
|
5884
6009
|
'<button type="button"' +
|
|
5885
|
-
' class="btn btn-default btn-sm
|
|
6010
|
+
' class="btn btn-default btn-sm' +
|
|
5886
6011
|
((!dropdown && className) ? ' ' + className : '') +
|
|
5887
6012
|
(dropdown ? ' dropdown-toggle' : '') +
|
|
5888
6013
|
'"' +
|
|
@@ -6024,7 +6149,7 @@
|
|
|
6024
6149
|
fontname: function (lang, options) {
|
|
6025
6150
|
var realFontList = [];
|
|
6026
6151
|
var items = options.fontNames.reduce(function (memo, v) {
|
|
6027
|
-
if (!agent.isFontInstalled(v) && options.fontNamesIgnoreCheck
|
|
6152
|
+
if (!agent.isFontInstalled(v) && !list.contains(options.fontNamesIgnoreCheck, v)) {
|
|
6028
6153
|
return memo;
|
|
6029
6154
|
}
|
|
6030
6155
|
realFontList.push(v);
|
|
@@ -6317,8 +6442,8 @@
|
|
|
6317
6442
|
value: 'none'
|
|
6318
6443
|
});
|
|
6319
6444
|
|
|
6320
|
-
var content = '<div class="btn-group">' + fullButton + halfButton + quarterButton + '</div>' +
|
|
6321
|
-
'<div class="btn-group">' + leftButton + rightButton + justifyButton + '</div>' +
|
|
6445
|
+
var content = (options.disableResizeImage ? '' : '<div class="btn-group">' + fullButton + halfButton + quarterButton + '</div>') +
|
|
6446
|
+
'<div class="btn-group">' + leftButton + rightButton + justifyButton + '</div><br>' +
|
|
6322
6447
|
'<div class="btn-group">' + roundedButton + circleButton + thumbnailButton + noneButton + '</div>' +
|
|
6323
6448
|
'<div class="btn-group">' + removeButton + '</div>';
|
|
6324
6449
|
return tplPopover('note-image-popover', content);
|
|
@@ -6355,15 +6480,17 @@
|
|
|
6355
6480
|
return $notePopover;
|
|
6356
6481
|
};
|
|
6357
6482
|
|
|
6358
|
-
var tplHandles = function () {
|
|
6483
|
+
var tplHandles = function (options) {
|
|
6359
6484
|
return '<div class="note-handle">' +
|
|
6360
6485
|
'<div class="note-control-selection">' +
|
|
6361
6486
|
'<div class="note-control-selection-bg"></div>' +
|
|
6362
6487
|
'<div class="note-control-holder note-control-nw"></div>' +
|
|
6363
6488
|
'<div class="note-control-holder note-control-ne"></div>' +
|
|
6364
6489
|
'<div class="note-control-holder note-control-sw"></div>' +
|
|
6365
|
-
'<div class="
|
|
6366
|
-
'
|
|
6490
|
+
'<div class="' +
|
|
6491
|
+
(options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing') +
|
|
6492
|
+
' note-control-se"></div>' +
|
|
6493
|
+
(options.disableResizeImage ? '' : '<div class="note-control-selection-info"></div>') +
|
|
6367
6494
|
'</div>' +
|
|
6368
6495
|
'</div>';
|
|
6369
6496
|
};
|
|
@@ -6485,27 +6612,27 @@
|
|
|
6485
6612
|
imageLimitation = '<small>' + lang.image.maximumFileSize + ' : ' + readableSize + '</small>';
|
|
6486
6613
|
}
|
|
6487
6614
|
|
|
6488
|
-
var body = '<div class="form-group row
|
|
6615
|
+
var body = '<div class="form-group row note-group-select-from-files">' +
|
|
6489
6616
|
'<label>' + lang.image.selectFromFiles + '</label>' +
|
|
6490
|
-
'<input class="note-image-input" type="file" name="files" accept="image/*" multiple="multiple" />' +
|
|
6617
|
+
'<input class="note-image-input form-control" type="file" name="files" accept="image/*" multiple="multiple" />' +
|
|
6491
6618
|
imageLimitation +
|
|
6492
6619
|
'</div>' +
|
|
6493
|
-
'<div class="form-group row
|
|
6620
|
+
'<div class="form-group row">' +
|
|
6494
6621
|
'<label>' + lang.image.url + '</label>' +
|
|
6495
|
-
'<input class="note-image-url form-control
|
|
6622
|
+
'<input class="note-image-url form-control col-md-12" type="text" />' +
|
|
6496
6623
|
'</div>';
|
|
6497
6624
|
var footer = '<button href="#" class="btn btn-primary note-image-btn disabled" disabled>' + lang.image.insert + '</button>';
|
|
6498
6625
|
return tplDialog('note-image-dialog', lang.image.insert, body, footer);
|
|
6499
6626
|
},
|
|
6500
6627
|
|
|
6501
6628
|
link: function (lang, options) {
|
|
6502
|
-
var body = '<div class="form-group row
|
|
6629
|
+
var body = '<div class="form-group row">' +
|
|
6503
6630
|
'<label>' + lang.link.textToDisplay + '</label>' +
|
|
6504
|
-
'<input class="note-link-text form-control
|
|
6631
|
+
'<input class="note-link-text form-control col-md-12" type="text" />' +
|
|
6505
6632
|
'</div>' +
|
|
6506
|
-
'<div class="form-group row
|
|
6633
|
+
'<div class="form-group row">' +
|
|
6507
6634
|
'<label>' + lang.link.url + '</label>' +
|
|
6508
|
-
'<input class="note-link-url form-control
|
|
6635
|
+
'<input class="note-link-url form-control col-md-12" type="text" value="http://" />' +
|
|
6509
6636
|
'</div>' +
|
|
6510
6637
|
(!options.disableLinkTarget ?
|
|
6511
6638
|
'<div class="checkbox">' +
|
|
@@ -6523,7 +6650,7 @@
|
|
|
6523
6650
|
'<div class="title">' + lang.shortcut.shortcuts + '</div>' +
|
|
6524
6651
|
(agent.isMac ? tplShortcutTable(lang, options) : replaceMacKeys(tplShortcutTable(lang, options))) +
|
|
6525
6652
|
'<p class="text-center">' +
|
|
6526
|
-
'<a href="//summernote.org/" target="_blank">Summernote 0.6.
|
|
6653
|
+
'<a href="//summernote.org/" target="_blank">Summernote 0.6.16</a> · ' +
|
|
6527
6654
|
'<a href="//github.com/summernote/summernote" target="_blank">Project</a> · ' +
|
|
6528
6655
|
'<a href="//github.com/summernote/summernote/issues" target="_blank">Issues</a>' +
|
|
6529
6656
|
'</p>';
|
|
@@ -6624,7 +6751,7 @@
|
|
|
6624
6751
|
var keyMap = options.keyMap[agent.isMac ? 'mac' : 'pc'];
|
|
6625
6752
|
var id = func.uniqueId();
|
|
6626
6753
|
|
|
6627
|
-
$holder.addClass('note-air-editor note-editable');
|
|
6754
|
+
$holder.addClass('note-air-editor note-editable panel-body');
|
|
6628
6755
|
$holder.attr({
|
|
6629
6756
|
'id': 'note-editor-' + id,
|
|
6630
6757
|
'contentEditable': true
|
|
@@ -6641,7 +6768,7 @@
|
|
|
6641
6768
|
createPalette($popover, options);
|
|
6642
6769
|
|
|
6643
6770
|
// create Handle
|
|
6644
|
-
var $handle = $(tplHandles());
|
|
6771
|
+
var $handle = $(tplHandles(options));
|
|
6645
6772
|
$handle.addClass('note-air-layout');
|
|
6646
6773
|
$handle.attr('id', 'note-handle-' + id);
|
|
6647
6774
|
$handle.appendTo(body);
|
|
@@ -6666,7 +6793,7 @@
|
|
|
6666
6793
|
var langInfo = options.langInfo;
|
|
6667
6794
|
|
|
6668
6795
|
//01. create Editor
|
|
6669
|
-
var $editor = $('<div class="note-editor"
|
|
6796
|
+
var $editor = $('<div class="note-editor panel panel-default" />');
|
|
6670
6797
|
if (options.width) {
|
|
6671
6798
|
$editor.width(options.width);
|
|
6672
6799
|
}
|
|
@@ -6676,10 +6803,12 @@
|
|
|
6676
6803
|
$('<div class="note-statusbar">' + (options.disableResizeEditor ? '' : tplStatusbar()) + '</div>').prependTo($editor);
|
|
6677
6804
|
}
|
|
6678
6805
|
|
|
6679
|
-
//03
|
|
6806
|
+
//03 editing area
|
|
6807
|
+
var $editingArea = $('<div class="note-editing-area" />');
|
|
6808
|
+
//03. create editable
|
|
6680
6809
|
var isContentEditable = !$holder.is(':disabled');
|
|
6681
|
-
var $editable = $('<div class="note-editable" contentEditable="' + isContentEditable + '"></div>')
|
|
6682
|
-
|
|
6810
|
+
var $editable = $('<div class="note-editable panel-body" contentEditable="' + isContentEditable + '"></div>').prependTo($editingArea);
|
|
6811
|
+
|
|
6683
6812
|
if (options.height) {
|
|
6684
6813
|
$editable.height(options.height);
|
|
6685
6814
|
}
|
|
@@ -6691,13 +6820,23 @@
|
|
|
6691
6820
|
$editable.attr('data-placeholder', placeholder);
|
|
6692
6821
|
}
|
|
6693
6822
|
|
|
6694
|
-
$editable.html(dom.html($holder));
|
|
6823
|
+
$editable.html(dom.html($holder) || dom.emptyPara);
|
|
6695
6824
|
|
|
6696
6825
|
//031. create codable
|
|
6697
|
-
$('<textarea class="note-codable"></textarea>').prependTo($
|
|
6826
|
+
$('<textarea class="note-codable"></textarea>').prependTo($editingArea);
|
|
6827
|
+
|
|
6828
|
+
//04. create Popover
|
|
6829
|
+
var $popover = $(tplPopovers(langInfo, options)).prependTo($editingArea);
|
|
6830
|
+
createPalette($popover, options);
|
|
6831
|
+
createTooltip($popover, keyMap);
|
|
6832
|
+
|
|
6833
|
+
//05. handle(control selection, ...)
|
|
6834
|
+
$(tplHandles(options)).prependTo($editingArea);
|
|
6835
|
+
|
|
6836
|
+
$editingArea.prependTo($editor);
|
|
6698
6837
|
|
|
6699
|
-
//
|
|
6700
|
-
var $toolbar = $('<div class="note-toolbar
|
|
6838
|
+
//06. create Toolbar
|
|
6839
|
+
var $toolbar = $('<div class="note-toolbar panel-heading" />');
|
|
6701
6840
|
for (var idx = 0, len = options.toolbar.length; idx < len; idx ++) {
|
|
6702
6841
|
var groupName = options.toolbar[idx][0];
|
|
6703
6842
|
var groupButtons = options.toolbar[idx][1];
|
|
@@ -6715,30 +6854,21 @@
|
|
|
6715
6854
|
$toolbar.append($group);
|
|
6716
6855
|
}
|
|
6717
6856
|
|
|
6718
|
-
$toolbar.prependTo($editor);
|
|
6719
6857
|
var keyMap = options.keyMap[agent.isMac ? 'mac' : 'pc'];
|
|
6720
6858
|
createPalette($toolbar, options);
|
|
6721
6859
|
createTooltip($toolbar, keyMap, 'bottom');
|
|
6860
|
+
$toolbar.prependTo($editor);
|
|
6722
6861
|
|
|
6723
|
-
//
|
|
6724
|
-
|
|
6725
|
-
createPalette($popover, options);
|
|
6726
|
-
createTooltip($popover, keyMap);
|
|
6727
|
-
|
|
6728
|
-
//06. handle(control selection, ...)
|
|
6729
|
-
$(tplHandles()).prependTo($editor);
|
|
6730
|
-
|
|
6731
|
-
var $dialogContainer = options.dialogsInBody ? document.body : $editor;
|
|
6862
|
+
//07. create Dropzone
|
|
6863
|
+
$('<div class="note-dropzone"><div class="note-dropzone-message"></div></div>').prependTo($editor);
|
|
6732
6864
|
|
|
6733
|
-
//
|
|
6865
|
+
//08. create Dialog
|
|
6866
|
+
var $dialogContainer = options.dialogsInBody ? $(document.body) : $editor;
|
|
6734
6867
|
var $dialog = $(tplDialogs(langInfo, options)).prependTo($dialogContainer);
|
|
6735
6868
|
$dialog.find('button.close, a.modal-close').click(function () {
|
|
6736
6869
|
$(this).closest('.modal').modal('hide');
|
|
6737
6870
|
});
|
|
6738
6871
|
|
|
6739
|
-
//08. create Dropzone
|
|
6740
|
-
$('<div class="note-dropzone"><div class="note-dropzone-message"></div></div>').prependTo($editor);
|
|
6741
|
-
|
|
6742
6872
|
//09. Editor/Holder switch
|
|
6743
6873
|
$editor.insertAfter($holder);
|
|
6744
6874
|
$holder.hide();
|
|
@@ -7066,7 +7196,6 @@
|
|
|
7066
7196
|
|
|
7067
7197
|
eventHandler.attach(layoutInfo, options);
|
|
7068
7198
|
eventHandler.attachCustomEvent(layoutInfo, options);
|
|
7069
|
-
|
|
7070
7199
|
}
|
|
7071
7200
|
});
|
|
7072
7201
|
|