activeadmin_trumbowyg 1.1.0 → 1.2.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.
Files changed (132) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -5
  3. data/Rakefile +11 -0
  4. data/app/assets/fonts/trumbowyg/icons.svg +1 -1
  5. data/app/assets/javascripts/activeadmin/trumbowyg/langs/az.js +63 -0
  6. data/app/assets/javascripts/activeadmin/trumbowyg/langs/az.min.js +9 -0
  7. data/app/assets/javascripts/activeadmin/trumbowyg/langs/ca.js +30 -13
  8. data/app/assets/javascripts/activeadmin/trumbowyg/langs/ca.min.js +8 -5
  9. data/app/assets/javascripts/activeadmin/trumbowyg/langs/cs.js +11 -2
  10. data/app/assets/javascripts/activeadmin/trumbowyg/langs/cs.min.js +1 -1
  11. data/app/assets/javascripts/activeadmin/trumbowyg/langs/da.js +1 -1
  12. data/app/assets/javascripts/activeadmin/trumbowyg/langs/de.js +11 -2
  13. data/app/assets/javascripts/activeadmin/trumbowyg/langs/de.min.js +3 -3
  14. data/app/assets/javascripts/activeadmin/trumbowyg/langs/es_ar.js +1 -1
  15. data/app/assets/javascripts/activeadmin/trumbowyg/langs/et.js +7 -7
  16. data/app/assets/javascripts/activeadmin/trumbowyg/langs/fa.js +1 -1
  17. data/app/assets/javascripts/activeadmin/trumbowyg/langs/fi.js +1 -1
  18. data/app/assets/javascripts/activeadmin/trumbowyg/langs/fr.js +3 -0
  19. data/app/assets/javascripts/activeadmin/trumbowyg/langs/fr.min.js +1 -1
  20. data/app/assets/javascripts/activeadmin/trumbowyg/langs/he.js +1 -1
  21. data/app/assets/javascripts/activeadmin/trumbowyg/langs/hu.js +3 -0
  22. data/app/assets/javascripts/activeadmin/trumbowyg/langs/hu.min.js +1 -1
  23. data/app/assets/javascripts/activeadmin/trumbowyg/langs/id.js +1 -1
  24. data/app/assets/javascripts/activeadmin/trumbowyg/langs/it.js +4 -1
  25. data/app/assets/javascripts/activeadmin/trumbowyg/langs/it.min.js +1 -1
  26. data/app/assets/javascripts/activeadmin/trumbowyg/langs/lt.js +1 -1
  27. data/app/assets/javascripts/activeadmin/trumbowyg/langs/mn.js +39 -39
  28. data/app/assets/javascripts/activeadmin/trumbowyg/langs/{no_nb.js → nb.js} +22 -8
  29. data/app/assets/javascripts/activeadmin/trumbowyg/langs/nb.min.js +15 -0
  30. data/app/assets/javascripts/activeadmin/trumbowyg/langs/pl.js +1 -1
  31. data/app/assets/javascripts/activeadmin/trumbowyg/langs/pt.js +2 -2
  32. data/app/assets/javascripts/activeadmin/trumbowyg/langs/pt_br.js +2 -2
  33. data/app/assets/javascripts/activeadmin/trumbowyg/langs/rs.js +1 -1
  34. data/app/assets/javascripts/activeadmin/trumbowyg/langs/rs_latin.js +1 -1
  35. data/app/assets/javascripts/activeadmin/trumbowyg/langs/sl.js +10 -6
  36. data/app/assets/javascripts/activeadmin/trumbowyg/langs/sl.min.js +2 -1
  37. data/app/assets/javascripts/activeadmin/trumbowyg/langs/sq.js +2 -2
  38. data/app/assets/javascripts/activeadmin/trumbowyg/langs/sv.js +1 -0
  39. data/app/assets/javascripts/activeadmin/trumbowyg/langs/sv.min.js +1 -1
  40. data/app/assets/javascripts/activeadmin/trumbowyg/langs/th.js +33 -33
  41. data/app/assets/javascripts/activeadmin/trumbowyg/langs/tr.js +5 -3
  42. data/app/assets/javascripts/activeadmin/trumbowyg/langs/tr.min.js +1 -1
  43. data/app/assets/javascripts/activeadmin/trumbowyg/langs/zh_cn.js +1 -1
  44. data/app/assets/javascripts/activeadmin/trumbowyg/langs/zh_tw.js +1 -1
  45. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/allowtagsfrompaste/trumbowyg.allowtagsfrompaste.min.js +11 -0
  46. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/base64/trumbowyg.base64.js +28 -1
  47. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/base64/trumbowyg.base64.min.js +8 -1
  48. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.min.js +11 -0
  49. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/colors/trumbowyg.colors.js +39 -2
  50. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/colors/trumbowyg.colors.min.js +10 -1
  51. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/colors/ui/sass/trumbowyg.colors.scss +3 -3
  52. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/colors/ui/trumbowyg.colors.css +45 -40
  53. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/colors/ui/trumbowyg.colors.min.css +1 -1
  54. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/emoji/trumbowyg.emoji.js +916 -848
  55. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/emoji/trumbowyg.emoji.min.js +9 -1
  56. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/emoji/ui/sass/trumbowyg.emoji.scss +3 -3
  57. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/emoji/ui/trumbowyg.emoji.css +23 -18
  58. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/emoji/ui/trumbowyg.emoji.min.css +1 -1
  59. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/fontfamily/trumbowyg.fontfamily.js +22 -7
  60. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/fontfamily/trumbowyg.fontfamily.min.js +1 -1
  61. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/fontsize/trumbowyg.fontsize.js +100 -8
  62. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/fontsize/trumbowyg.fontsize.min.js +1 -1
  63. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/giphy/trumbowyg.giphy.js +251 -172
  64. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/giphy/trumbowyg.giphy.min.js +1 -1
  65. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/giphy/ui/sass/trumbowyg.giphy.scss +17 -16
  66. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/giphy/ui/trumbowyg.giphy.css +60 -47
  67. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/giphy/ui/trumbowyg.giphy.min.css +2 -2
  68. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/highlight/trumbowyg.highlight.js +24 -4
  69. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/highlight/trumbowyg.highlight.min.js +1 -1
  70. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/highlight/ui/sass/trumbowyg.highlight.scss +12 -12
  71. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/highlight/ui/trumbowyg.highlight.css +13 -10
  72. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/highlight/ui/trumbowyg.highlight.min.css +2 -2
  73. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/history/trumbowyg.history.js +6 -61
  74. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/history/trumbowyg.history.min.js +8 -1
  75. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/indent/trumbowyg.indent.js +31 -2
  76. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/indent/trumbowyg.indent.min.js +9 -1
  77. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/insertaudio/trumbowyg.insertaudio.js +18 -0
  78. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/insertaudio/trumbowyg.insertaudio.min.js +8 -1
  79. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/lineheight/trumbowyg.lineheight.js +50 -5
  80. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/lineheight/trumbowyg.lineheight.min.js +1 -1
  81. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/mathml/trumbowyg.mathml.js +97 -50
  82. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/mathml/trumbowyg.mathml.min.js +8 -1
  83. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/mathml/ui/sass/trumbowyg.mathml.scss +31 -26
  84. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/mathml/ui/trumbowyg.mathml.css +29 -21
  85. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/mathml/ui/trumbowyg.mathml.min.css +2 -2
  86. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/mention/trumbowyg.mention.js +12 -0
  87. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/mention/trumbowyg.mention.min.js +10 -1
  88. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/mention/ui/sass/trumbowyg.mention.scss +3 -3
  89. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/mention/ui/trumbowyg.mention.css +16 -17
  90. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/mention/ui/trumbowyg.mention.min.css +2 -2
  91. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/noembed/trumbowyg.noembed.js +51 -20
  92. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/noembed/trumbowyg.noembed.min.js +8 -1
  93. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/pasteembed/trumbowyg.pasteembed.js +36 -53
  94. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/pasteembed/trumbowyg.pasteembed.min.js +10 -1
  95. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/pasteimage/trumbowyg.pasteimage.min.js +9 -0
  96. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/preformatted/trumbowyg.preformatted.js +12 -0
  97. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/preformatted/trumbowyg.preformatted.min.js +8 -1
  98. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/resizimg/trumbowyg.resizimg.min.js +3 -1
  99. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/ruby/trumbowyg.ruby.js +20 -0
  100. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/ruby/trumbowyg.ruby.min.js +10 -1
  101. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/specialchars/trumbowyg.specialchars.js +18 -0
  102. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/specialchars/trumbowyg.specialchars.min.js +8 -1
  103. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/specialchars/ui/sass/trumbowyg.specialchars.scss +3 -3
  104. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/specialchars/ui/trumbowyg.specialchars.css +25 -19
  105. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/specialchars/ui/trumbowyg.specialchars.min.css +1 -1
  106. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/speechrecognition/trumbowyg.speechrecognition.js +198 -0
  107. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/speechrecognition/trumbowyg.speechrecognition.min.js +11 -0
  108. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/table/trumbowyg.table.js +1436 -158
  109. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/table/trumbowyg.table.min.js +11 -1
  110. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/table/ui/sass/trumbowyg.table.scss +157 -32
  111. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/table/ui/trumbowyg.table.css +143 -22
  112. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/table/ui/trumbowyg.table.min.css +2 -2
  113. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/template/trumbowyg.template.js +9 -0
  114. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/template/trumbowyg.template.min.js +1 -1
  115. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/tenor/trumbowyg.tenor.js +319 -0
  116. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/tenor/trumbowyg.tenor.min.js +1 -0
  117. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/tenor/ui/sass/trumbowyg.tenor.scss +124 -0
  118. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/tenor/ui/trumbowyg.tenor.css +119 -0
  119. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/tenor/ui/trumbowyg.tenor.min.css +2 -0
  120. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/upload/trumbowyg.upload.js +119 -76
  121. data/app/assets/javascripts/activeadmin/trumbowyg/plugins/upload/trumbowyg.upload.min.js +13 -1
  122. data/app/assets/javascripts/activeadmin/trumbowyg/trumbowyg.js +126 -80
  123. data/app/assets/javascripts/activeadmin/trumbowyg/trumbowyg.min.js +2 -12
  124. data/app/assets/stylesheets/activeadmin/_trumbowyg_input.scss +3 -1
  125. data/app/assets/stylesheets/activeadmin/trumbowyg/trumbowyg.css +776 -0
  126. data/app/assets/stylesheets/activeadmin/trumbowyg/trumbowyg.min.css +3 -0
  127. data/app/assets/stylesheets/activeadmin/trumbowyg/trumbowyg.min.css.map +1 -0
  128. data/lib/activeadmin/trumbowyg/version.rb +1 -1
  129. data/lib/tasks/trumbowyg.rake +2 -2
  130. metadata +18 -21
  131. data/app/assets/javascripts/activeadmin/trumbowyg/langs/no_nb.min.js +0 -10
  132. data/app/assets/stylesheets/activeadmin/trumbowyg/trumbowyg.scss +0 -836
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Trumbowyg v2.25.1 - A lightweight WYSIWYG editor
2
+ * Trumbowyg v2.31.0 - A lightweight WYSIWYG editor
3
3
  * Trumbowyg core file
