tinymce-rails 4.9.10 → 4.9.11.1

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
  SHA256:
3
- metadata.gz: 6fa577ba4bb17221c1c259c4a18147670dcb81722b0202b28c08913a4d872751
4
- data.tar.gz: 86ec35ae2896adbad31380729974a58e08d953bedb61223dccb2ebf16d81e7d8
3
+ metadata.gz: 9119c17e2bcb3d33ab9b959c0c6c41c8d529106e51ab483f338d1e64423481d4
4
+ data.tar.gz: 7e358486b6a0f1db1794349cfeb7413538208df73d14bc3b6d221d2069222c91
5
5
  SHA512:
6
- metadata.gz: 25c329bdd1abb59169c61009a187ccb20345f3ec97cf57f0babbf19bde9a1eb9bf4af731be4916c0615e0ff0dcacefec12223198290e9fb54933f76bb03b8dcf
7
- data.tar.gz: 8ac5274d54ef0df889162f70f8fa62164dd631d5c92744a9ca47a8abb56aa63022acabb785e58747be3284b3296867293d75ad9ce505f32b7c8a66a1aab6432f
6
+ metadata.gz: 5222c58b96aabcf11ea4e41328be95d4f6461aaab3406dc148b5cff078b5d4f2b12c96ca01c5f3c5c83d8c6a9730667afd57640e6c54b4a3e7ef27d57af28bfa
7
+ data.tar.gz: ec2c6ed08479406cbc7829e702557b9ea9a754f5ab091e9119d216150b463fcfcc061dd83f6d2e8b719aa203dd9b68cd24c4117c3370b4aafd4158cf1604c911
data/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  Rails Integration for TinyMCE
2
2
  =============================
3
3
 
