tinymce-rails 4.6.0 → 4.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 491f9edae36dccba75b131eac7b4ded44bb07c9b
4
- data.tar.gz: 667106bc33b6da989d10b26d8533f2fa5fce73b9
3
+ metadata.gz: bf1dfae47b1cc7df0aa69ab91992bd0619c078bc
4
+ data.tar.gz: daf504ea97ac8e29cccfa8679af34689b8207ce8
5
5
  SHA512:
6
- metadata.gz: efb92a480c6391db17ddea22e5c1c9b68e2c45c525d4ff540522ab633f5cf9c56df08d8d1d408558257ce679e7b4960ae0876ed6c1c0758f82b49d1d6d2820a4
7
- data.tar.gz: db034015859931c2d1f26e7d3fc3b3aae8987e154b2a5628396533323c33a7a676fe0ace36519cda5f4e4c0419bae4bb419904831417f032076db6c03fcaf5a7
6
+ metadata.gz: 36911f091f3b7c365a2d0a66b927f008172c137aea485cb4575c56b87c3d51ec591567e88ee004b790ab338bb817c3d57ac52d50f13f0c3f6b1236472a2434c3
7
+ data.tar.gz: b6b4412f02611d65b90d4dc91b00f36548e90d19c3fa5ab0a2b93ceb3f07e80b73741bfcb3a9316057fbc936ea5321a703c3b57e84f1bbf42f1f16e293013749
@@ -1,3 +1,4 @@
1
+ // 4.6.1 (2017-05-10)
1
2
  (function () {
2
3
 
3
4
  var defs = {}; // id -> {dependencies, definition, instance (possibly undefined)}
@@ -6487,7 +6488,20 @@ define(
6487
6488
 
6488
6489
  function encodeNamedAndNumeric(text, attr) {
6489
6490
  return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {
6490
- return baseEntities[chr] || entities[chr] || '&#' + chr.charCodeAt(0) + ';' || chr;
6491
+ if (baseEntities[chr] !== undefined) {
6492
+ return baseEntities[chr];
6493
+ }
6494
+
6495
+ if (entities[chr] !== undefined) {
6496
+ return entities[chr];
6497
+ }
6498
+
6499
+ // Convert multi-byte sequences to a single entity.
6500
+ if (chr.length > 1) {
6501
+ return '&#' + (((chr.charCodeAt(0) - 0xD800) * 0x400) + (chr.charCodeAt(1) - 0xDC00) + 0x10000) + ';';
6502
+ }
6503
+
6504
+ return '&#' + chr.charCodeAt(0) + ';';
6491
6505
  });
6492
6506
  }
6493
6507
 
@@ -19287,7 +19301,7 @@ define(
19287
19301
  if (!self.tridentSel) {
19288
19302
  sel = self.getSel();
19289
19303
 
19290
- evt = self.editor.fire('SetSelectionRange', { range: rng });
19304
+ evt = self.editor.fire('SetSelectionRange', { range: rng, forward: forward });
19291
19305
  rng = evt.range;
19292
19306
 
19293
19307
  if (sel) {
@@ -19335,7 +19349,7 @@ define(
19335
19349
  }
19336
19350
  }
19337
19351
 
19338
- self.editor.fire('AfterSetSelectionRange', { range: rng });
19352
+ self.editor.fire('AfterSetSelectionRange', { range: rng, forward: forward });
19339
19353
  } else {
19340
19354
  // Is W3C Range fake range on IE
19341
19355
  if (rng.cloneRange) {
@@ -22732,8 +22746,8 @@ define(
22732
22746
  */
22733
22747
  function moveStart(rng) {
22734
22748
  var container = rng.startContainer,
22735
- offset = rng.startOffset, isAtEndOfText,
22736
- walker, node, nodes, tmpNode;
22749
+ offset = rng.startOffset,
22750
+ walker, node, nodes;
22737
22751
 
22738
22752
  if (rng.startContainer == rng.endContainer) {
22739
22753
  if (isInlineBlock(rng.startContainer.childNodes[rng.startOffset])) {
@@ -22746,31 +22760,24 @@ define(
22746
22760
  // Get the parent container location and walk from there
22747
22761
  offset = nodeIndex(container);
22748
22762
  container = container.parentNode;
22749
- isAtEndOfText = true;
22750
22763
  }
22751
22764
 
22752
22765
  // Move startContainer/startOffset in to a suitable node
22753
22766
  if (container.nodeType == 1) {
22754
22767
  nodes = container.childNodes;
22755
- container = nodes[Math.min(offset, nodes.length - 1)];
22756
- walker = new TreeWalker(container, dom.getParent(container, dom.isBlock));
22757
-
22758
- // If offset is at end of the parent node walk to the next one
22759
- if (offset > nodes.length - 1 || isAtEndOfText) {
22760
- walker.next();
22768
+ if (offset < nodes.length) {
22769
+ container = nodes[offset];
22770
+ walker = new TreeWalker(container, dom.getParent(container, dom.isBlock));
22771
+ } else {
22772
+ container = nodes[nodes.length - 1];
22773
+ walker = new TreeWalker(container, dom.getParent(container, dom.isBlock));
22774
+ walker.next(true);
22761
22775
  }
22762
22776
 
22763
22777
  for (node = walker.current(); node; node = walker.next()) {
22764
22778
  if (node.nodeType == 3 && !isWhiteSpaceNode(node)) {
22765
- // IE has a "neat" feature where it moves the start node into the closest element
22766
- // we can avoid this by inserting an element before it and then remove it after we set the selection
22767
- tmpNode = dom.create('a', { 'data-mce-bogus': 'all' }, INVISIBLE_CHAR);
22768
- node.parentNode.insertBefore(tmpNode, node);
22769
-
22770
- // Set selection and remove tmpNode
22771
22779
  rng.setStart(node, 0);
22772
22780
  selection.setRng(rng);
22773
- dom.remove(tmpNode);
22774
22781
 
22775
22782
  return;
22776
22783
  }
@@ -25670,6 +25677,9 @@ define(
25670
25677
 
25671
25678
  if (startCaretPosition.isEqual(CaretPosition.after(rootNode)) && rootNode.lastChild) {
25672
25679
  caretPosition = CaretPosition.after(rootNode.lastChild);
25680
+ if (isBackwards(direction) && isCaretCandidate(rootNode.lastChild) && isElement(rootNode.lastChild)) {
25681
+ return isBr(rootNode.lastChild) ? CaretPosition.before(rootNode.lastChild) : caretPosition;
25682
+ }
25673
25683
  } else {
25674
25684
  caretPosition = startCaretPosition;
25675
25685
  }
@@ -26351,11 +26361,12 @@ define(
26351
26361
  'tinymce.core.dom.NodeType'
26352
26362
  ],
26353
26363
  function (Arr, Option, Insert, Remove, Element, Traverse, CaretFinder, CaretPosition, Empty, NodeType) {
26354
- var mergeBlocksAndReposition = function (fromBlock, toBlock, toPosition) {
26364
+ var mergeBlocksAndReposition = function (forward, fromBlock, toBlock, toPosition) {
26355
26365
  var children = Traverse.children(fromBlock);
26356
26366
 
26357
26367
  if (NodeType.isBr(toPosition.getNode())) {
26358
26368
  Remove.remove(Element.fromDom(toPosition.getNode()));
26369
+ toPosition = CaretFinder.positionIn(false, toBlock.dom()).getOr();
26359
26370
  }
26360
26371
 
26361
26372
  Arr.each(children, function (node) {
@@ -26366,17 +26377,17 @@ define(
26366
26377
  Remove.remove(fromBlock);
26367
26378
  }
26368
26379
 
26369
- return children.length > 0 ? Option.some(toPosition) : Option.none();
26380
+ return children.length > 0 ? Option.from(toPosition) : Option.none();
26370
26381
  };
26371
26382
 
26372
26383
  var mergeBlocks = function (forward, block1, block2) {
26373
26384
  if (forward) {
26374
26385
  return CaretFinder.positionIn(false, block1.dom()).bind(function (toPosition) {
26375
- return mergeBlocksAndReposition(block2, block1, toPosition);
26386
+ return mergeBlocksAndReposition(forward, block2, block1, toPosition);
26376
26387
  });
26377
26388
  } else {
26378
26389
  return CaretFinder.positionIn(false, block2.dom()).bind(function (toPosition) {
26379
- return mergeBlocksAndReposition(block1, block2, toPosition);
26390
+ return mergeBlocksAndReposition(forward, block1, block2, toPosition);
26380
26391
  });
26381
26392
  }
26382
26393
  };
@@ -26612,12 +26623,15 @@ define(
26612
26623
  [
26613
26624
  'ephox.katamari.api.Adt',
26614
26625
  'ephox.katamari.api.Option',
26626
+ 'ephox.sugar.api.node.Element',
26615
26627
  'tinymce.core.caret.CaretFinder',
26616
26628
  'tinymce.core.caret.CaretPosition',
26617
26629
  'tinymce.core.caret.CaretUtils',
26630
+ 'tinymce.core.delete.DeleteUtils',
26631
+ 'tinymce.core.dom.Empty',
26618
26632
  'tinymce.core.dom.NodeType'
26619
26633
  ],
26620
- function (Adt, Option, CaretFinder, CaretPosition, CaretUtils, NodeType) {
26634
+ function (Adt, Option, Element, CaretFinder, CaretPosition, CaretUtils, DeleteUtils, Empty, NodeType) {
26621
26635
  var DeleteAction = Adt.generate([
26622
26636
  { remove: [ 'element' ] },
26623
26637
  { moveToElement: [ 'element' ] },
@@ -26630,12 +26644,21 @@ define(
26630
26644
  return NodeType.isElement(elm) && elm.getAttribute('data-mce-caret') === caretLocation;
26631
26645
  };
26632
26646
 
26647
+ var deleteEmptyBlockOrMoveToCef = function (rootNode, forward, from, to) {
26648
+ var toCefElm = to.getNode(forward === false);
26649
+ return DeleteUtils.getParentTextBlock(Element.fromDom(rootNode), Element.fromDom(from.getNode())).map(function (blockElm) {
26650
+ return Empty.isEmpty(blockElm) ? DeleteAction.remove(blockElm.dom()) : DeleteAction.moveToElement(toCefElm);
26651
+ }).orThunk(function () {
26652
+ return Option.some(DeleteAction.moveToElement(toCefElm));
26653
+ });
26654
+ };
26655
+
26633
26656
  var findCefPosition = function (rootNode, forward, from) {
26634
26657
  return CaretFinder.fromPosition(forward, rootNode, from).bind(function (to) {
26635
26658
  if (forward && NodeType.isContentEditableFalse(to.getNode())) {
26636
- return Option.some(DeleteAction.moveToElement(to.getNode()));
26659
+ return deleteEmptyBlockOrMoveToCef(rootNode, forward, from, to);
26637
26660
  } else if (forward === false && NodeType.isContentEditableFalse(to.getNode(true))) {
26638
- return Option.some(DeleteAction.moveToElement(to.getNode(true)));
26661
+ return deleteEmptyBlockOrMoveToCef(rootNode, forward, from, to);
26639
26662
  } else if (forward && CaretUtils.isAfterContentEditableFalse(from)) {
26640
26663
  return Option.some(DeleteAction.moveToPosition(to));
26641
26664
  } else if (forward === false && CaretUtils.isBeforeContentEditableFalse(from)) {
@@ -26854,32 +26877,72 @@ define(
26854
26877
  return NodeType.isText(node) ? new CaretPosition(node, node.data.length) : CaretPosition.after(node);
26855
26878
  };
26856
26879
 
26857
- var findCaretPosition = function (forward, rootElement, elm) {
26880
+ var getPreviousSiblingCaretPosition = function (elm) {
26858
26881
  if (CaretCandidate.isCaretCandidate(elm.previousSibling)) {
26859
26882
  return Option.some(afterOrEndOf(elm.previousSibling));
26860
- } else if (CaretCandidate.isCaretCandidate(elm.nextSibling)) {
26861
- return Option.some(beforeOrStartOf(elm));
26862
26883
  } else {
26863
- return InlineUtils.findCaretPosition(rootElement, forward, CaretPosition.before(elm)).fold(
26864
- function () {
26865
- return InlineUtils.findCaretPosition(rootElement, !forward, CaretPosition.after(elm));
26866
- },
26867
- Option.some
26868
- );
26884
+ return elm.previousSibling ? InlineUtils.findCaretPositionIn(elm.previousSibling, false) : Option.none();
26885
+ }
26886
+ };
26887
+
26888
+ var getNextSiblingCaretPosition = function (elm) {
26889
+ if (CaretCandidate.isCaretCandidate(elm.nextSibling)) {
26890
+ return Option.some(beforeOrStartOf(elm.nextSibling));
26891
+ } else {
26892
+ return elm.nextSibling ? InlineUtils.findCaretPositionIn(elm.nextSibling, true) : Option.none();
26869
26893
  }
26870
26894
  };
26871
26895
 
26896
+ var findCaretPositionBackwardsFromElm = function (rootElement, elm) {
26897
+ var startPosition = CaretPosition.before(elm.previousSibling ? elm.previousSibling : elm.parentNode);
26898
+ return InlineUtils.findCaretPosition(rootElement, false, startPosition).fold(
26899
+ function () {
26900
+ return InlineUtils.findCaretPosition(rootElement, true, CaretPosition.after(elm));
26901
+ },
26902
+ Option.some
26903
+ );
26904
+ };
26905
+
26906
+ var findCaretPositionForwardsFromElm = function (rootElement, elm) {
26907
+ return InlineUtils.findCaretPosition(rootElement, true, CaretPosition.after(elm)).fold(
26908
+ function () {
26909
+ return InlineUtils.findCaretPosition(rootElement, false, CaretPosition.before(elm));
26910
+ },
26911
+ Option.some
26912
+ );
26913
+ };
26914
+
26915
+ var findCaretPositionBackwards = function (rootElement, elm) {
26916
+ return getPreviousSiblingCaretPosition(elm).orThunk(function () {
26917
+ return getNextSiblingCaretPosition(elm);
26918
+ }).orThunk(function () {
26919
+ return findCaretPositionBackwardsFromElm(rootElement, elm);
26920
+ });
26921
+ };
26922
+
26923
+ var findCaretPositionForward = function (rootElement, elm) {
26924
+ return getNextSiblingCaretPosition(elm).orThunk(function () {
26925
+ return getPreviousSiblingCaretPosition(elm);
26926
+ }).orThunk(function () {
26927
+ return findCaretPositionForwardsFromElm(rootElement, elm);
26928
+ });
26929
+ };
26930
+
26931
+ var findCaretPosition = function (forward, rootElement, elm) {
26932
+ return forward ? findCaretPositionForward(rootElement, elm) : findCaretPositionBackwards(rootElement, elm);
26933
+ };
26934
+
26872
26935
  var findCaretPosOutsideElmAfterDelete = function (forward, rootElement, elm) {
26873
26936
  return findCaretPosition(forward, rootElement, elm).map(Fun.curry(reposition, elm));
26874
26937
  };
26875
26938
 
26876
- var setSelection = function (editor, pos) {
26939
+ var setSelection = function (editor, forward, pos) {
26877
26940
  pos.fold(
26878
26941
  function () {
26879
26942
  editor.focus();
26880
26943
  },
26881
26944
  function (pos) {
26882
- editor.selection.setRng(pos.toRange());
26945
+ editor.selection.setRng(pos.toRange(), forward);
26883
26946
  }
26884
26947
  );
26885
26948
  };
@@ -26913,10 +26976,10 @@ define(
26913
26976
 
26914
26977
  parentBlock.bind(paddEmptyBlock).fold(
26915
26978
  function () {
26916
- setSelection(editor, afterDeletePos);
26979
+ setSelection(editor, forward, afterDeletePos);
26917
26980
  },
26918
26981
  function (paddPos) {
26919
- setSelection(editor, Option.some(paddPos));
26982
+ setSelection(editor, forward, Option.some(paddPos));
26920
26983
  }
26921
26984
  );
26922
26985
  };
@@ -27369,12 +27432,18 @@ define(
27369
27432
  { after: [ 'element' ] }
27370
27433
  ]);
27371
27434
 
27435
+ var rescope = function (rootNode, node) {
27436
+ var parentBlock = CaretUtils.getParentBlock(node, rootNode);
27437
+ return parentBlock ? parentBlock : rootNode;
27438
+ };
27439
+
27372
27440
  var before = function (rootNode, pos) {
27373
27441
  var nPos = InlineUtils.normalizeForwards(pos);
27374
- return InlineUtils.findInline(rootNode, nPos).fold(
27442
+ var scope = rescope(rootNode, nPos.container());
27443
+ return InlineUtils.findInline(scope, nPos).fold(
27375
27444
  function () {
27376
- return InlineUtils.findCaretPosition(rootNode, true, nPos)
27377
- .bind(Fun.curry(InlineUtils.findInline, rootNode))
27445
+ return InlineUtils.findCaretPosition(scope, true, nPos)
27446
+ .bind(Fun.curry(InlineUtils.findInline, scope))
27378
27447
  .map(function (inline) {
27379
27448
  return Location.before(inline);
27380
27449
  });
@@ -27401,10 +27470,11 @@ define(
27401
27470
 
27402
27471
  var after = function (rootNode, pos) {
27403
27472
  var nPos = InlineUtils.normalizeBackwards(pos);
27404
- return InlineUtils.findInline(rootNode, nPos).fold(
27473
+ var scope = rescope(rootNode, nPos.container());
27474
+ return InlineUtils.findInline(scope, nPos).fold(
27405
27475
  function () {
27406
- return InlineUtils.findCaretPosition(rootNode, false, nPos)
27407
- .bind(Fun.curry(InlineUtils.findInline, rootNode))
27476
+ return InlineUtils.findCaretPosition(scope, false, nPos)
27477
+ .bind(Fun.curry(InlineUtils.findInline, scope))
27408
27478
  .map(function (inline) {
27409
27479
  return Location.after(inline);
27410
27480
  });
@@ -27437,6 +27507,15 @@ define(
27437
27507
  );
27438
27508
  };
27439
27509
 
27510
+ var getName = function (location) {
27511
+ return location.fold(
27512
+ Fun.constant('before'), // Before
27513
+ Fun.constant('start'), // Start
27514
+ Fun.constant('end'), // End
27515
+ Fun.constant('after') // After
27516
+ );
27517
+ };
27518
+
27440
27519
  var outside = function (location) {
27441
27520
  return location.fold(
27442
27521
  Location.before, // Before
@@ -27455,13 +27534,8 @@ define(
27455
27534
  );
27456
27535
  };
27457
27536
 
27458
- var isInside = function (location) {
27459
- return location.fold(
27460
- Fun.constant(false), // Before
27461
- Fun.constant(true), // Start
27462
- Fun.constant(true), // End
27463
- Fun.constant(false) // After
27464
- );
27537
+ var isEq = function (location1, location2) {
27538
+ return getName(location1) === getName(location2) && getElement(location1) === getElement(location2);
27465
27539
  };
27466
27540
 
27467
27541
  var betweenInlines = function (forward, rootNode, from, to, location) {
@@ -27478,72 +27552,60 @@ define(
27478
27552
  }).getOr(location);
27479
27553
  };
27480
27554
 
27481
- var isFirstPositionInBlock = function (rootBlock, pos) {
27482
- return InlineUtils.findCaretPosition(rootBlock, false, pos).isNone();
27483
- };
27484
-
27485
- var isLastPositionInBlock = function (rootBlock, pos) {
27486
- return InlineUtils.findCaretPosition(rootBlock, true, pos).bind(function (nextPos) {
27487
- if (NodeType.isBr(nextPos.getNode())) {
27488
- return InlineUtils.findCaretPosition(rootBlock, true, CaretPosition.after(nextPos.getNode()));
27489
- } else {
27490
- return Option.some(nextPos);
27555
+ var skipNoMovement = function (fromLocation, toLocation) {
27556
+ return fromLocation.fold(
27557
+ Fun.constant(true),
27558
+ function (fromLocation) {
27559
+ return !isEq(fromLocation, toLocation);
27491
27560
  }
27492
- }).isNone();
27493
- };
27494
-
27495
- var isEndPositionInBlock = function (forward, rootBlock, pos) {
27496
- return forward ? isLastPositionInBlock(rootBlock, pos) : isFirstPositionInBlock(rootBlock, pos);
27497
- };
27498
-
27499
- var onlyOutside = function (location) {
27500
- if (isInside(location)) {
27501
- return Option.some(outside(location));
27502
- } else {
27503
- return Option.none();
27504
- }
27505
- };
27506
-
27507
- var findFirstOrLastLocationInBlock = function (rootNode, forward, toBlock) {
27508
- return InlineUtils.findCaretPositionIn(toBlock, forward).bind(function (lastPosition) {
27509
- return readLocation(toBlock, lastPosition).map(outside);
27510
- });
27511
- };
27512
-
27513
- var betweenBlocks = function (forward, rootNode, from, to, location) {
27514
- var fromBlock = CaretUtils.getParentBlock(from.container(), rootNode);
27515
- if (isEndPositionInBlock(forward, fromBlock, to) && isInside(location) === false) {
27516
- return readLocation(rootNode, from).bind(onlyOutside);
27517
- } else if (isEndPositionInBlock(forward, fromBlock, from)) {
27518
- return readLocation(rootNode, from)
27519
- .bind(onlyOutside)
27520
- .orThunk(function () {
27521
- return Option.from(CaretUtils.getParentBlock(to.container(), rootNode)).bind(function (toBlock) {
27522
- return findFirstOrLastLocationInBlock(rootNode, forward, toBlock);
27523
- });
27524
- });
27525
- } else {
27526
- return Option.some(location);
27527
- }
27561
+ );
27528
27562
  };
27529
27563
 
27530
- var findLocation = function (forward, rootNode, pos) {
27564
+ var findLocationTraverse = function (forward, rootNode, fromLocation, pos) {
27531
27565
  var from = InlineUtils.normalizePosition(forward, pos);
27532
27566
  var to = InlineUtils.findCaretPosition(rootNode, forward, from).map(Fun.curry(InlineUtils.normalizePosition, forward));
27567
+
27533
27568
  var location = to.fold(
27534
27569
  function () {
27535
- return readLocation(rootNode, from).map(outside);
27570
+ return fromLocation.map(outside);
27536
27571
  },
27537
27572
  function (to) {
27538
27573
  return readLocation(rootNode, to)
27539
- .bind(Fun.curry(betweenBlocks, forward, rootNode, from, to))
27540
- .map(Fun.curry(betweenInlines, forward, rootNode, from, to));
27574
+ .map(Fun.curry(betweenInlines, forward, rootNode, from, to))
27575
+ .filter(Fun.curry(skipNoMovement, fromLocation));
27541
27576
  }
27542
27577
  );
27543
27578
 
27544
27579
  return location.filter(isValidLocation);
27545
27580
  };
27546
27581
 
27582
+ var findLocationSimple = function (forward, location) {
27583
+ if (forward) {
27584
+ return location.fold(
27585
+ Fun.compose(Option.some, Location.start), // Before -> Start
27586
+ Option.none,
27587
+ Fun.compose(Option.some, Location.after), // End -> After
27588
+ Option.none
27589
+ );
27590
+ } else {
27591
+ return location.fold(
27592
+ Option.none,
27593
+ Fun.compose(Option.some, Location.before), // Before <- Start
27594
+ Option.none,
27595
+ Fun.compose(Option.some, Location.end) // End <- After
27596
+ );
27597
+ }
27598
+ };
27599
+
27600
+ var findLocation = function (forward, rootNode, pos) {
27601
+ var from = InlineUtils.normalizePosition(forward, pos);
27602
+ var fromLocation = readLocation(rootNode, from);
27603
+
27604
+ return readLocation(rootNode, from).bind(Fun.curry(findLocationSimple, forward)).orThunk(function () {
27605
+ return findLocationTraverse(forward, rootNode, fromLocation, pos);
27606
+ });
27607
+ };
27608
+
27547
27609
  return {
27548
27610
  readLocation: readLocation,
27549
27611
  prevLocation: Fun.curry(findLocation, false),
@@ -27720,13 +27782,18 @@ define(
27720
27782
  'ephox.sugar.api.node.Element',
27721
27783
  'tinymce.core.caret.CaretContainer',
27722
27784
  'tinymce.core.caret.CaretPosition',
27785
+ 'tinymce.core.caret.CaretUtils',
27723
27786
  'tinymce.core.delete.DeleteElement',
27724
27787
  'tinymce.core.keyboard.BoundaryCaret',
27725
27788
  'tinymce.core.keyboard.BoundaryLocation',
27726
27789
  'tinymce.core.keyboard.BoundarySelection',
27727
27790
  'tinymce.core.keyboard.InlineUtils'
27728
27791
  ],
27729
- function (Fun, Option, Options, Element, CaretContainer, CaretPosition, DeleteElement, BoundaryCaret, BoundaryLocation, BoundarySelection, InlineUtils) {
27792
+ function (Fun, Option, Options, Element, CaretContainer, CaretPosition, CaretUtils, DeleteElement, BoundaryCaret, BoundaryLocation, BoundarySelection, InlineUtils) {
27793
+ var isFeatureEnabled = function (editor) {
27794
+ return editor.settings.inline_boundaries !== false;
27795
+ };
27796
+
27730
27797
  var rangeFromPositions = function (from, to) {
27731
27798
  var range = document.createRange();
27732
27799
 
@@ -27760,8 +27827,13 @@ define(
27760
27827
  editor.nodeChanged();
27761
27828
  };
27762
27829
 
27830
+ var rescope = function (rootNode, node) {
27831
+ var parentBlock = CaretUtils.getParentBlock(node, rootNode);
27832
+ return parentBlock ? parentBlock : rootNode;
27833
+ };
27834
+
27763
27835
  var backspaceDeleteCollapsed = function (editor, caret, forward, from) {
27764
- var rootNode = editor.getBody();
27836
+ var rootNode = rescope(editor.getBody(), from.container());
27765
27837
  var fromLocation = BoundaryLocation.readLocation(rootNode, from);
27766
27838
 
27767
27839
  return fromLocation.bind(function (location) {
@@ -27789,10 +27861,10 @@ define(
27789
27861
  });
27790
27862
 
27791
27863
  if (fromLocation.isSome() && toLocation.isSome()) {
27792
- InlineUtils.findInline(rootNode, from).bind(function (elm) {
27793
- return DeleteElement.deleteElement(editor, forward, Element.fromDom(elm));
27794
- });
27795
- return true;
27864
+ return InlineUtils.findInline(rootNode, from).map(function (elm) {
27865
+ DeleteElement.deleteElement(editor, forward, Element.fromDom(elm));
27866
+ return true;
27867
+ }).getOr(false);
27796
27868
  } else {
27797
27869
  return toLocation.map(function (_) {
27798
27870
  toPosition.map(function (to) {
@@ -27810,7 +27882,7 @@ define(
27810
27882
  };
27811
27883
 
27812
27884
  var backspaceDelete = function (editor, caret, forward) {
27813
- if (editor.selection.isCollapsed()) {
27885
+ if (editor.selection.isCollapsed() && isFeatureEnabled(editor)) {
27814
27886
  var from = CaretPosition.fromRangeStart(editor.selection.getRng());
27815
27887
  return backspaceDeleteCollapsed(editor, caret, forward, from);
27816
27888
  }
@@ -38890,12 +38962,12 @@ define(
38890
38962
  'tinymce.core.keyboard.MatchKeys',
38891
38963
  'tinymce.core.util.VK'
38892
38964
  ],
38893
- function (Arr, BlockBoundaryDelete, BlockRangeDelete, CefDelete, BoundaryDelete, MatchKeys, VK) {
38965
+ function (Arr, BlockBoundaryDelete, BlockRangeDelete, CefDelete, InlineBoundaryDelete, MatchKeys, VK) {
38894
38966
  var setupKeyDownHandler = function (editor, caret) {
38895
38967
  editor.on('keydown', function (evt) {
38896
38968
  var matches = MatchKeys.match([
38897
- { keyCode: VK.BACKSPACE, action: MatchKeys.action(BoundaryDelete.backspaceDelete, editor, caret, false) },
38898
- { keyCode: VK.DELETE, action: MatchKeys.action(BoundaryDelete.backspaceDelete, editor, caret, true) },
38969
+ { keyCode: VK.BACKSPACE, action: MatchKeys.action(InlineBoundaryDelete.backspaceDelete, editor, caret, false) },
38970
+ { keyCode: VK.DELETE, action: MatchKeys.action(InlineBoundaryDelete.backspaceDelete, editor, caret, true) },
38899
38971
  { keyCode: VK.BACKSPACE, action: MatchKeys.action(CefDelete.backspaceDelete, editor, false) },
38900
38972
  { keyCode: VK.DELETE, action: MatchKeys.action(CefDelete.backspaceDelete, editor, true) },
38901
38973
  { keyCode: VK.BACKSPACE, action: MatchKeys.action(BlockRangeDelete.backspaceDelete, editor, false) },
@@ -38976,6 +39048,10 @@ define(
38976
39048
  elm.innerHTML = !isIE ? '<br data-mce-bogus="1">' : '';
38977
39049
  };
38978
39050
 
39051
+ var containerAndSiblingName = function (container, nodeName) {
39052
+ return container.nodeName === nodeName || (container.previousSibling && container.previousSibling.nodeName === nodeName);
39053
+ };
39054
+
38979
39055
  // Returns true if the block can be split into two blocks or not
38980
39056
  var canSplitBlock = function (dom, node) {
38981
39057
  return node &&
@@ -39166,7 +39242,7 @@ define(
39166
39242
  function createNewBlock(name) {
39167
39243
  var node = container, block, clonedNode, caretNode, textInlineElements = schema.getTextInlineElements();
39168
39244
 
39169
- if (name || parentBlockName == "TABLE") {
39245
+ if (name || parentBlockName == "TABLE" || parentBlockName == "HR") {
39170
39246
  block = dom.create(name || newBlockName);
39171
39247
  setForcedBlockAttrs(block);
39172
39248
  } else {
@@ -39230,8 +39306,8 @@ define(
39230
39306
  return true;
39231
39307
  }
39232
39308
 
39233
- // Caret can be before/after a table
39234
- if (container.nodeName === "TABLE" || (container.previousSibling && container.previousSibling.nodeName == "TABLE")) {
39309
+ // Caret can be before/after a table or a hr
39310
+ if (containerAndSiblingName(container, 'TABLE') || containerAndSiblingName(container, 'HR')) {
39235
39311
  return (isAfterLastNodeInContainer && !start) || (!isAfterLastNodeInContainer && start);
39236
39312
  }
39237
39313
 
@@ -39609,7 +39685,9 @@ define(
39609
39685
  // Insert new block before
39610
39686
  newBlock = parentBlock.parentNode.insertBefore(createNewBlock(), parentBlock);
39611
39687
  renderBlockOnIE(dom, selection, newBlock);
39612
- moveToCaretPosition(parentBlock);
39688
+
39689
+ // Adjust caret position if HR
39690
+ containerAndSiblingName(parentBlock, 'HR') ? moveToCaretPosition(newBlock) : moveToCaretPosition(parentBlock);
39613
39691
  } else {
39614
39692
  // Extract after fragment and insert it after the current block
39615
39693
  tmpRng = includeZwspInRange(rng).cloneRange();
@@ -41426,7 +41504,8 @@ define(
41426
41504
  e.preventDefault();
41427
41505
  setContentEditableSelection(selectNode(contentEditableRoot));
41428
41506
  } else {
41429
- if (!isXYWithinRange(e.clientX, e.clientY, editor.selection.getRng())) {
41507
+ // Check that we're not attempting a shift + click select within a contenteditable='true' element
41508
+ if (!(isContentEditableTrue(contentEditableRoot) && e.shiftKey) && !isXYWithinRange(e.clientX, e.clientY, editor.selection.getRng())) {
41430
41509
  editor.selection.placeCaretAt(e.clientX, e.clientY);
41431
41510
  }
41432
41511
  }
@@ -41495,7 +41574,7 @@ define(
41495
41574
  editor.on('setSelectionRange', function (e) {
41496
41575
  var rng;
41497
41576
 
41498
- rng = setContentEditableSelection(e.range);
41577
+ rng = setContentEditableSelection(e.range, e.forward);
41499
41578
  if (rng) {
41500
41579
  e.range = rng;
41501
41580
  }
@@ -41570,7 +41649,7 @@ define(
41570
41649
  return isWithinCaretContainer(rng.startContainer) || isWithinCaretContainer(rng.endContainer);
41571
41650
  }
41572
41651
 
41573
- function setContentEditableSelection(range) {
41652
+ function setContentEditableSelection(range, forward) {
41574
41653
  var node, $ = editor.$, dom = editor.dom, $realSelectionContainer, sel,
41575
41654
  startContainer, startOffset, endOffset, e, caretPosition, targetClone, origTargetClone;
41576
41655
 
@@ -41580,14 +41659,26 @@ define(
41580
41659
 
41581
41660
  if (range.collapsed) {
41582
41661
  if (!isRangeInCaretContainer(range)) {
41583
- caretPosition = getNormalizedRangeEndPoint(1, range);
41662
+ if (forward === false) {
41663
+ caretPosition = getNormalizedRangeEndPoint(-1, range);
41584
41664
 
41585
- if (isContentEditableFalse(caretPosition.getNode())) {
41586
- return showCaret(1, caretPosition.getNode(), !caretPosition.isAtEnd());
41587
- }
41665
+ if (isContentEditableFalse(caretPosition.getNode(true))) {
41666
+ return showCaret(-1, caretPosition.getNode(true), false);
41667
+ }
41668
+
41669
+ if (isContentEditableFalse(caretPosition.getNode())) {
41670
+ return showCaret(-1, caretPosition.getNode(), !caretPosition.isAtEnd());
41671
+ }
41672
+ } else {
41673
+ caretPosition = getNormalizedRangeEndPoint(1, range);
41588
41674
 
41589
- if (isContentEditableFalse(caretPosition.getNode(true))) {
41590
- return showCaret(1, caretPosition.getNode(true), false);
41675
+ if (isContentEditableFalse(caretPosition.getNode())) {
41676
+ return showCaret(1, caretPosition.getNode(), !caretPosition.isAtEnd());
41677
+ }
41678
+
41679
+ if (isContentEditableFalse(caretPosition.getNode(true))) {
41680
+ return showCaret(1, caretPosition.getNode(true), false);
41681
+ }
41591
41682
  }
41592
41683
  }
41593
41684
 
@@ -45967,7 +46058,7 @@ define(
45967
46058
  * @property minorVersion
45968
46059
  * @type String
45969
46060
  */
45970
- minorVersion: '6.0',
46061
+ minorVersion: '6.1',
45971
46062
 
45972
46063
  /**
45973
46064
  * Release date of TinyMCE build.
@@ -45975,7 +46066,7 @@ define(
45975
46066
  * @property releaseDate
45976
46067
  * @type String
45977
46068
  */
45978
- releaseDate: '2017-05-04',
46069
+ releaseDate: '2017-05-10',
45979
46070
 
45980
46071
  /**
45981
46072
  * Collection of editor instances.
@@ -51257,7 +51348,7 @@ define(
51257
51348
 
51258
51349
  editor.addButton('fontsizeselect', function () {
51259
51350
  var items = [], defaultFontsizeFormats = '8pt 10pt 12pt 14pt 18pt 24pt 36pt';
51260
- var fontsizeFormats = editor.settings.fontsizeFormats || defaultFontsizeFormats;
51351
+ var fontsizeFormats = editor.settings.fontsize_formats || defaultFontsizeFormats;
51261
51352
 
51262
51353
  each(fontsizeFormats.split(' '), function (item) {
51263
51354
  var text = item, value = item;