4
4
  * ------------------------
5
- * @link http://alex-d.github.io/Trumbowyg
5
+ * @link https://alex-d.github.io/Trumbowyg/
6
6
  * @license MIT
7
7
  * @author Alexandre Demode (Alex-D)
8
8
  * Twitter : @AlexandreDemode
@@ -43,6 +43,9 @@ jQuery.trumbowyg = {
43
43
  createLink: 'Insert link',
44
44
  unlink: 'Remove link',
45
45
 
46
+ _self: 'Same tab (default)',
47
+ _blank: 'New tab',
48
+
46
49
  justifyLeft: 'Align Left',
47
50
  justifyCenter: 'Align Center',
48
51
  justifyRight: 'Align Right',
@@ -126,7 +129,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
126
129
 
127
130
  urlProtocol: false,
128
131
  minimalLinks: false,
129
- defaultLinkTarget: undefined,
132
+ linkTargets: ['_self', '_blank'],
130
133
 
131
134
  svgPath: null
132
135
  },
@@ -206,7 +209,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
206
209
  };
207
210
 
208
211
  // @param: editorElem is the DOM element
209
- var Trumbowyg = function (editorElem, options) {
212
+ var Trumbowyg = function (editorElem, options) { // jshint ignore:line
210
213
  var t = this,
211
214
  trumbowygIconsId = 'trumbowyg-icons',
212
215
  $trumbowyg = $.trumbowyg;
@@ -253,26 +256,27 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
253
256
  console.warn('You must define svgPath: https://goo.gl/CfTY9U'); // jshint ignore:line
254
257
  } else if (!$trumbowyg.svgAbsoluteUseHref) {
255
258
  var div = t.doc.createElement('div');
259
+ div.style.width = '0';
260
+ div.style.height = '0';
261
+ div.style.overflow = 'hidden';
262
+ div.style.visibility = 'hidden';
256
263
  div.id = trumbowygIconsId;
257
264
  t.doc.body.insertBefore(div, t.doc.body.childNodes[0]);
258
- $.ajax({
259
- async: true,
260
- type: 'GET',
261
- contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
262
- dataType: 'xml',
263
- crossDomain: true,
264
- url: svgPathOption,
265
- data: null,
266
- beforeSend: null,
267
- complete: null,
268
- success: function (data) {
269
- div.innerHTML = new XMLSerializer().serializeToString(data.documentElement);
265
+ fetch(svgPathOption, {
266
+ method: 'GET',
267
+ headers: {
268
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
270
269
  }
270
+ }).then((response) => {
271
+ response.text()
272
+ .then((svg) => {
273
+ div.innerHTML = svg;
274
+ });
271
275
  });
272
276
  }
273
277
  }
274
278
 
275
- var baseHref = !!t.doc.querySelector('base') ? window.location.href.split(/[?#]/)[0] : '';
279
+ var baseHref = !!t.doc.querySelector('base') ? window.location.href.replace(window.location.hash, '') : '';
276
280
  t.svgPath = $trumbowyg.svgAbsoluteUseHref ? svgPathOption : baseHref;
277
281
 
278
282
 
@@ -295,7 +299,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
295
299
  t.btnsDef = {
296
300
  viewHTML: {
297
301
  fn: 'toggle',
298
- class: 'trumbowyg-not-disable',
302
+ class: 'trumbowyg-not-disable'
299
303
  },
300
304
 
301
305
  undo: {
@@ -482,7 +486,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
482
486
 
483
487
  init: function () {
484
488
  var t = this;
485
- t.height = t.$ta.height();
489
+ t.height = t.$ta.outerHeight() - 39; // Remove button pane height
486
490
 
487
491
  t.initPlugins();
488
492
 
@@ -533,15 +537,20 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
533
537
  class: prefix + 'box ' + prefix + 'editor-visible ' + prefix + t.o.lang + ' trumbowyg'
534
538
  });
535
539
 
540
+ t.$edBox = $('<div/>', {
541
+ class: prefix + 'editor-box'
542
+ });
543
+
536
544
  // $ta = Textarea
537
545
  // $ed = Editor
538
546
  t.isTextarea = t.$ta.is('textarea');
539
547
  if (t.isTextarea) {
540
548
  html = t.$ta.val();
541
- t.$ed = $('<div/>');
549
+ t.$ed = $('<div/>')
550
+ .appendTo(t.$edBox);
542
551
  t.$box
543
552
  .insertAfter(t.$ta)
544
- .append(t.$ed, t.$ta);
553
+ .append(t.$edBox, t.$ta);
545
554
  } else {
546
555
  t.$ed = t.$ta;
547
556
  html = t.$ed.html();
@@ -553,7 +562,8 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
553
562
 
554
563
  t.$box
555
564
  .insertAfter(t.$ed)
556
- .append(t.$ta, t.$ed);
565
+ .append(t.$ta, t.$edBox);
566
+ t.$edBox.append(t.$ed);
557
567
  t.syncCode();
558
568
  }
559
569
 
@@ -587,13 +597,8 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
587
597
  t.$ed.addClass(prefix + 'reset-css');
588
598
  }
589
599
 
590
- if (!t.o.autogrow) {
591
- t.$ta.add(t.$ed).css({
592
- height: t.height
593
- });
594
- }
595
-
596
600
  t.semanticCode();
601
+ t.applyTagClasses();
597
602
 
598
603
  if (t.o.autogrowOnEnter) {
599
604
  t.$ed.addClass(prefix + 'autogrow-on-enter');
@@ -658,7 +663,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
658
663
  if ((e.ctrlKey || e.metaKey) && (keyCode === 89 || keyCode === 90)) {
659
664
  t.semanticCode(false, true);
660
665
  t.$c.trigger('tbwchange');
661
- } else if (!ctrl && keyCode !== 17) {
666
+ } else if (!ctrl && keyCode !== 16 && keyCode !== 17) {
662
667
  var compositionEndIE = t.isIE ? e.type === 'compositionend' : true;
663
668
  t.semanticCode(false, compositionEndIE && keyCode === 13);
664
669
  t.$c.trigger('tbwchange');
@@ -670,6 +675,14 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
670
675
  ctrl = false;
671
676
  }, 50);
672
677
  })
678
+ .on('input', function (e) {
679
+ // Trigger change event when spelling fixes applied
680
+ var event = e.originalEvent;
681
+ if (typeof event === 'object' && (event.inputType === 'insertReplacementText' ||
682
+ (event.inputType === 'insertText' && event.data === null))) {
683
+ t.$c.trigger('tbwchange');
684
+ }
685
+ })
673
686
  .on('mouseup keydown keyup', function (e) {
674
687
  if ((!e.ctrlKey && !e.metaKey) || e.altKey) {
675
688
  setTimeout(function () { // "hold on" to the ctrl key for 50ms
@@ -694,13 +707,13 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
694
707
  t.autogrowOnEnterWasFocused = true;
695
708
  t.autogrowEditorOnEnter();
696
709
  } else if (!t.o.autogrow) {
697
- t.$ed.css({height: t.$ed.css('min-height')});
710
+ t.$edBox.css({height: t.$edBox.css('min-height')});
698
711
  t.$c.trigger('tbwresize');
699
712
  }
700
713
  }
701
714
  })
702
715
  .on('keyup focus', function () {
703
- if (!t.$ta.val().match(/<.*>/) && !t.$ed.html().match(/<.*>/)) {
716
+ if (!t.$ta.val().match(/<.*>/) && !t.$ed.html().match(/<.*>/)) {
704
717
  setTimeout(function () {
705
718
  var block = t.isIE ? '<p>' : 'p';
706
719
  t.doc.execCommand('formatBlock', false, block);
@@ -775,13 +788,13 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
775
788
  var t = this;
776
789
  t.$ed.removeClass('autogrow-on-enter');
777
790
  var oldHeight = t.$ed[0].clientHeight;
778
- t.$ed.height('auto');
791
+ t.$edBox.height('auto');
779
792
  var totalHeight = t.$ed[0].scrollHeight;
780
793
  t.$ed.addClass('autogrow-on-enter');
781
794
  if (oldHeight !== totalHeight) {
782
- t.$ed.height(oldHeight);
795
+ t.$edBox.height(oldHeight);
783
796
  setTimeout(function () {
784
- t.$ed.css({height: totalHeight});
797
+ t.$edBox.css({height: totalHeight});
785
798
  t.$c.trigger('tbwresize');
786
799
  }, 0);
787
800
  }
@@ -798,7 +811,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
798
811
  });
799
812
 
800
813
  $.each(t.o.btns, function (i, btnGrp) {
801
- if (!$.isArray(btnGrp)) {
814
+ if (!Array.isArray(btnGrp)) {
802
815
  btnGrp = [btnGrp];
803
816
  }
804
817
 
@@ -824,7 +837,8 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
824
837
 
825
838
 
826
839
  // Build a button and his action
827
- buildBtn: function (btnName) { // btnName is name of the button
840
+ // @param btnName The name of the button
841
+ buildBtn: function (btnName) { // jshint ignore:line
828
842
  var t = this,
829
843
  prefix = t.o.prefix,
830
844
  btn = t.btnsDef[btnName],
@@ -1035,7 +1049,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1035
1049
  );
1036
1050
  } else {
1037
1051
  t.$box.after(
1038
- t.$ed
1052
+ t.$edBox
1039
1053
  .css({height: ''})
1040
1054
  .removeClass(prefix + 'editor')
1041
1055
  .removeAttr('contenteditable')
@@ -1060,6 +1074,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1060
1074
 
1061
1075
  // Empty the editor
1062
1076
  empty: function () {
1077
+ this.doc.execCommand('insertHTML', false, '');
1063
1078
  this.$ta.val('');
1064
1079
  this.syncCode(true);
1065
1080
  },
@@ -1175,17 +1190,17 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1175
1190
  }
1176
1191
 
1177
1192
  if (t.o.autogrow) {
1178
- t.height = t.$ed.height();
1193
+ t.height = t.$edBox.height();
1179
1194
  if (t.height !== t.$ta.css('height')) {
1180
1195
  t.$ta.css({height: t.height});
1181
1196
  t.$c.trigger('tbwresize');
1182
1197
  }
1183
1198
  }
1184
1199
  if (t.o.autogrowOnEnter) {
1185
- t.$ed.height('auto');
1186
- var totalHeight = t.autogrowOnEnterWasFocused ? t.$ed[0].scrollHeight : t.$ed.css('min-height');
1200
+ t.$edBox.height('auto');
1201
+ var totalHeight = t.autogrowOnEnterWasFocused ? t.$edBox[0].scrollHeight : t.$edBox.css('min-height');
1187
1202
  if (totalHeight !== t.$ta.css('height')) {
1188
- t.$ed.css({height: totalHeight});
1203
+ t.$edBox.css({height: totalHeight});
1189
1204
  t.$c.trigger('tbwresize');
1190
1205
  }
1191
1206
  }
@@ -1260,7 +1275,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1260
1275
  return;
1261
1276
  }
1262
1277
 
1263
- if(revert) {
1278
+ if (revert) {
1264
1279
  oldTag = newTag;
1265
1280
  newTag = tmpTag;
1266
1281
  }
@@ -1284,7 +1299,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1284
1299
  }
1285
1300
  $newTag.html($oldTag.html());
1286
1301
  $oldTag.remove();
1287
- if(resetRange === true) {
1302
+ if (resetRange === true) {
1288
1303
  t.range.selectNodeContents($newTag.get(0));
1289
1304
  t.range.collapse(false);
1290
1305
  }
@@ -1300,7 +1315,8 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1300
1315
  text = new XMLSerializer().serializeToString(selectedRange.cloneContents()) || selectedRange + '',
1301
1316
  url,
1302
1317
  title,
1303
- target;
1318
+ target,
1319
+ linkDefaultTarget = t.o.linkTargets[0];
1304
1320
 
1305
1321
  while (['A', 'DIV'].indexOf(node.nodeName) < 0) {
1306
1322
  node = node.parentNode;
@@ -1312,7 +1328,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1312
1328
  url = $a.attr('href');
1313
1329
  if (!t.o.minimalLinks) {
1314
1330
  title = $a.attr('title');
1315
- target = $a.attr('target') || t.o.defaultLinkTarget;
1331
+ target = $a.attr('target') || linkDefaultTarget;
1316
1332
  }
1317
1333
  var range = t.doc.createRange();
1318
1334
  range.selectNode(node);
@@ -1334,6 +1350,12 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1334
1350
  }
1335
1351
  };
1336
1352
  if (!t.o.minimalLinks) {
1353
+ var targetOptions = t.o.linkTargets.reduce(function (options, optionValue) {
1354
+ options[optionValue] = t.lang[optionValue];
1355
+
1356
+ return options;
1357
+ }, {});
1358
+
1337
1359
  $.extend(options, {
1338
1360
  title: {
1339
1361
  label: t.lang.title,
@@ -1341,7 +1363,8 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1341
1363
  },
1342
1364
  target: {
1343
1365
  label: t.lang.target,
1344
- value: target
1366
+ value: target,
1367
+ options: targetOptions
1345
1368
  }
1346
1369
  });
1347
1370
  }
@@ -1357,8 +1380,8 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1357
1380
  if (v.title) {
1358
1381
  link.attr('title', v.title);
1359
1382
  }
1360
- if (v.target || t.o.defaultLinkTarget) {
1361
- link.attr('target', v.target || t.o.defaultLinkTarget);
1383
+ if (v.target || linkDefaultTarget) {
1384
+ link.attr('target', v.target || linkDefaultTarget);
1362
1385
  }
1363
1386
  t.range.deleteContents();
1364
1387
  t.range.insertNode(link[0]);
@@ -1468,6 +1491,13 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1468
1491
  t.$c.trigger('tbw' + (isFullscreen ? 'open' : 'close') + 'fullscreen');
1469
1492
  },
1470
1493
 
1494
+ applyTagClasses: function () {
1495
+ var t = this;
1496
+ for (const tag of Object.keys(t.o.tagClasses)) {
1497
+ $(tag, t.$ed).addClass(t.o.tagClasses[tag]);
1498
+ }
1499
+ t.syncCode();
1500
+ },
1471
1501
 
1472
1502
  /*
1473
1503
  * Call method of trumbowyg if exist
@@ -1482,7 +1512,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1482
1512
  t.$ed.focus();
1483
1513
  }
1484
1514
 
1485
- if(cmd === 'strikethrough' && t.o.semantic) {
1515
+ if (cmd === 'strikethrough' && t.o.semantic) {
1486
1516
  t.semanticTag('strike', t.o.semanticKeepAttributes, true); // browsers cannot undo e.g. <del> as they expect <strike>
1487
1517
  }
1488
1518
 
@@ -1507,19 +1537,6 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1507
1537
 
1508
1538
  t.syncCode();
1509
1539
  t.semanticCode(false, true);
1510
- try {
1511
- var listId = window.getSelection().focusNode;
1512
- if(!$(window.getSelection().focusNode.parentNode).hasClass('trumbowyg-editor')){
1513
- listId = window.getSelection().focusNode.parentNode;
1514
- }
1515
- var classes = t.o.tagClasses[param];
1516
- if (classes) {
1517
- $(listId).addClass(classes);
1518
- }
1519
- } catch (e) {
1520
-
1521
- }
1522
-
1523
1540
  }
1524
1541
 
1525
1542
  if (cmd !== 'dropdown') {
@@ -1527,6 +1544,11 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1527
1544
  t.$c.trigger('tbwchange');
1528
1545
  }
1529
1546
  }
1547
+
1548
+ try {
1549
+ t.applyTagClasses();
1550
+ } catch (e) {
1551
+ }
1530
1552
  },
1531
1553
 
1532
1554
 
@@ -1559,6 +1581,11 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1559
1581
  zIndex: 99999
1560
1582
  }).appendTo($(t.doc.body));
1561
1583
 
1584
+ var darkClass = prefix + 'dark';
1585
+ if (t.$c.parents('.' + darkClass).length !== 0) {
1586
+ $modal.addClass(darkClass);
1587
+ }
1588
+
1562
1589
  // Click on overlay close modal by cancelling them
1563
1590
  t.$overlay.one('click', function () {
1564
1591
  $modal.trigger(CANCEL_EVENT);
@@ -1598,7 +1625,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1598
1625
  .css({
1599
1626
  top: '-' + t.$btnPane.outerHeight(),
1600
1627
  opacity: 0,
1601
- paddingBottom: buildForm ? null : '5%',
1628
+ paddingBottom: buildForm ? null : '5%'
1602
1629
  })
1603
1630
  .appendTo($modal)
1604
1631
  .animate({
@@ -1647,6 +1674,11 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1647
1674
  var t = this,
1648
1675
  prefix = t.o.prefix;
1649
1676
 
1677
+ // Prevent multiple calls when having multiple editors in the same page
1678
+ if (!t.$btnPane.hasClass(prefix + 'disable')) {
1679
+ return;
1680
+ }
1681
+
1650
1682
  t.$btnPane.removeClass(prefix + 'disable');
1651
1683
  t.$overlay.off();
1652
1684
 
@@ -1682,17 +1714,31 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1682
1714
  }).join(' ');
1683
1715
 
1684
1716
  if (typeof field.type === 'function') {
1685
- if (!field.name) {
1686
- field.name = n;
1687
- }
1688
- html += field.type(field, fieldId, prefix, lg);
1717
+ if (!field.name) {
1718
+ field.name = n;
1719
+ }
1720
+
1721
+ html += field.type(field, fieldId, prefix, lg);
1722
+
1723
+ return;
1724
+ }
1725
+
1726
+ html += '<div class="' + prefix + 'input-row">';
1727
+ html += '<div class="' + prefix + 'input-infos"><label for="' + fieldId + '"><span>' + (lg[l] ? lg[l] : l) + '</span></label></div>';
1728
+ html += '<div class="' + prefix + 'input-html">';
1729
+
1730
+ if ($.isPlainObject(field.options)) {
1731
+ html += '<select id="' + fieldId + '" name="' + n + '">';
1732
+ html += Object.keys(field.options).map((optionValue) => {
1733
+ return '<option value="' + optionValue + '" ' + (optionValue === field.value ? 'selected' : '') + '>' + field.options[optionValue] + '</option>';
1734
+ }).join('');
1735
+ html += '</select>';
1689
1736
  } else {
1690
- html += '<div class="' + prefix + 'input-row">' +
1691
- '<div class="' + prefix + 'input-infos"><label for="' + fieldId + '"><span>' + (lg[l] ? lg[l] : l) + '</span></label></div>' +
1692
- '<div class="' + prefix + 'input-html"><input id="' + fieldId + '" type="' + (field.type || 'text') + '" name="' + n + '" ' + attr;
1693
- html += (field.type === 'checkbox' && field.value ? ' checked="checked"' : '') + ' value="' + (field.value || '').replace(/"/g, '&quot;') + '"></div>';
1694
- html += '</div>';
1737
+ html += '<input id="' + fieldId + '" type="' + (field.type || 'text') + '" name="' + n + '" ' + attr;
1738
+ html += (field.type === 'checkbox' && field.value ? ' checked="checked"' : '') + ' value="' + (field.value || '').replace(/"/g, '&quot;') + '">';
1695
1739
  }
1740
+
1741
+ html += '</div></div>';
1696
1742
  });
1697
1743
 
1698
1744
  return t.openModal(title, html)
@@ -1715,7 +1761,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1715
1761
  values[n] = $field.filter(':checked').val();
1716
1762
  break;
1717
1763
  default:
1718
- values[n] = $.trim($field.val());
1764
+ values[n] = $field.val().trim();
1719
1765
  break;
1720
1766
  }
1721
1767
  // Validate value
@@ -1750,13 +1796,11 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1750
1796
  $row = $field.closest('.' + prefix + 'input-row');
1751
1797
 
1752
1798
  $field
1753
- .on('change keyup', function () {
1799
+ .one('change keyup', function () {
1754
1800
  $row.removeClass(prefix + 'input-error');
1755
- setTimeout(function () {
1756
- $row.find('.' + spanErrorClass).remove();
1757
- }, 150);
1758
1801
  });
1759
1802
 
1803
+ $row.find('.' + spanErrorClass).remove();
1760
1804
  $row
1761
1805
  .addClass(prefix + 'input-error')
1762
1806
  .find('.' + prefix + 'input-infos label')
@@ -1920,7 +1964,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1920
1964
  prefix = t.o.prefix,
1921
1965
  activeClasses = prefix + 'active-button ' + prefix + 'active',
1922
1966
  originalIconClass = prefix + 'original-icon',
1923
- tags = t.getTagsRecursive(t.doc.getSelection().focusNode);
1967
+ tags = t.getTagsRecursive(t.doc.getSelection().anchorNode);
1924
1968
 
1925
1969
  t.clearButtonPaneStatus();
1926
1970
 
@@ -1962,7 +2006,9 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1962
2006
  tags = tags || (element && element.tagName ? [element.tagName] : []);
1963
2007
 
1964
2008
  if (element && element.parentNode) {
1965
- element = element.parentNode;
2009
+ if (element.nodeType !== Node.ELEMENT_NODE) {
2010
+ element = element.parentNode;
2011
+ }
1966
2012
  } else {
1967
2013
  return tags;
1968
2014
  }
@@ -1981,7 +2027,7 @@ Object.defineProperty(jQuery.trumbowyg, 'defaultOptions', {
1981
2027
 
1982
2028
  tags.push(tag);
1983
2029
 
1984
- return t.getTagsRecursive(element, tags).filter(function (tag) {
2030
+ return t.getTagsRecursive(element.parentNode, tags).filter(function (tag) {
1985
2031
  return tag != null;
1986
2032
  });
1987
2033
  },