4
- The `tinymce-rails` gem integrates the [TinyMCE](http://www.tinymce.com/) editor with the Rails asset pipeline.
4
+ The `tinymce-rails` gem integrates the [TinyMCE](https://www.tiny.cloud/) editor with the Rails asset pipeline.
5
5
 
6
- This gem is compatible with Rails 3.1.1 and higher (including Rails 4).
6
+ This gem is compatible with Rails 5.0 and higher.
7
7
 
8
- This is the branch for TinyMCE 4. For TinyMCE 5, please see the [master branch](https://github.com/spohlenz/tinymce-rails), and for TinyMCE 3.5.x, please see the [tinymce-3 branch](https://github.com/spohlenz/tinymce-rails/tree/tinymce-3).
8
+ This is the branch for TinyMCE 4. Please see the [`main`](https://github.com/spohlenz/tinymce-rails) branch for TinyMCE 7, and alternate branches for [TinyMCE 6](https://github.com/spohlenz/tinymce-rails/tree/tinymce-6), [TinyMCE 5](https://github.com/spohlenz/tinymce-rails/tree/tinymce-5) & [TinyMCE 3.5.x](https://github.com/spohlenz/tinymce-rails/tree/tinymce-3).
9
9
 
10
- [![Build Status](https://travis-ci.org/spohlenz/tinymce-rails.png?branch=master)](https://travis-ci.org/spohlenz/tinymce-rails)
10
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/spohlenz/tinymce-rails/rspec.yml?branch=tinymce-4)](https://github.com/spohlenz/tinymce-rails/actions?query=branch%3Atinymce-4)
11
11
 
12
12
  **New in 3.5.11, 4.1.10 and 4.2.1:** Alternative asset installation methods (copy vs compile/symlink). See the [Asset Compilation](#asset-compilation) section below for details.
13
13
 
@@ -52,7 +52,7 @@ alternate:
52
52
  - table
53
53
  ```
54
54
 
55
- See the [TinyMCE 4 Documentation](https://www.tinymce.com/docs/configure/) for a full list of configuration options.
55
+ See the [TinyMCE 4 Documentation](https://www.tiny.cloud/docs-4x/configure/) for a full list of configuration options.
56
56
 
57
57
 
58
58
  **3. Include the TinyMCE assets**
@@ -1,4 +1,4 @@
1
- // 4.9.10 (2020-04-23)
1
+ // 4.9.11 (2020-07-13)
2
2
  (function () {
3
3
  (function (domGlobals) {
4
4
  'use strict';
@@ -5657,7 +5657,7 @@
5657
5657
  textBlockElementsMap = createLookupTable('text_block_elements', 'h1 h2 h3 h4 h5 h6 p div address pre form ' + 'blockquote center dir fieldset header footer article section hgroup aside main nav figure');
5658
5658
  blockElementsMap = createLookupTable('block_elements', 'hr table tbody thead tfoot ' + 'th tr td li ol ul caption dl dt dd noscript menu isindex option ' + 'datalist select optgroup figcaption details summary', textBlockElementsMap);
5659
5659
  textInlineElementsMap = createLookupTable('text_inline_elements', 'span strong b em i font strike u var cite ' + 'dfn code mark q sup sub samp');
5660
- each$4((settings.special || 'script noscript noframes noembed title style textarea xmp').split(' '), function (name) {
5660
+ each$4((settings.special || 'script noscript iframe noframes noembed title style textarea xmp').split(' '), function (name) {
5661
5661
  specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');
5662
5662
  });
5663
5663
  var patternToRegExp = function (str) {
@@ -8103,7 +8103,8 @@
8103
8103
  return overflowY >= 0 && overflowY <= Math.min(rect1.height, rect2.height) / 2;
8104
8104
  };
8105
8105
  var isAbove = function (rect1, rect2) {
8106
- if (rect1.bottom - rect1.height / 2 < rect2.top) {
8106
+ var halfHeight = Math.min(rect2.height / 2, rect1.height / 2);
8107
+ if (rect1.bottom - halfHeight < rect2.top) {
8107
8108
  return true;
8108
8109
  }
8109
8110
  if (rect1.top > rect2.bottom) {
@@ -13290,6 +13291,99 @@
13290
13291
  };
13291
13292
  var InlineFormatDelete = { backspaceDelete: backspaceDelete$5 };
13292
13293
 
13294
+ var getPos$1 = function (elm) {
13295
+ var x = 0, y = 0;
13296
+ var offsetParent = elm;
13297
+ while (offsetParent && offsetParent.nodeType) {
13298
+ x += offsetParent.offsetLeft || 0;
13299
+ y += offsetParent.offsetTop || 0;
13300
+ offsetParent = offsetParent.offsetParent;
13301
+ }
13302
+ return {
13303
+ x: x,
13304
+ y: y
13305
+ };
13306
+ };
13307
+ var fireScrollIntoViewEvent = function (editor, elm, alignToTop) {
13308
+ var scrollEvent = {
13309
+ elm: elm,
13310
+ alignToTop: alignToTop
13311
+ };
13312
+ editor.fire('scrollIntoView', scrollEvent);
13313
+ return scrollEvent.isDefaultPrevented();
13314
+ };
13315
+ var scrollElementIntoView = function (editor, elm, alignToTop) {
13316
+ var y, viewPort;
13317
+ var dom = editor.dom;
13318
+ var root = dom.getRoot();
13319
+ var viewPortY, viewPortH, offsetY = 0;
13320
+ if (fireScrollIntoViewEvent(editor, elm, alignToTop)) {
13321
+ return;
13322
+ }
13323
+ if (!NodeType.isElement(elm)) {
13324
+ return;
13325
+ }
13326
+ if (alignToTop === false) {
13327
+ offsetY = elm.offsetHeight;
13328
+ }
13329
+ if (root.nodeName !== 'BODY') {
13330
+ var scrollContainer = editor.selection.getScrollContainer();
13331
+ if (scrollContainer) {
13332
+ y = getPos$1(elm).y - getPos$1(scrollContainer).y + offsetY;
13333
+ viewPortH = scrollContainer.clientHeight;
13334
+ viewPortY = scrollContainer.scrollTop;
13335
+ if (y < viewPortY || y + 25 > viewPortY + viewPortH) {
13336
+ scrollContainer.scrollTop = y < viewPortY ? y : y - viewPortH + 25;
13337
+ }
13338
+ return;
13339
+ }
13340
+ }
13341
+ viewPort = dom.getViewPort(editor.getWin());
13342
+ y = dom.getPos(elm).y + offsetY;
13343
+ viewPortY = viewPort.y;
13344
+ viewPortH = viewPort.h;
13345
+ if (y < viewPort.y || y + 25 > viewPortY + viewPortH) {
13346
+ editor.getWin().scrollTo(0, y < viewPortY ? y : y - viewPortH + 25);
13347
+ }
13348
+ };
13349
+ var getViewPortRect = function (editor) {
13350
+ if (editor.inline) {
13351
+ return editor.getBody().getBoundingClientRect();
13352
+ } else {
13353
+ var win = editor.getWin();
13354
+ return {
13355
+ left: 0,
13356
+ right: win.innerWidth,
13357
+ top: 0,
13358
+ bottom: win.innerHeight,
13359
+ width: win.innerWidth,
13360
+ height: win.innerHeight
13361
+ };
13362
+ }
13363
+ };
13364
+ var scrollBy = function (editor, dx, dy) {
13365
+ if (editor.inline) {
13366
+ editor.getBody().scrollLeft += dx;
13367
+ editor.getBody().scrollTop += dy;
13368
+ } else {
13369
+ editor.getWin().scrollBy(dx, dy);
13370
+ }
13371
+ };
13372
+ var scrollRangeIntoView = function (editor, rng) {
13373
+ head(CaretPosition.fromRangeStart(rng).getClientRects()).each(function (rngRect) {
13374
+ var bodyRect = getViewPortRect(editor);
13375
+ var overflow = getOverflow(bodyRect, rngRect);
13376
+ var margin = 4;
13377
+ var dx = overflow.x > 0 ? overflow.x + margin : overflow.x - margin;
13378
+ var dy = overflow.y > 0 ? overflow.y + margin : overflow.y - margin;
13379
+ scrollBy(editor, overflow.x !== 0 ? dx : 0, overflow.y !== 0 ? dy : 0);
13380
+ });
13381
+ };
13382
+ var ScrollIntoView = {
13383
+ scrollElementIntoView: scrollElementIntoView,
13384
+ scrollRangeIntoView: scrollRangeIntoView
13385
+ };
13386
+
13293
13387
  var isContentEditableTrue$2 = NodeType.isContentEditableTrue;
13294
13388
  var isContentEditableFalse$6 = NodeType.isContentEditableFalse;
13295
13389
  var showCaret = function (direction, editor, node, before, scrollIntoView) {
@@ -13336,6 +13430,10 @@
13336
13430
  }
13337
13431
  return range;
13338
13432
  };
13433
+ var moveToRange = function (editor, rng) {
13434
+ editor.selection.setRng(rng);
13435
+ ScrollIntoView.scrollRangeIntoView(editor, editor.selection.getRng());
13436
+ };
13339
13437
 
13340
13438
  var trimEmptyTextNode$1 = function (dom, node) {
13341
13439
  if (NodeType.isText(node) && node.data.length === 0) {
@@ -20415,7 +20513,7 @@
20415
20513
  var blockElements = Tools.extend({}, schema.getBlockElements());
20416
20514
  var nonEmptyElements = schema.getNonEmptyElements();
20417
20515
  var parent, lastParent, prev, prevName;
20418
- var whiteSpaceElements = schema.getNonEmptyElements();
20516
+ var whiteSpaceElements = schema.getWhiteSpaceElements();
20419
20517
  var elementRule, textNode;
20420
20518
  blockElements.body = 1;
20421
20519
  for (i = 0; i < l; i++) {
@@ -21490,99 +21588,6 @@
21490
21588
  };
21491
21589
  };
21492
21590
 
21493
- var getPos$1 = function (elm) {
21494
- var x = 0, y = 0;
21495
- var offsetParent = elm;
21496
- while (offsetParent && offsetParent.nodeType) {
21497
- x += offsetParent.offsetLeft || 0;
21498
- y += offsetParent.offsetTop || 0;
21499
- offsetParent = offsetParent.offsetParent;
21500
- }
21501
- return {
21502
- x: x,
21503
- y: y
21504
- };
21505
- };
21506
- var fireScrollIntoViewEvent = function (editor, elm, alignToTop) {
21507
- var scrollEvent = {
21508
- elm: elm,
21509
- alignToTop: alignToTop
21510
- };
21511
- editor.fire('scrollIntoView', scrollEvent);
21512
- return scrollEvent.isDefaultPrevented();
21513
- };
21514
- var scrollElementIntoView = function (editor, elm, alignToTop) {
21515
- var y, viewPort;
21516
- var dom = editor.dom;
21517
- var root = dom.getRoot();
21518
- var viewPortY, viewPortH, offsetY = 0;
21519
- if (fireScrollIntoViewEvent(editor, elm, alignToTop)) {
21520
- return;
21521
- }
21522
- if (!NodeType.isElement(elm)) {
21523
- return;
21524
- }
21525
- if (alignToTop === false) {
21526
- offsetY = elm.offsetHeight;
21527
- }
21528
- if (root.nodeName !== 'BODY') {
21529
- var scrollContainer = editor.selection.getScrollContainer();
21530
- if (scrollContainer) {
21531
- y = getPos$1(elm).y - getPos$1(scrollContainer).y + offsetY;
21532
- viewPortH = scrollContainer.clientHeight;
21533
- viewPortY = scrollContainer.scrollTop;
21534
- if (y < viewPortY || y + 25 > viewPortY + viewPortH) {
21535
- scrollContainer.scrollTop = y < viewPortY ? y : y - viewPortH + 25;
21536
- }
21537
- return;
21538
- }
21539
- }
21540
- viewPort = dom.getViewPort(editor.getWin());
21541
- y = dom.getPos(elm).y + offsetY;
21542
- viewPortY = viewPort.y;
21543
- viewPortH = viewPort.h;
21544
- if (y < viewPort.y || y + 25 > viewPortY + viewPortH) {
21545
- editor.getWin().scrollTo(0, y < viewPortY ? y : y - viewPortH + 25);
21546
- }
21547
- };
21548
- var getViewPortRect = function (editor) {
21549
- if (editor.inline) {
21550
- return editor.getBody().getBoundingClientRect();
21551
- } else {
21552
- var win = editor.getWin();
21553
- return {
21554
- left: 0,
21555
- right: win.innerWidth,
21556
- top: 0,
21557
- bottom: win.innerHeight,
21558
- width: win.innerWidth,
21559
- height: win.innerHeight
21560
- };
21561
- }
21562
- };
21563
- var scrollBy = function (editor, dx, dy) {
21564
- if (editor.inline) {
21565
- editor.getBody().scrollLeft += dx;
21566
- editor.getBody().scrollTop += dy;
21567
- } else {
21568
- editor.getWin().scrollBy(dx, dy);
21569
- }
21570
- };
21571
- var scrollRangeIntoView = function (editor, rng) {
21572
- head(CaretPosition.fromRangeStart(rng).getClientRects()).each(function (rngRect) {
21573
- var bodyRect = getViewPortRect(editor);
21574
- var overflow = getOverflow(bodyRect, rngRect);
21575
- var margin = 4;
21576
- var dx = overflow.x > 0 ? overflow.x + margin : overflow.x - margin;
21577
- var dy = overflow.y > 0 ? overflow.y + margin : overflow.y - margin;
21578
- scrollBy(editor, overflow.x !== 0 ? dx : 0, overflow.y !== 0 ? dy : 0);
21579
- });
21580
- };
21581
- var ScrollIntoView = {
21582
- scrollElementIntoView: scrollElementIntoView,
21583
- scrollRangeIntoView: scrollRangeIntoView
21584
- };
21585
-
21586
21591
  var hasCeProperty = function (node) {
21587
21592
  return NodeType.isContentEditableTrue(node) || NodeType.isContentEditableFalse(node);
21588
21593
  };
@@ -21901,22 +21906,37 @@
21901
21906
  };
21902
21907
  var GetSelectionContent = { getContent: getContent };
21903
21908
 
21909
+ var setupArgs = function (args, content) {
21910
+ return __assign(__assign({ format: 'html' }, args), {
21911
+ set: true,
21912
+ selection: true,
21913
+ content: content
21914
+ });
21915
+ };
21916
+ var cleanContent = function (editor, args) {
21917
+ if (args.format !== 'raw') {
21918
+ var node = editor.parser.parse(args.content, __assign({
21919
+ isRootContent: true,
21920
+ forced_root_block: false
21921
+ }, args));
21922
+ return HtmlSerializer({ validate: editor.validate }, editor.schema).serialize(node);
21923
+ } else {
21924
+ return args.content;
21925
+ }
21926
+ };
21904
21927
  var setContent = function (editor, content, args) {
21928
+ var contentArgs = setupArgs(args, content);
21905
21929
  var rng = editor.selection.getRng(), caretNode;
21906
21930
  var doc = editor.getDoc();
21907
21931
  var frag, temp;
21908
- args = args || { format: 'html' };
21909
- args.set = true;
21910
- args.selection = true;
21911
- args.content = content;
21912
- if (!args.no_events) {
21913
- args = editor.fire('BeforeSetContent', args);
21914
- if (args.isDefaultPrevented()) {
21915
- editor.fire('SetContent', args);
21932
+ if (!contentArgs.no_events) {
21933
+ contentArgs = editor.fire('BeforeSetContent', contentArgs);
21934
+ if (contentArgs.isDefaultPrevented()) {
21935
+ editor.fire('SetContent', contentArgs);
21916
21936
  return;
21917
21937
  }
21918
21938
  }
21919
- content = args.content;
21939
+ content = cleanContent(editor, contentArgs);
21920
21940
  if (rng.insertNode) {
21921
21941
  content += '<span id="__caret">_</span>';
21922
21942
  if (rng.startContainer === doc && rng.endContainer === doc) {
@@ -21948,19 +21968,20 @@
21948
21968
  } catch (ex) {
21949
21969
  }
21950
21970
  } else {
21951
- if (rng.item) {
21971
+ var anyRng = rng;
21972
+ if (anyRng.item) {
21952
21973
  doc.execCommand('Delete', false, null);
21953
- rng = editor.getRng();
21974
+ anyRng = editor.selection.getRng();
21954
21975
  }
21955
21976
  if (/^\s+/.test(content)) {
21956
- rng.pasteHTML('<span id="__mce_tmp">_</span>' + content);
21977
+ anyRng.pasteHTML('<span id="__mce_tmp">_</span>' + content);
21957
21978
  editor.dom.remove('__mce_tmp');
21958
21979
  } else {
21959
- rng.pasteHTML(content);
21980
+ anyRng.pasteHTML(content);
21960
21981
  }
21961
21982
  }
21962
- if (!args.no_events) {
21963
- editor.fire('SetContent', args);
21983
+ if (!contentArgs.no_events) {
21984
+ editor.fire('SetContent', contentArgs);
21964
21985
  }
21965
21986
  };
21966
21987
  var SetSelectionContent = { setContent: setContent };
@@ -22649,7 +22670,7 @@
22649
22670
  return function () {
22650
22671
  var newRng = getHorizontalRange(editor, forward);
22651
22672
  if (newRng) {
22652
- editor.selection.setRng(newRng);
22673
+ moveToRange(editor, newRng);
22653
22674
  return true;
22654
22675
  } else {
22655
22676
  return false;
@@ -22660,7 +22681,7 @@
22660
22681
  return function () {
22661
22682
  var newRng = getVerticalRange(editor, down);
22662
22683
  if (newRng) {
22663
- editor.selection.setRng(newRng);
22684
+ moveToRange(editor, newRng);
22664
22685
  return true;
22665
22686
  } else {
22666
22687
  return false;
@@ -22762,10 +22783,6 @@
22762
22783
  });
22763
22784
  };
22764
22785
 
22765
- var moveToRange = function (editor, rng) {
22766
- editor.selection.setRng(rng);
22767
- ScrollIntoView.scrollRangeIntoView(editor, rng);
22768
- };
22769
22786
  var hasNextBreak = function (getPositionsUntil, scope, lineInfo) {
22770
22787
  return lineInfo.breakAt.map(function (breakPos) {
22771
22788
  return getPositionsUntil(scope, breakPos).breakAt.isSome();
@@ -26364,8 +26381,8 @@
26364
26381
  defaultSettings: {},
26365
26382
  $: DomQuery,
26366
26383
  majorVersion: '4',
26367
- minorVersion: '9.10',
26368
- releaseDate: '2020-04-23',
26384
+ minorVersion: '9.11',
26385
+ releaseDate: '2020-07-13',
26369
26386
  editors: legacyEditors,
26370
26387
  i18n: I18n,
26371
26388
  activeEditor: null,
@@ -24,14 +24,14 @@ module TinyMCE
24
24
  def symlink_asset(src, dest)
25
25
  with_asset(src, dest) do |src, dest|
26
26
  create_symlink(src, dest)
27
- create_symlink("#{src}.gz", "#{dest}.gz") if File.exists?("#{src}.gz")
27
+ create_symlink("#{src}.gz", "#{dest}.gz") if File.exist?("#{src}.gz")
28
28
  end
29
29
  end
30
30
 
31
31
  def create_symlink(src, dest)
32
32
  target = File.basename(src)
33
33
 
34
- unless File.exists?(dest) && File.symlink?(dest) && File.readlink(dest) == target
34
+ unless File.exist?(dest) && File.symlink?(dest) && File.readlink(dest) == target
35
35
  logger.info "Creating symlink #{dest}"
36
36
  FileUtils.ln_s(target, dest, :force => true)
37
37
  else
@@ -56,7 +56,7 @@ module TinyMCE
56
56
  src = File.join(@target, src)
57
57
  dest = File.join(@target, dest)
58
58
 
59
- yield src, dest if File.exists?(src)
59
+ yield src, dest if File.exist?(src)
60
60
  end
61
61
  end
62
62
  end
@@ -6,6 +6,7 @@ module TinyMCE
6
6
  def self.load(manifest_path)
7
7
  JsonManifest.try(manifest_path, ".sprockets-manifest*.json") ||
8
8
  JsonManifest.try(manifest_path, "manifest*.json") ||
9
+ JsonManifest.try(manifest_path) ||
9
10
  YamlManifest.try(manifest_path) ||
10
11
  NullManifest.new
11
12
  end
@@ -37,7 +38,7 @@ module TinyMCE
37
38
  class YamlManifest < AssetManifest
38
39
  def self.try(manifest_path)
39
40
  yaml_file = File.join(manifest_path, "manifest.yml")
40
- new(yaml_file) if File.exists?(yaml_file)
41
+ new(yaml_file) if File.exist?(yaml_file)
41
42
  end
42
43
 
43
44
  def initialize(file)
@@ -75,9 +76,13 @@ module TinyMCE
75
76
  end
76
77
 
77
78
  class JsonManifest < AssetManifest
78
- def self.try(manifest_path, pattern)
79
- paths = Dir[File.join(manifest_path, pattern)]
80
- new(paths.first) if paths.any?
79
+ def self.try(manifest_path, pattern=nil)
80
+ if pattern
81
+ paths = Dir[File.join(manifest_path, pattern)]
82
+ new(paths.first) if paths.any?
83
+ elsif File.file?(manifest_path)
84
+ new(manifest_path)
85
+ end
81
86
  end
82
87
 
83
88
  def initialize(file)
@@ -14,7 +14,7 @@ module TinyMCE::Rails
14
14
  }
15
15
  end
16
16
 
17
- FUNCTION_REGEX = /^function\s*\(/
17
+ FUNCTION_REGEX = /^function\s*\(([\w\d\s_,]*)\)\s*\{([^}]*)\}|\(([\w\d\s_,]*)\)\s*=>\s*\{([^}]*)\}/
18
18
  RELATIVE_PATH_REGEX = /^(\/|\.{1,2})\S*/
19
19
 
20
20
  COMMA = ",".freeze
@@ -47,7 +47,7 @@ module TinyMCE::Rails
47
47
  # Check for files provided in the content_css option to replace them with their actual path.
48
48
  # If no corresponding stylesheet is found for a file, it will remain unchanged.
49
49
  "content_css" => ->(value) {
50
- helpers = ActionView::Base.new(ActionView::LookupContext.new([]))
50
+ helpers = ActionView::Base.new(ActionView::LookupContext.new([]), {}, nil)
51
51
  separator = OPTION_SEPARATORS["content_css"]
52
52
 
53
53
  value.split(separator).map { |file|
@@ -25,13 +25,13 @@ module TinyMCE::Rails
25
25
  end
26
26
 
27
27
  def last_updated
28
- File.exists?(path) && File.mtime(path)
28
+ File.exist?(path) && File.mtime(path)
29
29
  end
30
30
 
31
31
  def load_configuration
32
32
  @last_loaded = last_updated
33
33
 
34
- return Configuration.new_with_defaults if !File.exists?(path)
34
+ return Configuration.new_with_defaults if !File.exist?(path)
35
35
 
36
36
  options = load_yaml(path)
37
37
 
@@ -43,7 +43,8 @@ module TinyMCE::Rails
43
43
  end
44
44
 
45
45
  def load_yaml(path)
46
- YAML::load(ERB.new(IO.read(path)).result)
46
+ result = ERB.new(IO.read(path)).result
47
+ YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(result) : YAML.load(result)
47
48
  end
48
49
  end
49
50
  end
@@ -1,6 +1,6 @@
1
1
  module TinyMCE
2
2
  module Rails
3
- VERSION = "4.9.10"
4
- TINYMCE_VERSION = "4.9.10"
3
+ VERSION = "4.9.11.1"
4
+ TINYMCE_VERSION = "4.9.11"
5
5
  end
6
6
  end