summernote-rails 0.7.1.0 → 0.8.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6af09b790aa46b877504ffc2765c6c52b94cce1
4
- data.tar.gz: 43c5b0fc6f893db0e57cb0c3f5979fcfba0d5e90
3
+ metadata.gz: 772439bde305c4acec0a11d4158a627a6d118e27
4
+ data.tar.gz: e1d7d988777fa4e50cf0fc4f79b1cda386439b20
5
5
  SHA512:
6
- metadata.gz: d04c0dfaa5a93f02e71ec0ac141d2265766cf5c16dc0ce1e1b8367898691d984840d263f356afc1be6e4e6885c9a669a3ea378f871e86c2617c0fb7719655371
7
- data.tar.gz: 604adc7e7fb3960e70131cd012c816b2a533e156712501c9defa5e5afa9f60ffb63004af02eb119d4c88f7b07bd99b40ee24e20c40023f6067b3ce17431a0583
6
+ metadata.gz: 3045ceaec55b26ae5d259fe0d2b27aabfc169c41b095a27a2bd5de9f24abd1aac697f652df728df0baed43bddd2cdbdebe1d284c031eb5fa0a4d0a2416565469
7
+ data.tar.gz: fab4f494071689568e06ecc711d5c2c934c039d184e22c32642d3a77d77ff78015f15386732d164e5bd3a0fa6312a652330a27c36cc6c0725980f1e3364952d3
data/README.md CHANGED
@@ -14,7 +14,6 @@ Add the following gems to your application's Gemfile:
14
14
 
15
15
  ```ruby
16
16
  gem 'summernote-rails', 'current version number'
17
- gem 'font-awesome-rails' # required
18
17
  gem 'bootstrap-sass' # required
19
18
  ```
20
19
 
@@ -30,7 +29,6 @@ In app/assets/stylesheets/application.scss,
30
29
 
31
30
  ```css
32
31
  @import "bootstrap";
33
- @import "font-awesome";
34
32
  @import "summernote";
35
33
  ```
36
34
 
@@ -71,7 +69,7 @@ $('[data-provider="summernote"]').each(function(){
71
69
  })
72
70
  ```
73
71
 
74
- Or, if you want to code in coffeescript,
72
+ Or, if you want to code in coffeescript,
75
73
 
76
74
  ```coffeescript
77
75
  $ ->
@@ -89,7 +87,7 @@ Then, if you are using simple_form, you can use the `:summernote` input type. Th
89
87
  <% end %>
90
88
  ```
91
89
 
92
- Or, if you prefer haml-style,
90
+ Or, if you prefer haml-style,
93
91
 
94
92
  ```haml
95
93
  = simple_form_for(:example) do | f |
@@ -172,8 +170,8 @@ Also, you can move the above javascript code lines to app/assets/javascripts/sum
172
170
  ...
173
171
  [
174
172
  'insert'
175
- [
176
- 'hello'
173
+ [
174
+ 'hello'
177
175
  ]
178
176
  ]
179
177
  ...
@@ -1,5 +1,5 @@
1
1
  module SummernoteRails
2
2
  module Rails
3
- VERSION = "0.7.1.0"
3
+ VERSION = "0.8.1.0"
4
4
  end
5
5
  end
@@ -20,7 +20,8 @@
20
20
  floatLeft: 'Igazítás balra',
21
21
  floatRight: 'Igazítás jobbra',
22
22
  floatNone: 'Igazítás törlése',
23
- dragImageHere: 'Ide húzhatod a képet',
23
+ dragImageHere: 'Ide húzhat képet vagy szöveget',
24
+ dropImage: 'Engedje el a képet vagy szöveget',
24
25
  selectFromFiles: 'Fájlok kiválasztása',
25
26
  url: 'Kép URL címe',
26
27
  remove: 'Kép törlése'
@@ -95,6 +96,35 @@
95
96
  paragraphFormatting: 'Bekezdés formázása',
96
97
  documentStyle: 'Dokumentumstílus'
97
98
  },
99
+ help: {
100
+ 'insertParagraph': 'Új bekezdés',
101
+ 'undo': 'Visszavonás',
102
+ 'redo': 'Újra',
103
+ 'tab': 'Behúzás növelése',
104
+ 'untab': 'Behúzás csökkentése',
105
+ 'bold': 'Félkövérre állítás',
106
+ 'italic': 'Dőltre állítás',
107
+ 'underline': 'Aláhúzás',
108
+ 'strikethrough': 'Áthúzás',
109
+ 'removeFormat': 'Formázás törlése',
110
+ 'justifyLeft': 'Balra igazítás',
111
+ 'justifyCenter': 'Középre igazítás',
112
+ 'justifyRight': 'Jobbra igazítás',
113
+ 'justifyFull': 'Sorkizárt',
114
+ 'insertUnorderedList': 'Számozatlan lista be/ki',
115
+ 'insertOrderedList': 'Számozott lista be/ki',
116
+ 'outdent': 'Jelenlegi bekezdés behúzásának megszüntetése',
117
+ 'indent': 'Jelenlegi bekezdés behúzása',
118
+ 'formatPara': 'Blokk formázása bekezdésként (P tag)',
119
+ 'formatH1': 'Blokk formázása, mint Fejléc 1',
120
+ 'formatH2': 'Blokk formázása, mint Fejléc 2',
121
+ 'formatH3': 'Blokk formázása, mint Fejléc 3',
122
+ 'formatH4': 'Blokk formázása, mint Fejléc 4',
123
+ 'formatH5': 'Blokk formázása, mint Fejléc 5',
124
+ 'formatH6': 'Blokk formázása, mint Fejléc 6',
125
+ 'insertHorizontalRule': 'Vízszintes vonal beszúrása',
126
+ 'linkDialog.show': 'Link párbeszédablak megjelenítése'
127
+ },
98
128
  history: {
99
129
  undo: 'Visszavonás',
100
130
  redo: 'Újra'
@@ -4,10 +4,10 @@
4
4
  font: {
5
5
  bold: 'Tučné',
6
6
  italic: 'Kurzíva',
7
- underline: 'Podtržené',
7
+ underline: 'Podčiarknutie',
8
8
  clear: 'Odstrániť štýl písma',
9
9
  height: 'Výška riadku',
10
- strikethrough: 'Preškrtnuté',
10
+ strikethrough: 'Prečiarknuté',
11
11
  size: 'Veľkosť písma'
12
12
  },
13
13
  image: {
@@ -28,7 +28,7 @@
28
28
  videoLink: 'Odkaz videa',
29
29
  insert: 'Vložiť video',
30
30
  url: 'URL videa?',
31
- providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion nebo Youku)'
31
+ providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion alebo Youku)'
32
32
  },
33
33
  link: {
34
34
  link: 'Odkaz',
@@ -67,8 +67,8 @@
67
67
  codeview: 'HTML kód'
68
68
  },
69
69
  paragraph: {
70
- paragraph: 'Odstavec',
71
- outdent: 'Zvečiť odsadenie',
70
+ paragraph: 'Odsek',
71
+ outdent: 'Zväčšiť odsadenie',
72
72
  indent: 'Zmenšiť odsadenie',
73
73
  left: 'Zarovnať doľava',
74
74
  center: 'Zarovnať na stred',
@@ -80,7 +80,7 @@
80
80
  more: 'Dalšie farby',
81
81
  background: 'Farba pozadia',
82
82
  foreground: 'Farba písma',
83
- transparent: 'Priehľednosť',
83
+ transparent: 'Priehľadnosť',
84
84
  setTransparent: 'Nastaviť priehľadnosť',
85
85
  reset: 'Obnoviť',
86
86
  resetToDefault: 'Obnoviť prednastavené'
@@ -90,7 +90,7 @@
90
90
  close: 'Zavrieť',
91
91
  textFormatting: 'Formátovanie textu',
92
92
  action: 'Akcia',
93
- paragraphFormatting: 'Formátovánie odstavca',
93
+ paragraphFormatting: 'Formátovanie odseku',
94
94
  documentStyle: 'Štýl dokumentu'
95
95
  },
96
96
  history: {
@@ -241,7 +241,7 @@
241
241
  return;
242
242
  }
243
243
 
244
- deferred.resolve(decodeURIComponent($selectedNode.find('button').data('value')));
244
+ deferred.resolve(decodeURIComponent($selectedNode.find('button').attr('data-value')));
245
245
  $specialCharDialog.modal('hide');
246
246
  }
247
247
 
@@ -289,7 +289,7 @@
289
289
 
290
290
  $specialCharNode.on('click', function (event) {
291
291
  event.preventDefault();
292
- deferred.resolve(decodeURIComponent($(event.currentTarget).find('button').data('value')));
292
+ deferred.resolve(decodeURIComponent($(event.currentTarget).find('button').attr('data-value')));
293
293
  ui.hideDialog(self.$dialog);
294
294
  });
295
295
 
@@ -1,12 +1,12 @@
1
1
  /**
2
- * Super simple wysiwyg editor v0.7.1
2
+ * Super simple wysiwyg editor v0.8.1
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-12-31T12:09Z
9
+ * Date: 2016-02-15T18:35Z
10
10
  */
11
11
  (function (factory) {
12
12
  /* global define */
@@ -72,6 +72,12 @@
72
72
  return a;
73
73
  };
74
74
 
75
+ var invoke = function (obj, method) {
76
+ return function () {
77
+ return obj[method].apply(obj, arguments);
78
+ };
79
+ };
80
+
75
81
  var idCounter = 0;
76
82
 
77
83
  /**
@@ -87,7 +93,7 @@
87
93
  /**
88
94
  * returns bnd (bounds) from rect
89
95
  *
90
- * - IE Compatability Issue: http://goo.gl/sRLOAo
96
+ * - IE Compatibility Issue: http://goo.gl/sRLOAo
91
97
  * - Scroll Issue: http://goo.gl/sNjUc
92
98
  *
93
99
  * @param {Rect} rect
@@ -143,6 +149,7 @@
143
149
  self: self,
144
150
  not: not,
145
151
  and: and,
152
+ invoke: invoke,
146
153
  uniqueId: uniqueId,
147
154
  rect2bnd: rect2bnd,
148
155
  invertObject: invertObject,
@@ -384,6 +391,24 @@
384
391
  }
385
392
  }
386
393
 
394
+ var isEdge = /Edge\/\d+/.test(userAgent);
395
+
396
+ var hasCodeMirror = !!window.CodeMirror;
397
+ if (!hasCodeMirror && isSupportAmd && require) {
398
+ if (require.hasOwnProperty('resolve')) {
399
+ try {
400
+ // If CodeMirror can't be resolved, `require.resolve` will throw an
401
+ // exception and `hasCodeMirror` won't be set to `true`.
402
+ require.resolve('codemirror');
403
+ hasCodeMirror = true;
404
+ } catch (e) {
405
+ hasCodeMirror = false;
406
+ }
407
+ } else if (require.hasOwnProperty('specified')) {
408
+ hasCodeMirror = require.specified('codemirror');
409
+ }
410
+ }
411
+
387
412
  /**
388
413
  * @class core.agent
389
414
  *
@@ -395,13 +420,16 @@
395
420
  var agent = {
396
421
  isMac: navigator.appVersion.indexOf('Mac') > -1,
397
422
  isMSIE: isMSIE,
398
- isFF: /firefox/i.test(userAgent),
399
- isWebkit: /webkit/i.test(userAgent),
400
- isSafari: /safari/i.test(userAgent),
423
+ isEdge: isEdge,
424
+ isFF: !isEdge && /firefox/i.test(userAgent),
425
+ isPhantom: /PhantomJS/i.test(userAgent),
426
+ isWebkit: !isEdge && /webkit/i.test(userAgent),
427
+ isChrome: !isEdge && /chrome/i.test(userAgent),
428
+ isSafari: !isEdge && /safari/i.test(userAgent),
401
429
  browserVersion: browserVersion,
402
430
  jqueryVersion: parseFloat($.fn.jquery),
403
431
  isSupportAmd: isSupportAmd,
404
- hasCodeMirror: isSupportAmd ? require.specified('codemirror') : !!window.CodeMirror,
432
+ hasCodeMirror: hasCodeMirror,
405
433
  isFontInstalled: isFontInstalled,
406
434
  isW3CRangeSupport: !!document.createRange
407
435
  };
@@ -756,20 +784,20 @@
756
784
  * @param {Function} [pred] - predicate function
757
785
  */
758
786
  var listDescendant = function (node, pred) {
759
- var descendents = [];
787
+ var descendants = [];
760
788
  pred = pred || func.ok;
761
789
 
762
790
  // start DFS(depth first search) with node
763
791
  (function fnWalk(current) {
764
792
  if (node !== current && pred(current)) {
765
- descendents.push(current);
793
+ descendants.push(current);
766
794
  }
767
795
  for (var idx = 0, len = current.childNodes.length; idx < len; idx++) {
768
796
  fnWalk(current.childNodes[idx]);
769
797
  }
770
798
  })(node);
771
799
 
772
- return descendents;
800
+ return descendants;
773
801
  };
774
802
 
775
803
  /**
@@ -849,7 +877,7 @@
849
877
  };
850
878
 
851
879
  /**
852
- * returns wheter node is left edge of ancestor or not.
880
+ * returns whether node is left edge of ancestor or not.
853
881
  *
854
882
  * @param {Node} node
855
883
  * @param {Node} ancestor
@@ -1476,7 +1504,6 @@
1476
1504
  };
1477
1505
  })();
1478
1506
 
1479
-
1480
1507
  /**
1481
1508
  * @param {jQuery} $note
1482
1509
  * @param {Object} options
@@ -1514,9 +1541,14 @@
1514
1541
  * destory modules and other resources and initialize it again
1515
1542
  */
1516
1543
  this.reset = function () {
1544
+ var disabled = self.isDisabled();
1517
1545
  this.code(dom.emptyPara);
1518
1546
  this._destroy();
1519
1547
  this._initialize();
1548
+
1549
+ if (disabled) {
1550
+ self.disable();
1551
+ }
1520
1552
  };
1521
1553
 
1522
1554
  this._initialize = function () {
@@ -1658,7 +1690,7 @@
1658
1690
  this.createInvokeHandler = function (namespace, value) {
1659
1691
  return function (event) {
1660
1692
  event.preventDefault();
1661
- self.invoke(namespace, value || $(event.target).data('value') || $(event.currentTarget).data('value'));
1693
+ self.invoke(namespace, value || $(event.target).closest('[data-value]').data('value'));
1662
1694
  };
1663
1695
  };
1664
1696
 
@@ -1682,10 +1714,6 @@
1682
1714
  return this.initialize();
1683
1715
  };
1684
1716
 
1685
- $.summernote = $.summernote || {
1686
- lang: {}
1687
- };
1688
-
1689
1717
  $.fn.extend({
1690
1718
  /**
1691
1719
  * Summernote API
@@ -1818,7 +1846,9 @@
1818
1846
 
1819
1847
  var dropdown = renderer.create('<div class="dropdown-menu">', function ($node, options) {
1820
1848
  var markup = $.isArray(options.items) ? options.items.map(function (item) {
1821
- return '<li><a href="#" data-value="' + item + '">' + item + '</a></li>';
1849
+ var value = (typeof item === 'string') ? item : (item.value || '');
1850
+ var content = options.template ? options.template(item) : item;
1851
+ return '<li><a href="#" data-value="' + value + '">' + content + '</a></li>';
1822
1852
  }).join('') : options.items;
1823
1853
 
1824
1854
  $node.html(markup);
@@ -1826,7 +1856,9 @@
1826
1856
 
1827
1857
  var dropdownCheck = renderer.create('<div class="dropdown-menu note-check">', function ($node, options) {
1828
1858
  var markup = $.isArray(options.items) ? options.items.map(function (item) {
1829
- return '<li><a href="#" data-value="' + item + '">' + icon(options.checkClassName) + ' ' + item + '</a></li>';
1859
+ var value = (typeof item === 'string') ? item : (item.value || '');
1860
+ var content = options.template ? options.template(item) : item;
1861
+ return '<li><a href="#" data-value="' + value + '">' + icon(options.checkClassName) + ' ' + content + '</a></li>';
1830
1862
  }).join('') : options.items;
1831
1863
  $node.html(markup);
1832
1864
  });
@@ -1859,7 +1891,10 @@
1859
1891
  });
1860
1892
  });
1861
1893
 
1862
- var dialog = renderer.create('<div class="modal" aria-hidden="false"/>', function ($node, options) {
1894
+ var dialog = renderer.create('<div class="modal" aria-hidden="false" tabindex="-1"/>', function ($node, options) {
1895
+ if (options.fade) {
1896
+ $node.addClass('fade');
1897
+ }
1863
1898
  $node.html([
1864
1899
  '<div class="modal-dialog">',
1865
1900
  ' <div class="modal-content">',
@@ -1879,11 +1914,19 @@
1879
1914
  });
1880
1915
 
1881
1916
  var popover = renderer.create([
1882
- '<div class="note-popover popover bottom in">',
1917
+ '<div class="note-popover popover in">',
1883
1918
  ' <div class="arrow"/>',
1884
1919
  ' <div class="popover-content note-children-container"/>',
1885
1920
  '</div>'
1886
- ].join(''));
1921
+ ].join(''), function ($node, options) {
1922
+ var direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';
1923
+
1924
+ $node.addClass(direction);
1925
+
1926
+ if (options.hideArrow) {
1927
+ $node.find('.arrow').hide();
1928
+ }
1929
+ });
1887
1930
 
1888
1931
  var icon = function (iconClassName, tagName) {
1889
1932
  tagName = tagName || 'i';
@@ -1967,6 +2010,10 @@
1967
2010
  }
1968
2011
  };
1969
2012
 
2013
+ $.summernote = $.summernote || {
2014
+ lang: {}
2015
+ };
2016
+
1970
2017
  $.extend($.summernote.lang, {
1971
2018
  'en-US': {
1972
2019
  font: {
@@ -2073,7 +2120,7 @@
2073
2120
  documentStyle: 'Document Style',
2074
2121
  extraKeys: 'Extra keys'
2075
2122
  },
2076
- help : {
2123
+ help: {
2077
2124
  'insertParagraph': 'Insert Paragraph',
2078
2125
  'undo': 'Undoes the last command',
2079
2126
  'redo': 'Redoes the last command',
@@ -2178,7 +2225,7 @@
2178
2225
  keyMap.BACKSPACE,
2179
2226
  keyMap.TAB,
2180
2227
  keyMap.ENTER,
2181
- keyMap.SPACe
2228
+ keyMap.SPACE
2182
2229
  ], keyCode);
2183
2230
  },
2184
2231
  /**
@@ -2204,7 +2251,6 @@
2204
2251
  };
2205
2252
  })();
2206
2253
 
2207
-
2208
2254
  var range = (function () {
2209
2255
 
2210
2256
  /**
@@ -2387,15 +2433,15 @@
2387
2433
  return this;
2388
2434
  };
2389
2435
 
2390
-
2391
2436
  /**
2392
2437
  * Moves the scrollbar to start container(sc) of current range
2393
2438
  *
2394
2439
  * @return {WrappedRange}
2395
2440
  */
2396
- this.scrollIntoView = function ($container) {
2397
- if ($container[0].scrollTop + $container.height() < this.sc.offsetTop) {
2398
- $container[0].scrollTop += Math.abs($container[0].scrollTop + $container.height() - this.sc.offsetTop);
2441
+ this.scrollIntoView = function (container) {
2442
+ var height = $(container).height();
2443
+ if (container.scrollTop + height < this.sc.offsetTop) {
2444
+ container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);
2399
2445
  }
2400
2446
 
2401
2447
  return this;
@@ -2841,8 +2887,6 @@
2841
2887
  */
2842
2888
  return {
2843
2889
  /**
2844
- * @method
2845
- *
2846
2890
  * create Range Object From arguments or Browser Selection
2847
2891
  *
2848
2892
  * @param {Node} sc - start container
@@ -2851,48 +2895,63 @@
2851
2895
  * @param {Number} eo - end offset
2852
2896
  * @return {WrappedRange}
2853
2897
  */
2854
- create : function (sc, so, ec, eo) {
2855
- if (!arguments.length) { // from Browser Selection
2856
- if (agent.isW3CRangeSupport) {
2857
- var selection = document.getSelection();
2858
- if (!selection || selection.rangeCount === 0) {
2859
- return null;
2860
- } else if (dom.isBody(selection.anchorNode)) {
2861
- // Firefox: returns entire body as range on initialization. We won't never need it.
2862
- return null;
2863
- }
2864
-
2865
- var nativeRng = selection.getRangeAt(0);
2866
- sc = nativeRng.startContainer;
2867
- so = nativeRng.startOffset;
2868
- ec = nativeRng.endContainer;
2869
- eo = nativeRng.endOffset;
2870
- } else { // IE8: TextRange
2871
- var textRange = document.selection.createRange();
2872
- var textRangeEnd = textRange.duplicate();
2873
- textRangeEnd.collapse(false);
2874
- var textRangeStart = textRange;
2875
- textRangeStart.collapse(true);
2876
-
2877
- var startPoint = textRangeToPoint(textRangeStart, true),
2878
- endPoint = textRangeToPoint(textRangeEnd, false);
2879
-
2880
- // same visible point case: range was collapsed.
2881
- if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&
2882
- dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&
2883
- endPoint.node.nextSibling === startPoint.node) {
2884
- startPoint = endPoint;
2885
- }
2886
-
2887
- sc = startPoint.cont;
2888
- so = startPoint.offset;
2889
- ec = endPoint.cont;
2890
- eo = endPoint.offset;
2891
- }
2898
+ create: function (sc, so, ec, eo) {
2899
+ if (arguments.length === 4) {
2900
+ return new WrappedRange(sc, so, ec, eo);
2892
2901
  } else if (arguments.length === 2) { //collapsed
2893
2902
  ec = sc;
2894
2903
  eo = so;
2904
+ return new WrappedRange(sc, so, ec, eo);
2905
+ } else {
2906
+ var wrappedRange = this.createFromSelection();
2907
+ if (!wrappedRange && arguments.length === 1) {
2908
+ wrappedRange = this.createFromNode(arguments[0]);
2909
+ return wrappedRange.collapse(dom.emptyPara === arguments[0].innerHTML);
2910
+ }
2911
+ return wrappedRange;
2912
+ }
2913
+ },
2914
+
2915
+ createFromSelection: function () {
2916
+ var sc, so, ec, eo;
2917
+ if (agent.isW3CRangeSupport) {
2918
+ var selection = document.getSelection();
2919
+ if (!selection || selection.rangeCount === 0) {
2920
+ return null;
2921
+ } else if (dom.isBody(selection.anchorNode)) {
2922
+ // Firefox: returns entire body as range on initialization.
2923
+ // We won't never need it.
2924
+ return null;
2925
+ }
2926
+
2927
+ var nativeRng = selection.getRangeAt(0);
2928
+ sc = nativeRng.startContainer;
2929
+ so = nativeRng.startOffset;
2930
+ ec = nativeRng.endContainer;
2931
+ eo = nativeRng.endOffset;
2932
+ } else { // IE8: TextRange
2933
+ var textRange = document.selection.createRange();
2934
+ var textRangeEnd = textRange.duplicate();
2935
+ textRangeEnd.collapse(false);
2936
+ var textRangeStart = textRange;
2937
+ textRangeStart.collapse(true);
2938
+
2939
+ var startPoint = textRangeToPoint(textRangeStart, true),
2940
+ endPoint = textRangeToPoint(textRangeEnd, false);
2941
+
2942
+ // same visible point case: range was collapsed.
2943
+ if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&
2944
+ dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&
2945
+ endPoint.node.nextSibling === startPoint.node) {
2946
+ startPoint = endPoint;
2947
+ }
2948
+
2949
+ sc = startPoint.cont;
2950
+ so = startPoint.offset;
2951
+ ec = endPoint.cont;
2952
+ eo = endPoint.offset;
2895
2953
  }
2954
+
2896
2955
  return new WrappedRange(sc, so, ec, eo);
2897
2956
  },
2898
2957
 
@@ -2955,7 +3014,7 @@
2955
3014
  * @param {Object} bookmark
2956
3015
  * @return {WrappedRange}
2957
3016
  */
2958
- createFromBookmark : function (editable, bookmark) {
3017
+ createFromBookmark: function (editable, bookmark) {
2959
3018
  var sc = dom.fromOffsetPath(editable, bookmark.s.path);
2960
3019
  var so = bookmark.s.offset;
2961
3020
  var ec = dom.fromOffsetPath(editable, bookmark.e.path);
@@ -3055,7 +3114,7 @@
3055
3114
  var editable = $editable[0];
3056
3115
 
3057
3116
  var makeSnapshot = function () {
3058
- var rng = range.create();
3117
+ var rng = range.create(editable);
3059
3118
  var emptyBookmark = {s: {path: [], offset: 0}, e: {path: [], offset: 0}};
3060
3119
 
3061
3120
  return {
@@ -3079,7 +3138,6 @@
3079
3138
  * Leaves the stack intact, so that "Redo" can still be used.
3080
3139
  */
3081
3140
  this.rewind = function () {
3082
-
3083
3141
  // Create snap shot if not yet recorded
3084
3142
  if ($editable.html() !== stack[stackOffset].contents) {
3085
3143
  this.recordUndo();
@@ -3090,16 +3148,13 @@
3090
3148
 
3091
3149
  // Apply that snapshot.
3092
3150
  applySnapshot(stack[stackOffset]);
3093
-
3094
3151
  };
3095
3152
 
3096
-
3097
3153
  /**
3098
3154
  * @method reset
3099
3155
  * Resets the history stack completely; reverting to an empty editor.
3100
3156
  */
3101
3157
  this.reset = function () {
3102
-
3103
3158
  // Clear the stack.
3104
3159
  stack = [];
3105
3160
 
@@ -3111,7 +3166,6 @@
3111
3166
 
3112
3167
  // Record our first snapshot (of nothing).
3113
3168
  this.recordUndo();
3114
-
3115
3169
  };
3116
3170
 
3117
3171
  /**
@@ -3284,7 +3338,7 @@
3284
3338
  'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',
3285
3339
  'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',
3286
3340
  'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',
3287
- 'font-strikethrough': document.queryCommandState('strikeThrough') ? 'strikethrough' : 'normal'
3341
+ 'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal'
3288
3342
  });
3289
3343
  } catch (e) {}
3290
3344
 
@@ -3320,38 +3374,28 @@
3320
3374
  * @alternateClassName Bullet
3321
3375
  */
3322
3376
  var Bullet = function () {
3377
+ var self = this;
3378
+
3323
3379
  /**
3324
- * @method insertOrderedList
3325
- *
3326
3380
  * toggle ordered list
3327
- *
3328
- * @type command
3329
3381
  */
3330
- this.insertOrderedList = function () {
3331
- this.toggleList('OL');
3382
+ this.insertOrderedList = function (editable) {
3383
+ this.toggleList('OL', editable);
3332
3384
  };
3333
3385
 
3334
3386
  /**
3335
- * @method insertUnorderedList
3336
- *
3337
3387
  * toggle unordered list
3338
- *
3339
- * @type command
3340
3388
  */
3341
- this.insertUnorderedList = function () {
3342
- this.toggleList('UL');
3389
+ this.insertUnorderedList = function (editable) {
3390
+ this.toggleList('UL', editable);
3343
3391
  };
3344
3392
 
3345
3393
  /**
3346
- * @method indent
3347
- *
3348
3394
  * indent
3349
- *
3350
- * @type command
3351
3395
  */
3352
- this.indent = function () {
3396
+ this.indent = function (editable) {
3353
3397
  var self = this;
3354
- var rng = range.create().wrapBodyInlineWithPara();
3398
+ var rng = range.create(editable).wrapBodyInlineWithPara();
3355
3399
 
3356
3400
  var paras = rng.nodes(dom.isPara, { includeAncestor: true });
3357
3401
  var clustereds = list.clusterBy(paras, func.peq2('parentNode'));
@@ -3373,15 +3417,11 @@
3373
3417
  };
3374
3418
 
3375
3419
  /**
3376
- * @method outdent
3377
- *
3378
3420
  * outdent
3379
- *
3380
- * @type command
3381
3421
  */
3382
- this.outdent = function () {
3422
+ this.outdent = function (editable) {
3383
3423
  var self = this;
3384
- var rng = range.create().wrapBodyInlineWithPara();
3424
+ var rng = range.create(editable).wrapBodyInlineWithPara();
3385
3425
 
3386
3426
  var paras = rng.nodes(dom.isPara, { includeAncestor: true });
3387
3427
  var clustereds = list.clusterBy(paras, func.peq2('parentNode'));
@@ -3404,15 +3444,12 @@
3404
3444
  };
3405
3445
 
3406
3446
  /**
3407
- * @method toggleList
3408
- *
3409
3447
  * toggle list
3410
3448
  *
3411
3449
  * @param {String} listName - OL or UL
3412
3450
  */
3413
- this.toggleList = function (listName) {
3414
- var self = this;
3415
- var rng = range.create().wrapBodyInlineWithPara();
3451
+ this.toggleList = function (listName, editable) {
3452
+ var rng = range.create(editable).wrapBodyInlineWithPara();
3416
3453
 
3417
3454
  var paras = rng.nodes(dom.isPara, { includeAncestor: true });
3418
3455
  var bookmark = rng.paraBookmark(paras);
@@ -3446,8 +3483,6 @@
3446
3483
  };
3447
3484
 
3448
3485
  /**
3449
- * @method wrapList
3450
- *
3451
3486
  * @param {Node[]} paras
3452
3487
  * @param {String} listName
3453
3488
  * @return {Node[]}
@@ -3554,11 +3589,10 @@
3554
3589
  /**
3555
3590
  * insert tab
3556
3591
  *
3557
- * @param {jQuery} $editable
3558
3592
  * @param {WrappedRange} rng
3559
3593
  * @param {Number} tabsize
3560
3594
  */
3561
- this.insertTab = function ($editable, rng, tabsize) {
3595
+ this.insertTab = function (rng, tabsize) {
3562
3596
  var tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));
3563
3597
  rng = rng.deleteContents();
3564
3598
  rng.insertNode(tab, true);
@@ -3570,8 +3604,8 @@
3570
3604
  /**
3571
3605
  * insert paragraph
3572
3606
  */
3573
- this.insertParagraph = function ($editable) {
3574
- var rng = range.create();
3607
+ this.insertParagraph = function (editable) {
3608
+ var rng = range.create(editable);
3575
3609
 
3576
3610
  // deleteContents on range.
3577
3611
  rng = rng.deleteContents();
@@ -3622,7 +3656,7 @@
3622
3656
  }
3623
3657
  }
3624
3658
 
3625
- range.create(nextPara, 0).normalize().select().scrollIntoView($editable);
3659
+ range.create(nextPara, 0).normalize().select().scrollIntoView(editable);
3626
3660
  };
3627
3661
  };
3628
3662
 
@@ -3693,6 +3727,9 @@
3693
3727
  var options = context.options;
3694
3728
  var lang = options.langInfo;
3695
3729
 
3730
+ var editable = $editable[0];
3731
+ var lastRange = null;
3732
+
3696
3733
  var style = new Style();
3697
3734
  var table = new Table();
3698
3735
  var typing = new Typing();
@@ -3726,6 +3763,9 @@
3726
3763
  context.triggerEvent('paste', event);
3727
3764
  });
3728
3765
 
3766
+ // init content before set event
3767
+ $editable.html(dom.html($note) || dom.emptyPara);
3768
+
3729
3769
  // [workaround] IE doesn't have input events for contentEditable
3730
3770
  // - see: https://goo.gl/4bfIvA
3731
3771
  var changeEventName = agent.isMSIE ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';
@@ -3740,7 +3780,7 @@
3740
3780
  });
3741
3781
 
3742
3782
  if (!options.airMode && options.height) {
3743
- $editable.outerHeight(options.height);
3783
+ this.setHeight(options.height);
3744
3784
  }
3745
3785
  if (!options.airMode && options.maxHeight) {
3746
3786
  $editable.css('max-height', options.maxHeight);
@@ -3749,7 +3789,6 @@
3749
3789
  $editable.css('min-height', options.minHeight);
3750
3790
  }
3751
3791
 
3752
- $editable.html(dom.html($note) || dom.emptyPara);
3753
3792
  history.recordUndo();
3754
3793
  };
3755
3794
 
@@ -3780,14 +3819,12 @@
3780
3819
  };
3781
3820
 
3782
3821
  /**
3783
- * createRange
3784
- *
3785
3822
  * create range
3786
3823
  * @return {WrappedRange}
3787
3824
  */
3788
3825
  this.createRange = function () {
3789
3826
  this.focus();
3790
- return range.create();
3827
+ return range.create(editable);
3791
3828
  };
3792
3829
 
3793
3830
  /**
@@ -3798,10 +3835,9 @@
3798
3835
  * @param {Boolean} [thenCollapse=false]
3799
3836
  */
3800
3837
  this.saveRange = function (thenCollapse) {
3801
- this.focus();
3802
- $editable.data('range', range.create());
3838
+ lastRange = this.createRange();
3803
3839
  if (thenCollapse) {
3804
- range.create().collapse().select();
3840
+ lastRange.collapse().select();
3805
3841
  }
3806
3842
  };
3807
3843
 
@@ -3811,9 +3847,8 @@
3811
3847
  * restore lately range
3812
3848
  */
3813
3849
  this.restoreRange = function () {
3814
- var rng = $editable.data('range');
3815
- if (rng) {
3816
- rng.select();
3850
+ if (lastRange) {
3851
+ lastRange.select();
3817
3852
  this.focus();
3818
3853
  }
3819
3854
  };
@@ -3875,7 +3910,6 @@
3875
3910
  context.memo('help.redo', lang.help.redo);
3876
3911
 
3877
3912
  /**
3878
- * beforeCommand
3879
3913
  * before command
3880
3914
  */
3881
3915
  var beforeCommand = this.beforeCommand = function () {
@@ -3885,7 +3919,6 @@
3885
3919
  };
3886
3920
 
3887
3921
  /**
3888
- * afterCommand
3889
3922
  * after command
3890
3923
  * @param {Boolean} isPreventTrigger
3891
3924
  */
@@ -3916,8 +3949,6 @@
3916
3949
  /* jshint ignore:end */
3917
3950
 
3918
3951
  /**
3919
- * tab
3920
- *
3921
3952
  * handle tab key
3922
3953
  */
3923
3954
  this.tab = function () {
@@ -3926,17 +3957,14 @@
3926
3957
  table.tab(rng);
3927
3958
  } else {
3928
3959
  beforeCommand();
3929
- typing.insertTab($editable, rng, options.tabSize);
3960
+ typing.insertTab(rng, options.tabSize);
3930
3961
  afterCommand();
3931
3962
  }
3932
3963
  };
3933
3964
  context.memo('help.tab', lang.help.tab);
3934
3965
 
3935
3966
  /**
3936
- * untab
3937
- *
3938
3967
  * handle shift+tab key
3939
- *
3940
3968
  */
3941
3969
  this.untab = function () {
3942
3970
  var rng = this.createRange();
@@ -3947,8 +3975,6 @@
3947
3975
  context.memo('help.untab', lang.help.untab);
3948
3976
 
3949
3977
  /**
3950
- * wrapCommand
3951
- *
3952
3978
  * run given function between beforeCommand and afterCommand
3953
3979
  */
3954
3980
  this.wrapCommand = function (fn) {
@@ -3960,35 +3986,30 @@
3960
3986
  };
3961
3987
 
3962
3988
  /**
3963
- * insertParagraph
3964
- *
3965
3989
  * insert paragraph
3966
3990
  */
3967
3991
  this.insertParagraph = this.wrapCommand(function () {
3968
- typing.insertParagraph($editable);
3992
+ typing.insertParagraph(editable);
3969
3993
  });
3970
3994
  context.memo('help.insertParagraph', lang.help.insertParagraph);
3971
3995
 
3972
- /**
3973
- * insertOrderedList
3974
- */
3975
3996
  this.insertOrderedList = this.wrapCommand(function () {
3976
- bullet.insertOrderedList($editable);
3997
+ bullet.insertOrderedList(editable);
3977
3998
  });
3978
3999
  context.memo('help.insertOrderedList', lang.help.insertOrderedList);
3979
4000
 
3980
4001
  this.insertUnorderedList = this.wrapCommand(function () {
3981
- bullet.insertUnorderedList($editable);
4002
+ bullet.insertUnorderedList(editable);
3982
4003
  });
3983
4004
  context.memo('help.insertUnorderedList', lang.help.insertUnorderedList);
3984
4005
 
3985
4006
  this.indent = this.wrapCommand(function () {
3986
- bullet.indent($editable);
4007
+ bullet.indent(editable);
3987
4008
  });
3988
4009
  context.memo('help.indent', lang.help.indent);
3989
4010
 
3990
4011
  this.outdent = this.wrapCommand(function () {
3991
- bullet.outdent($editable);
4012
+ bullet.outdent(editable);
3992
4013
  });
3993
4014
  context.memo('help.outdent', lang.help.outdent);
3994
4015
 
@@ -4013,11 +4034,11 @@
4013
4034
  }
4014
4035
 
4015
4036
  $image.show();
4016
- range.create().insertNode($image[0]);
4037
+ range.create(editable).insertNode($image[0]);
4017
4038
  range.createFromNodeAfter($image[0]).select();
4018
4039
  afterCommand();
4019
- }).fail(function () {
4020
- context.triggerEvent('image.upload.error');
4040
+ }).fail(function (e) {
4041
+ context.triggerEvent('image.upload.error', e);
4021
4042
  });
4022
4043
  };
4023
4044
 
@@ -4062,7 +4083,8 @@
4062
4083
  * @param {Node} node
4063
4084
  */
4064
4085
  this.insertNode = this.wrapCommand(function (node) {
4065
- range.create().insertNode(node);
4086
+ var rng = this.createRange();
4087
+ rng.insertNode(node);
4066
4088
  range.createFromNodeAfter(node).select();
4067
4089
  });
4068
4090
 
@@ -4071,7 +4093,8 @@
4071
4093
  * @param {String} text
4072
4094
  */
4073
4095
  this.insertText = this.wrapCommand(function (text) {
4074
- var textNode = range.create().insertNode(dom.createText(text));
4096
+ var rng = this.createRange();
4097
+ var textNode = rng.insertNode(dom.createText(text));
4075
4098
  range.create(textNode, dom.nodeLength(textNode)).select();
4076
4099
  });
4077
4100
 
@@ -4095,7 +4118,7 @@
4095
4118
  * @param {String} markup
4096
4119
  */
4097
4120
  this.pasteHTML = this.wrapCommand(function (markup) {
4098
- var contents = range.create().pasteHTML(markup);
4121
+ var contents = this.createRange().pasteHTML(markup);
4099
4122
  range.createFromNodeAfter(list.last(contents)).select();
4100
4123
  });
4101
4124
 
@@ -4126,15 +4149,13 @@
4126
4149
  };
4127
4150
  /* jshint ignore:end */
4128
4151
 
4129
-
4130
4152
  /**
4131
4153
  * fontSize
4132
4154
  *
4133
4155
  * @param {String} value - px
4134
4156
  */
4135
4157
  this.fontSize = function (value) {
4136
- this.focus();
4137
- var rng = range.create();
4158
+ var rng = this.createRange();
4138
4159
 
4139
4160
  if (rng && rng.isCollapsed()) {
4140
4161
  var spans = style.styleNodes(rng);
@@ -4164,15 +4185,13 @@
4164
4185
  * insert horizontal rule
4165
4186
  */
4166
4187
  this.insertHorizontalRule = this.wrapCommand(function () {
4167
- var rng = range.create();
4168
- var hrNode = rng.insertNode($('<HR/>')[0]);
4188
+ var hrNode = this.createRange().insertNode(dom.create('HR'));
4169
4189
  if (hrNode.nextSibling) {
4170
4190
  range.create(hrNode.nextSibling, 0).normalize().select();
4171
4191
  }
4172
4192
  });
4173
4193
  context.memo('help.insertHorizontalRule', lang.help.insertHorizontalRule);
4174
4194
 
4175
-
4176
4195
  /**
4177
4196
  * remove bogus node and character
4178
4197
  */
@@ -4201,7 +4220,7 @@
4201
4220
  * @param {String} value
4202
4221
  */
4203
4222
  this.lineHeight = this.wrapCommand(function (value) {
4204
- style.stylePara(range.create(), {
4223
+ style.stylePara(this.createRange(), {
4205
4224
  lineHeight: value
4206
4225
  });
4207
4226
  });
@@ -4242,7 +4261,7 @@
4242
4261
 
4243
4262
  var anchors = [];
4244
4263
  if (isTextChanged) {
4245
- // Create a new link when text changed.
4264
+ rng = rng.deleteContents();
4246
4265
  var anchor = rng.insertNode($('<A>' + linkText + '</A>')[0]);
4247
4266
  anchors.push(anchor);
4248
4267
  } else {
@@ -4285,9 +4304,7 @@
4285
4304
  * @return {String} [return.url=""]
4286
4305
  */
4287
4306
  this.getLinkInfo = function () {
4288
- this.focus();
4289
-
4290
- var rng = range.create().expand(dom.isAnchor);
4307
+ var rng = this.createRange().expand(dom.isAnchor);
4291
4308
 
4292
4309
  // Get the first anchor on range(for edit).
4293
4310
  var $anchor = $(list.head(rng.nodes(dom.isAnchor)));
@@ -4318,12 +4335,12 @@
4318
4335
  /**
4319
4336
  * insert Table
4320
4337
  *
4321
- * @param {String} sDim dimension of table (ex : "5x5")
4338
+ * @param {String} dimension of table (ex : "5x5")
4322
4339
  */
4323
- this.insertTable = this.wrapCommand(function (sDim) {
4324
- var dimension = sDim.split('x');
4340
+ this.insertTable = this.wrapCommand(function (dim) {
4341
+ var dimension = dim.split('x');
4325
4342
 
4326
- var rng = range.create().deleteContents();
4343
+ var rng = this.createRange().deleteContents();
4327
4344
  rng.insertNode(table.createTable(dimension[0], dimension[1], options));
4328
4345
  });
4329
4346
 
@@ -4381,22 +4398,21 @@
4381
4398
  context.triggerEvent('media.delete', $target, $editable);
4382
4399
  });
4383
4400
 
4401
+ /**
4402
+ * returns whether editable area has focus or not.
4403
+ */
4404
+ this.hasFocus = function () {
4405
+ return $editable.is(':focus');
4406
+ };
4407
+
4384
4408
  /**
4385
4409
  * set focus
4386
4410
  */
4387
4411
  this.focus = function () {
4388
4412
  // [workaround] Screen will move when page is scolled in IE.
4389
4413
  // - do focus when not focused
4390
- if (!$editable.is(':focus')) {
4414
+ if (!this.hasFocus()) {
4391
4415
  $editable.focus();
4392
-
4393
- // [workaround] for firefox bug http://goo.gl/lVfAaI
4394
- if (!$editable.is(':focus') && agent.isFF) {
4395
- range.createFromNode($editable[0])
4396
- .normalize()
4397
- .collapse()
4398
- .select();
4399
- }
4400
4416
  }
4401
4417
  };
4402
4418
 
@@ -4407,6 +4423,20 @@
4407
4423
  this.isEmpty = function () {
4408
4424
  return dom.isEmpty($editable[0]) || dom.emptyPara === $editable.html();
4409
4425
  };
4426
+
4427
+ /**
4428
+ * Removes all contents and restores the editable instance to an _emptyPara_.
4429
+ */
4430
+ this.empty = function () {
4431
+ context.invoke('code', dom.emptyPara);
4432
+ };
4433
+
4434
+ /**
4435
+ * set height for editable
4436
+ */
4437
+ this.setHeight = function (height) {
4438
+ $editable.outerHeight(height);
4439
+ };
4410
4440
  };
4411
4441
 
4412
4442
  var Clipboard = function (context) {
@@ -4439,9 +4469,9 @@
4439
4469
  // - Webkit: event.clipboardData
4440
4470
  if (this.needKeydownHook()) {
4441
4471
  this.$paste = $('<div />').attr('contenteditable', true).css({
4442
- position : 'absolute',
4443
- left : -100000,
4444
- opacity : 0
4472
+ position: 'absolute',
4473
+ left: -100000,
4474
+ opacity: 0
4445
4475
  });
4446
4476
  $editable.before(this.$paste);
4447
4477
 
@@ -4471,7 +4501,7 @@
4471
4501
  array[i] = decodedData.charCodeAt(i);
4472
4502
  }
4473
4503
 
4474
- var blob = new Blob([array], { type : 'image/png' });
4504
+ var blob = new Blob([array], { type: 'image/png' });
4475
4505
  blob.name = 'clipboard.png';
4476
4506
 
4477
4507
  context.invoke('editor.restoreRange');
@@ -4767,8 +4797,7 @@
4767
4797
  };
4768
4798
 
4769
4799
  $editor.toggleClass('fullscreen');
4770
- var isFullscreen = $editor.hasClass('fullscreen');
4771
- if (isFullscreen) {
4800
+ if (this.isFullscreen()) {
4772
4801
  $editable.data('orgHeight', $editable.css('height'));
4773
4802
 
4774
4803
  $window.on('resize', function () {
@@ -4786,7 +4815,11 @@
4786
4815
  $scrollbar.css('overflow', 'visible');
4787
4816
  }
4788
4817
 
4789
- context.invoke('toolbar.updateFullscreen', isFullscreen);
4818
+ context.invoke('toolbar.updateFullscreen', this.isFullscreen());
4819
+ };
4820
+
4821
+ this.isFullscreen = function () {
4822
+ return $editor.hasClass('fullscreen');
4790
4823
  };
4791
4824
  };
4792
4825
 
@@ -4904,8 +4937,8 @@
4904
4937
 
4905
4938
  var AutoLink = function (context) {
4906
4939
  var self = this;
4907
-
4908
- var linkPattern = /^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+-]+@)(.+)$/i;
4940
+ var defaultScheme = 'http://';
4941
+ var linkPattern = /^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|mailto:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i;
4909
4942
 
4910
4943
  this.events = {
4911
4944
  'summernote.keyup': function (we, e) {
@@ -4932,9 +4965,11 @@
4932
4965
  }
4933
4966
 
4934
4967
  var keyword = this.lastWordRange.toString();
4968
+ var match = keyword.match(linkPattern);
4935
4969
 
4936
- if (linkPattern.test(keyword)) {
4937
- var node = this.nodeFromKeyword(keyword);
4970
+ if (match && (match[1] || match[2])) {
4971
+ var link = match[1] ? keyword : defaultScheme + keyword;
4972
+ var node = $('<a />').html(keyword).attr('href', link)[0];
4938
4973
 
4939
4974
  this.lastWordRange.insertNode(node);
4940
4975
  this.lastWordRange = null;
@@ -4943,10 +4978,6 @@
4943
4978
 
4944
4979
  };
4945
4980
 
4946
- this.nodeFromKeyword = function (keyword) {
4947
- return $('<a />').html(keyword).attr('href', keyword)[0];
4948
- };
4949
-
4950
4981
  this.handleKeydown = function (e) {
4951
4982
  if (list.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
4952
4983
  var wordRange = context.invoke('editor.createRange').getWordRange();
@@ -5041,6 +5072,20 @@
5041
5072
  this.addToolbarButtons();
5042
5073
  this.addImagePopoverButtons();
5043
5074
  this.addLinkPopoverButtons();
5075
+ this.fontInstalledMap = {};
5076
+ };
5077
+
5078
+ this.destroy = function () {
5079
+ delete this.fontInstalledMap;
5080
+ };
5081
+
5082
+ this.isFontInstalled = function (name) {
5083
+ if (!self.fontInstalledMap.hasOwnProperty(name)) {
5084
+ self.fontInstalledMap[name] = agent.isFontInstalled(name) ||
5085
+ list.contains(options.fontNamesIgnoreCheck, name);
5086
+ }
5087
+
5088
+ return self.fontInstalledMap[name];
5044
5089
  };
5045
5090
 
5046
5091
  this.addToolbarButtons = function () {
@@ -5057,6 +5102,19 @@
5057
5102
  ui.dropdown({
5058
5103
  className: 'dropdown-style',
5059
5104
  items: context.options.styleTags,
5105
+ template: function (item) {
5106
+
5107
+ if (typeof item === 'string') {
5108
+ item = { tag: item, title: item };
5109
+ }
5110
+
5111
+ var tag = item.tag;
5112
+ var title = item.title;
5113
+ var style = item.style ? ' style="' + item.style + '" ' : '';
5114
+ var className = item.className ? ' className="' + item.className + '"' : '';
5115
+
5116
+ return '<' + tag + style + className + '>' + title + '</' + tag + '>';
5117
+ },
5060
5118
  click: context.createInvokeHandler('editor.formatBlock')
5061
5119
  })
5062
5120
  ]).render();
@@ -5099,6 +5157,7 @@
5099
5157
 
5100
5158
  context.memo('button.strikethrough', function () {
5101
5159
  return ui.button({
5160
+ className: 'note-btn-strikethrough',
5102
5161
  contents: ui.icon(options.icons.strikethrough),
5103
5162
  tooltip: lang.font.strikethrough + representShortcut('strikethrough'),
5104
5163
  click: context.createInvokeHandler('editor.strikethrough')
@@ -5107,6 +5166,7 @@
5107
5166
 
5108
5167
  context.memo('button.superscript', function () {
5109
5168
  return ui.button({
5169
+ className: 'note-btn-superscript',
5110
5170
  contents: ui.icon(options.icons.superscript),
5111
5171
  tooltip: lang.font.superscript,
5112
5172
  click: context.createInvokeHandler('editor.superscript')
@@ -5115,6 +5175,7 @@
5115
5175
 
5116
5176
  context.memo('button.subscript', function () {
5117
5177
  return ui.button({
5178
+ className: 'note-btn-subscript',
5118
5179
  contents: ui.icon(options.icons.subscript),
5119
5180
  tooltip: lang.font.subscript,
5120
5181
  click: context.createInvokeHandler('editor.subscript')
@@ -5133,11 +5194,11 @@
5133
5194
  }),
5134
5195
  ui.dropdownCheck({
5135
5196
  className: 'dropdown-fontname',
5136
- checkClassName : options.icons.menuCheck,
5137
- items: options.fontNames.filter(function (name) {
5138
- return agent.isFontInstalled(name) ||
5139
- list.contains(options.fontNamesIgnoreCheck, name);
5140
- }),
5197
+ checkClassName: options.icons.menuCheck,
5198
+ items: options.fontNames.filter(self.isFontInstalled),
5199
+ template: function (item) {
5200
+ return '<span style="font-family:' + item + '">' + item + '</span>';
5201
+ },
5141
5202
  click: context.createInvokeHandler('editor.fontName')
5142
5203
  })
5143
5204
  ]).render();
@@ -5155,7 +5216,7 @@
5155
5216
  }),
5156
5217
  ui.dropdownCheck({
5157
5218
  className: 'dropdown-fontsize',
5158
- checkClassName : options.icons.menuCheck,
5219
+ checkClassName: options.icons.menuCheck,
5159
5220
  items: options.fontSizes,
5160
5221
  click: context.createInvokeHandler('editor.fontSize')
5161
5222
  })
@@ -5167,19 +5228,20 @@
5167
5228
  className: 'note-color',
5168
5229
  children: [
5169
5230
  ui.button({
5170
- className : 'note-current-color-button',
5231
+ className: 'note-current-color-button',
5171
5232
  contents: ui.icon(options.icons.font + ' note-recent-color'),
5172
5233
  tooltip: lang.color.recent,
5173
- click: context.createInvokeHandler('editor.color'),
5234
+ click: function (e) {
5235
+ var $button = $(e.currentTarget);
5236
+ context.invoke('editor.color', {
5237
+ backColor: $button.attr('data-backColor'),
5238
+ foreColor: $button.attr('data-foreColor')
5239
+ });
5240
+ },
5174
5241
  callback: function ($button) {
5175
5242
  var $recentColor = $button.find('.note-recent-color');
5176
- $recentColor.css({
5177
- 'background-color': 'yellow'
5178
- });
5179
-
5180
- $button.data('value', {
5181
- backColor: 'yellow'
5182
- });
5243
+ $recentColor.css('background-color', '#FFFF00');
5244
+ $button.attr('data-backColor', '#FFFF00');
5183
5245
  }
5184
5246
  }),
5185
5247
  ui.button({
@@ -5196,7 +5258,7 @@
5196
5258
  '<div class="btn-group">',
5197
5259
  ' <div class="note-palette-title">' + lang.color.background + '</div>',
5198
5260
  ' <div>',
5199
- ' <button class="note-color-reset btn btn-default" data-event="backColor" data-value="inherit">',
5261
+ ' <button type="button" class="note-color-reset btn btn-default" data-event="backColor" data-value="inherit">',
5200
5262
  lang.color.transparent,
5201
5263
  ' </button>',
5202
5264
  ' </div>',
@@ -5205,7 +5267,7 @@
5205
5267
  '<div class="btn-group">',
5206
5268
  ' <div class="note-palette-title">' + lang.color.foreground + '</div>',
5207
5269
  ' <div>',
5208
- ' <button class="note-color-reset btn btn-default" data-event="removeFormat" data-value="foreColor">',
5270
+ ' <button type="button" class="note-color-reset btn btn-default" data-event="removeFormat" data-value="foreColor">',
5209
5271
  lang.color.resetToDefault,
5210
5272
  ' </button>',
5211
5273
  ' </div>',
@@ -5232,11 +5294,8 @@
5232
5294
  var $color = $button.closest('.note-color').find('.note-recent-color');
5233
5295
  var $currentButton = $button.closest('.note-color').find('.note-current-color-button');
5234
5296
 
5235
- var colorInfo = $currentButton.data('value');
5236
- colorInfo[eventName] = value;
5237
5297
  $color.css(key, value);
5238
- $currentButton.data('value', colorInfo);
5239
-
5298
+ $currentButton.attr('data-' + eventName, value);
5240
5299
  context.invoke('editor.' + eventName, value);
5241
5300
  }
5242
5301
  }
@@ -5245,7 +5304,7 @@
5245
5304
  }).render();
5246
5305
  });
5247
5306
 
5248
- context.memo('button.ol', function () {
5307
+ context.memo('button.ul', function () {
5249
5308
  return ui.button({
5250
5309
  contents: ui.icon(options.icons.unorderedlist),
5251
5310
  tooltip: lang.lists.unordered + representShortcut('insertUnorderedList'),
@@ -5253,7 +5312,7 @@
5253
5312
  }).render();
5254
5313
  });
5255
5314
 
5256
- context.memo('button.ul', function () {
5315
+ context.memo('button.ol', function () {
5257
5316
  return ui.button({
5258
5317
  contents: ui.icon(options.icons.orderedlist),
5259
5318
  tooltip: lang.lists.ordered + representShortcut('insertOrderedList'),
@@ -5261,11 +5320,54 @@
5261
5320
  }).render();
5262
5321
  });
5263
5322
 
5323
+ var justifyLeft = ui.button({
5324
+ contents: ui.icon(options.icons.alignLeft),
5325
+ tooltip: lang.paragraph.left + representShortcut('justifyLeft'),
5326
+ click: context.createInvokeHandler('editor.justifyLeft')
5327
+ });
5328
+
5329
+ var justifyCenter = ui.button({
5330
+ contents: ui.icon(options.icons.alignCenter),
5331
+ tooltip: lang.paragraph.center + representShortcut('justifyCenter'),
5332
+ click: context.createInvokeHandler('editor.justifyCenter')
5333
+ });
5334
+
5335
+ var justifyRight = ui.button({
5336
+ contents: ui.icon(options.icons.alignRight),
5337
+ tooltip: lang.paragraph.right + representShortcut('justifyRight'),
5338
+ click: context.createInvokeHandler('editor.justifyRight')
5339
+ });
5340
+
5341
+ var justifyFull = ui.button({
5342
+ contents: ui.icon(options.icons.alignJustify),
5343
+ tooltip: lang.paragraph.justify + representShortcut('justifyFull'),
5344
+ click: context.createInvokeHandler('editor.justifyFull')
5345
+ });
5346
+
5347
+ var outdent = ui.button({
5348
+ contents: ui.icon(options.icons.outdent),
5349
+ tooltip: lang.paragraph.outdent + representShortcut('outdent'),
5350
+ click: context.createInvokeHandler('editor.outdent')
5351
+ });
5352
+
5353
+ var indent = ui.button({
5354
+ contents: ui.icon(options.icons.indent),
5355
+ tooltip: lang.paragraph.indent + representShortcut('indent'),
5356
+ click: context.createInvokeHandler('editor.indent')
5357
+ });
5358
+
5359
+ context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));
5360
+ context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));
5361
+ context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));
5362
+ context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));
5363
+ context.memo('button.outdent', func.invoke(outdent, 'render'));
5364
+ context.memo('button.indent', func.invoke(indent, 'render'));
5365
+
5264
5366
  context.memo('button.paragraph', function () {
5265
5367
  return ui.buttonGroup([
5266
5368
  ui.button({
5267
5369
  className: 'dropdown-toggle',
5268
- contents: ui.icon(options.icons.align) + ' ' + ui.icon(options.icons.caret, 'span'),
5370
+ contents: ui.icon(options.icons.alignLeft) + ' ' + ui.icon(options.icons.caret, 'span'),
5269
5371
  tooltip: lang.paragraph.paragraph,
5270
5372
  data: {
5271
5373
  toggle: 'dropdown'
@@ -5274,43 +5376,11 @@
5274
5376
  ui.dropdown([
5275
5377
  ui.buttonGroup({
5276
5378
  className: 'note-align',
5277
- children: [
5278
- ui.button({
5279
- contents: ui.icon(options.icons.alignLeft),
5280
- tooltip: lang.paragraph.left + representShortcut('justifyLeft'),
5281
- click: context.createInvokeHandler('editor.justifyLeft')
5282
- }),
5283
- ui.button({
5284
- contents: ui.icon(options.icons.alignCenter),
5285
- tooltip: lang.paragraph.center + representShortcut('justifyCenter'),
5286
- click: context.createInvokeHandler('editor.justifyCenter')
5287
- }),
5288
- ui.button({
5289
- contents: ui.icon(options.icons.alignRight),
5290
- tooltip: lang.paragraph.right + representShortcut('justifyRight'),
5291
- click: context.createInvokeHandler('editor.justifyRight')
5292
- }),
5293
- ui.button({
5294
- contents: ui.icon(options.icons.alignJustify),
5295
- tooltip: lang.paragraph.justify + representShortcut('justifyFull'),
5296
- click: context.createInvokeHandler('editor.justifyFull')
5297
- })
5298
- ]
5379
+ children: [justifyLeft, justifyCenter, justifyRight, justifyFull]
5299
5380
  }),
5300
5381
  ui.buttonGroup({
5301
5382
  className: 'note-list',
5302
- children: [
5303
- ui.button({
5304
- contents: ui.icon(options.icons.outdent),
5305
- tooltip: lang.paragraph.outdent + representShortcut('outdent'),
5306
- click: context.createInvokeHandler('editor.outdent')
5307
- }),
5308
- ui.button({
5309
- contents: ui.icon(options.icons.indent),
5310
- tooltip: lang.paragraph.indent + representShortcut('indent'),
5311
- click: context.createInvokeHandler('editor.indent')
5312
- })
5313
- ]
5383
+ children: [outdent, indent]
5314
5384
  })
5315
5385
  ])
5316
5386
  ]).render();
@@ -5328,7 +5398,7 @@
5328
5398
  }),
5329
5399
  ui.dropdownCheck({
5330
5400
  items: options.lineHeights,
5331
- checkClassName : options.icons.menuCheck,
5401
+ checkClassName: options.icons.menuCheck,
5332
5402
  className: 'dropdown-line-height',
5333
5403
  click: context.createInvokeHandler('editor.lineHeight')
5334
5404
  })
@@ -5558,6 +5628,15 @@
5558
5628
  },
5559
5629
  '.note-btn-underline': function () {
5560
5630
  return styleInfo['font-underline'] === 'underline';
5631
+ },
5632
+ '.note-btn-subscript': function () {
5633
+ return styleInfo['font-subscript'] === 'subscript';
5634
+ },
5635
+ '.note-btn-superscript': function () {
5636
+ return styleInfo['font-superscript'] === 'superscript';
5637
+ },
5638
+ '.note-btn-strikethrough': function () {
5639
+ return styleInfo['font-strikethrough'] === 'strikethrough';
5561
5640
  }
5562
5641
  });
5563
5642
 
@@ -5567,10 +5646,7 @@
5567
5646
  .replace(/\s+$/, '')
5568
5647
  .replace(/^\s+/, '');
5569
5648
  });
5570
- var fontName = list.find(fontNames, function (name) {
5571
- return agent.isFontInstalled(name) ||
5572
- list.contains(options.fontNamesIgnoreCheck, name);
5573
- });
5649
+ var fontName = list.find(fontNames, self.isFontInstalled);
5574
5650
 
5575
5651
  $toolbar.find('.dropdown-fontname li a').each(function () {
5576
5652
  // always compare string to avoid creating another func.
@@ -5669,6 +5745,10 @@
5669
5745
  context.invoke('buttons.build', $toolbar, options.toolbar);
5670
5746
  }
5671
5747
 
5748
+ if (options.toolbarContainer) {
5749
+ $toolbar.appendTo(options.toolbarContainer);
5750
+ }
5751
+
5672
5752
  $note.on('summernote.keyup summernote.mouseup summernote.change', function () {
5673
5753
  context.invoke('buttons.updateCurrentStyle');
5674
5754
  });
@@ -5739,6 +5819,7 @@
5739
5819
  this.$dialog = ui.dialog({
5740
5820
  className: 'link-dialog',
5741
5821
  title: lang.link.insert,
5822
+ fade: options.dialogsFade,
5742
5823
  body: body,
5743
5824
  footer: footer
5744
5825
  }).render().appendTo($container);
@@ -5884,6 +5965,12 @@
5884
5965
  };
5885
5966
 
5886
5967
  this.update = function () {
5968
+ // Prevent focusing on editable when invoke('code') is executed
5969
+ if (!context.invoke('editor.hasFocus')) {
5970
+ this.hide();
5971
+ return;
5972
+ }
5973
+
5887
5974
  var rng = context.invoke('editor.createRange');
5888
5975
  if (rng.isCollapsed() && rng.isOnAnchor()) {
5889
5976
  var anchor = dom.ancestor(rng.sc, dom.isAnchor);
@@ -5938,6 +6025,7 @@
5938
6025
 
5939
6026
  this.$dialog = ui.dialog({
5940
6027
  title: lang.image.insert,
6028
+ fade: options.dialogsFade,
5941
6029
  body: body,
5942
6030
  footer: footer
5943
6031
  }).render().appendTo($container);
@@ -6083,6 +6171,7 @@
6083
6171
 
6084
6172
  this.$dialog = ui.dialog({
6085
6173
  title: lang.video.insert,
6174
+ fade: options.dialogsFade,
6086
6175
  body: body,
6087
6176
  footer: footer
6088
6177
  }).render().appendTo($container);
@@ -6180,7 +6269,6 @@
6180
6269
  return $video[0];
6181
6270
  };
6182
6271
 
6183
-
6184
6272
  this.show = function () {
6185
6273
  var text = context.invoke('editor.getSelectedText');
6186
6274
  context.invoke('editor.saveRange');
@@ -6252,27 +6340,15 @@
6252
6340
 
6253
6341
  this.createShortCutList = function () {
6254
6342
  var keyMap = options.keyMap[agent.isMac ? 'mac' : 'pc'];
6255
-
6256
- var $list = $('<div />');
6257
-
6258
- Object.keys(keyMap).forEach(function (keyString) {
6259
- var $row = $('<div class="help-list-item"/>');
6260
-
6261
- var command = keyMap[keyString];
6262
- var str = context.memo('help.' + command) ? context.memo('help.' + command) : command;
6263
- var $keyString = $('<label />').css({
6343
+ return Object.keys(keyMap).map(function (key) {
6344
+ var command = keyMap[key];
6345
+ var $row = $('<div><div class="help-list-item"/></div>');
6346
+ $row.append($('<label><kbd>' + key + '</kdb></label>').css({
6264
6347
  'width': 180,
6265
- 'max-width': 200,
6266
6348
  'margin-right': 10
6267
- }).html(keyString);
6268
- var $description = $('<span />').html(str);
6269
-
6270
- $row.html($keyString).append($description);
6271
-
6272
- $list.append($row);
6273
- });
6274
-
6275
- return $list.html();
6349
+ })).append($('<span/>').html(context.memo('help.' + command) || command));
6350
+ return $row.html();
6351
+ }).join('');
6276
6352
  };
6277
6353
 
6278
6354
  this.initialize = function () {
@@ -6280,7 +6356,7 @@
6280
6356
 
6281
6357
  var body = [
6282
6358
  '<p class="text-center">',
6283
- '<a href="//summernote.org/" target="_blank">Summernote 0.7.1</a> · ',
6359
+ '<a href="//summernote.org/" target="_blank">Summernote 0.8.1</a> · ',
6284
6360
  '<a href="//github.com/summernote/summernote" target="_blank">Project</a> · ',
6285
6361
  '<a href="//github.com/summernote/summernote/issues" target="_blank">Issues</a>',
6286
6362
  '</p>'
@@ -6288,6 +6364,7 @@
6288
6364
 
6289
6365
  this.$dialog = ui.dialog({
6290
6366
  title: lang.options.help,
6367
+ fade: options.dialogsFade,
6291
6368
  body: this.createShortCutList(),
6292
6369
  footer: body,
6293
6370
  callback: function ($node) {
@@ -6311,7 +6388,7 @@
6311
6388
  */
6312
6389
  this.showHelpDialog = function () {
6313
6390
  return $.Deferred(function (deferred) {
6314
- ui.onDialogHidden(self.$dialog, function () {
6391
+ ui.onDialogShown(self.$dialog, function () {
6315
6392
  context.triggerEvent('dialog.shown');
6316
6393
  deferred.resolve();
6317
6394
  });
@@ -6398,7 +6475,9 @@
6398
6475
  var self = this;
6399
6476
  var ui = $.summernote.ui;
6400
6477
 
6478
+ var POPOVER_DIST = 5;
6401
6479
  var hint = context.options.hint || [];
6480
+ var direction = context.options.hintDirection || 'bottom';
6402
6481
  var hints = $.isArray(hint) ? hint : [hint];
6403
6482
 
6404
6483
  this.events = {
@@ -6407,7 +6486,7 @@
6407
6486
  self.handleKeyup(e);
6408
6487
  }
6409
6488
  },
6410
- 'summernote.keydown' : function (we, e) {
6489
+ 'summernote.keydown': function (we, e) {
6411
6490
  self.handleKeydown(e);
6412
6491
  },
6413
6492
  'summernote.dialog.shown': function () {
@@ -6422,9 +6501,13 @@
6422
6501
  this.initialize = function () {
6423
6502
  this.lastWordRange = null;
6424
6503
  this.$popover = ui.popover({
6425
- className: 'note-hint-popover'
6504
+ className: 'note-hint-popover',
6505
+ hideArrow: true,
6506
+ direction: ''
6426
6507
  }).render().appendTo('body');
6427
6508
 
6509
+ this.$popover.hide();
6510
+
6428
6511
  this.$content = this.$popover.find('.popover-content');
6429
6512
 
6430
6513
  this.$content.on('click', '.note-hint-item', function () {
@@ -6481,13 +6564,17 @@
6481
6564
 
6482
6565
  this.replace = function () {
6483
6566
  var $item = this.$content.find('.note-hint-item.active');
6484
- var node = this.nodeFromItem($item);
6485
- this.lastWordRange.insertNode(node);
6486
- range.createFromNode(node).collapse().select();
6487
6567
 
6488
- this.lastWordRange = null;
6489
- this.hide();
6490
- context.invoke('editor.focus');
6568
+ if ($item.length) {
6569
+ var node = this.nodeFromItem($item);
6570
+ this.lastWordRange.insertNode(node);
6571
+ range.createFromNode(node).collapse().select();
6572
+
6573
+ this.lastWordRange = null;
6574
+ this.hide();
6575
+ context.invoke('editor.focus');
6576
+ }
6577
+
6491
6578
  };
6492
6579
 
6493
6580
  this.nodeFromItem = function ($item) {
@@ -6572,10 +6659,8 @@
6572
6659
 
6573
6660
  var bnd = func.rect2bnd(list.last(wordRange.getClientRects()));
6574
6661
  if (bnd) {
6575
- this.$popover.css({
6576
- left: bnd.left,
6577
- top: bnd.top + bnd.height
6578
- }).hide();
6662
+
6663
+ this.$popover.hide();
6579
6664
 
6580
6665
  this.lastWordRange = wordRange;
6581
6666
 
@@ -6584,6 +6669,20 @@
6584
6669
  self.createGroup(idx, keyword).appendTo(self.$content);
6585
6670
  }
6586
6671
  });
6672
+
6673
+ // set position for popover after group is created
6674
+ if (direction === 'top') {
6675
+ this.$popover.css({
6676
+ left: bnd.left,
6677
+ top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST
6678
+ });
6679
+ } else {
6680
+ this.$popover.css({
6681
+ left: bnd.left,
6682
+ top: bnd.top + bnd.height + POPOVER_DIST
6683
+ });
6684
+ }
6685
+
6587
6686
  }
6588
6687
  } else {
6589
6688
  this.hide();
@@ -6602,7 +6701,7 @@
6602
6701
 
6603
6702
 
6604
6703
  $.summernote = $.extend($.summernote, {
6605
- version: '0.7.1',
6704
+ version: '0.8.1',
6606
6705
  ui: ui,
6607
6706
 
6608
6707
  plugins: {},
@@ -6622,7 +6721,7 @@
6622
6721
  'autoLink': AutoLink,
6623
6722
  'autoSync': AutoSync,
6624
6723
  'placeholder': Placeholder,
6625
- 'buttons' : Buttons,
6724
+ 'buttons': Buttons,
6626
6725
  'toolbar': Toolbar,
6627
6726
  'linkDialog': LinkDialog,
6628
6727
  'linkPopover': LinkPopover,
@@ -6713,6 +6812,7 @@
6713
6812
  },
6714
6813
 
6715
6814
  dialogsInBody: false,
6815
+ dialogsFade: false,
6716
6816
 
6717
6817
  maximumImageFileSize: null,
6718
6818
 
@@ -6796,44 +6896,44 @@
6796
6896
  }
6797
6897
  },
6798
6898
  icons: {
6799
- 'align': 'fa fa-align-left',
6800
- 'alignCenter': 'fa fa-align-center',
6801
- 'alignJustify': 'fa fa-align-justify',
6802
- 'alignLeft': 'fa fa-align-left',
6803
- 'alignRight': 'fa fa-align-right',
6804
- 'indent': 'fa fa-indent',
6805
- 'outdent': 'fa fa-outdent',
6806
- 'arrowsAlt': 'fa fa-arrows-alt',
6807
- 'bold': 'fa fa-bold',
6808
- 'caret': 'caret',
6809
- 'circle': 'fa fa-circle',
6810
- 'close': 'fa fa-close',
6811
- 'code': 'fa fa-code',
6812
- 'eraser': 'fa fa-eraser',
6813
- 'font': 'fa fa-font',
6814
- 'frame': 'fa fa-frame',
6815
- 'italic': 'fa fa-italic',
6816
- 'link': 'fa fa-link',
6817
- 'unlink': 'fa fa-chain-broken',
6818
- 'magic': 'fa fa-magic',
6819
- 'menuCheck': 'fa fa-check',
6820
- 'minus': 'fa fa-minus',
6821
- 'orderedlist': 'fa fa-list-ol',
6822
- 'pencil': 'fa fa-pencil',
6823
- 'picture': 'fa fa-picture-o',
6824
- 'question': 'fa fa-question',
6825
- 'redo': 'fa fa-repeat',
6826
- 'square': 'fa fa-square',
6827
- 'strikethrough': 'fa fa-strikethrough',
6828
- 'subscript': 'fa fa-subscript',
6829
- 'superscript': 'fa fa-superscript',
6830
- 'table': 'fa fa-table',
6831
- 'textHeight': 'fa fa-text-height',
6832
- 'trash': 'fa fa-trash',
6833
- 'underline': 'fa fa-underline',
6834
- 'undo': 'fa fa-undo',
6835
- 'unorderedlist': 'fa fa-list-ul',
6836
- 'video': 'fa fa-youtube-play'
6899
+ 'align': 'note-icon-align',
6900
+ 'alignCenter': 'note-icon-align-center',
6901
+ 'alignJustify': 'note-icon-align-justify',
6902
+ 'alignLeft': 'note-icon-align-left',
6903
+ 'alignRight': 'note-icon-align-right',
6904
+ 'indent': 'note-icon-align-indent',
6905
+ 'outdent': 'note-icon-align-outdent',
6906
+ 'arrowsAlt': 'note-icon-arrows-alt',
6907
+ 'bold': 'note-icon-bold',
6908
+ 'caret': 'note-icon-caret',
6909
+ 'circle': 'note-icon-circle',
6910
+ 'close': 'note-icon-close',
6911
+ 'code': 'note-icon-code',
6912
+ 'eraser': 'note-icon-eraser',
6913
+ 'font': 'note-icon-font',
6914
+ 'frame': 'note-icon-frame',
6915
+ 'italic': 'note-icon-italic',
6916
+ 'link': 'note-icon-link',
6917
+ 'unlink': 'note-icon-chain-broken',
6918
+ 'magic': 'note-icon-magic',
6919
+ 'menuCheck': 'note-icon-check',
6920
+ 'minus': 'note-icon-minus',
6921
+ 'orderedlist': 'note-icon-orderedlist',
6922
+ 'pencil': 'note-icon-pencil',
6923
+ 'picture': 'note-icon-picture',
6924
+ 'question': 'note-icon-question',
6925
+ 'redo': 'note-icon-redo',
6926
+ 'square': 'note-icon-square',
6927
+ 'strikethrough': 'note-icon-strikethrough',
6928
+ 'subscript': 'note-icon-subscript',
6929
+ 'superscript': 'note-icon-superscript',
6930
+ 'table': 'note-icon-table',
6931
+ 'textHeight': 'note-icon-text-height',
6932
+ 'trash': 'note-icon-trash',
6933
+ 'underline': 'note-icon-underline',
6934
+ 'undo': 'note-icon-undo',
6935
+ 'unorderedlist': 'note-icon-unorderedlist',
6936
+ 'video': 'note-icon-video'
6837
6937
  }
6838
6938
  }
6839
6939
  });