tinymce-rails 3.5.2 → 3.5.4.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.
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/jquery.tinymce.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autolink/editor_plugin_src.js +181 -181
- data/vendor/assets/javascripts/tinymce/plugins/autoresize/editor_plugin_src.js +119 -119
- data/vendor/assets/javascripts/tinymce/plugins/autosave/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autosave/editor_plugin_src.js +4 -2
- data/vendor/assets/javascripts/tinymce/plugins/contextmenu/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/contextmenu/editor_plugin_src.js +9 -7
- data/vendor/assets/javascripts/tinymce/plugins/emotions/langs/en_dlg.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/example_dependency/editor_plugin_src.js +50 -50
- data/vendor/assets/javascripts/tinymce/plugins/lists/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/lists/editor_plugin_src.js +952 -951
- data/vendor/assets/javascripts/tinymce/plugins/media/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/media/editor_plugin_src.js +22 -14
- data/vendor/assets/javascripts/tinymce/plugins/media/langs/en_dlg.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/style/langs/en_dlg.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/style/props.htm +845 -845
- data/vendor/assets/javascripts/tinymce/plugins/style/readme.txt +19 -19
- data/vendor/assets/javascripts/tinymce/plugins/tabfocus/editor_plugin_src.js +122 -122
- data/vendor/assets/javascripts/tinymce/plugins/table/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/editor_plugin_src.js +1449 -1446
- data/vendor/assets/javascripts/tinymce/plugins/table/js/table.js +4 -1
- data/vendor/assets/javascripts/tinymce/themes/advanced/js/color_picker.js +345 -345
- data/vendor/assets/javascripts/tinymce/themes/advanced/langs/en_dlg.js +1 -1
- data/vendor/assets/javascripts/tinymce/themes/advanced/skins/default/content.css +0 -1
- data/vendor/assets/javascripts/tinymce/themes/advanced/skins/highcontrast/content.css +0 -1
- data/vendor/assets/javascripts/tinymce/themes/advanced/skins/o2k7/content.css +0 -1
- data/vendor/assets/javascripts/tinymce/themes/advanced/source_editor.htm +1 -1
- data/vendor/assets/javascripts/tinymce/tiny_mce.js +1 -1
- data/vendor/assets/javascripts/tinymce/tiny_mce_jquery.js +1 -1
- data/vendor/assets/javascripts/tinymce/tiny_mce_jquery_src.js +394 -158
- data/vendor/assets/javascripts/tinymce/tiny_mce_src.js +394 -158
- metadata +5 -4
@@ -6,9 +6,9 @@
|
|
6
6
|
var tinymce = {
|
7
7
|
majorVersion : '3',
|
8
8
|
|
9
|
-
minorVersion : '5.
|
9
|
+
minorVersion : '5.4.1',
|
10
10
|
|
11
|
-
releaseDate : '2012-
|
11
|
+
releaseDate : '2012-06-24',
|
12
12
|
|
13
13
|
_init : function() {
|
14
14
|
var t = this, d = document, na = navigator, ua = na.userAgent, i, nl, n, base, p, v;
|
@@ -1083,6 +1083,10 @@ tinymce.create('static tinymce.util.XHR', {
|
|
1083
1083
|
|
1084
1084
|
modifierPressed: function (e) {
|
1085
1085
|
return e.shiftKey || e.ctrlKey || e.altKey;
|
1086
|
+
},
|
1087
|
+
|
1088
|
+
metaKeyPressed: function(e) {
|
1089
|
+
return tinymce.isMac ? e.metaKey : e.ctrlKey;
|
1086
1090
|
}
|
1087
1091
|
};
|
1088
1092
|
})(tinymce);
|
@@ -1098,6 +1102,12 @@ tinymce.util.Quirks = function(editor) {
|
|
1098
1102
|
}
|
1099
1103
|
}
|
1100
1104
|
|
1105
|
+
function getDocumentMode() {
|
1106
|
+
var documentMode = editor.getDoc().documentMode;
|
1107
|
+
|
1108
|
+
return documentMode ? documentMode : 6;
|
1109
|
+
};
|
1110
|
+
|
1101
1111
|
function cleanupStylesWhenDeleting() {
|
1102
1112
|
function removeMergedFormatSpans(isDelete) {
|
1103
1113
|
var rng, blockElm, node, clonedSpan;
|
@@ -1157,74 +1167,58 @@ tinymce.util.Quirks = function(editor) {
|
|
1157
1167
|
};
|
1158
1168
|
|
1159
1169
|
function emptyEditorWhenDeleting() {
|
1160
|
-
function
|
1161
|
-
var
|
1162
|
-
|
1163
|
-
|
1164
|
-
|
1170
|
+
function serializeRng(rng) {
|
1171
|
+
var body = dom.create("body");
|
1172
|
+
var contents = rng.cloneContents();
|
1173
|
+
body.appendChild(contents);
|
1174
|
+
return selection.serializer.serialize(body, {format: 'html'});
|
1175
|
+
}
|
1165
1176
|
|
1166
|
-
|
1167
|
-
|
1168
|
-
container = container.childNodes[Math.min(start ? offset : (offset > 0 ? offset - 1 : 0), container.childNodes.length - 1)]
|
1169
|
-
}
|
1177
|
+
function allContentsSelected(rng) {
|
1178
|
+
var selection = serializeRng(rng);
|
1170
1179
|
|
1171
|
-
|
1172
|
-
|
1180
|
+
var allRng = dom.createRng();
|
1181
|
+
allRng.selectNode(editor.getBody());
|
1173
1182
|
|
1174
|
-
|
1175
|
-
|
1183
|
+
var allSelection = serializeRng(allRng);//console.log(selection, "----", allSelection);
|
1184
|
+
return selection === allSelection;
|
1185
|
+
}
|
1176
1186
|
|
1177
|
-
|
1178
|
-
|
1179
|
-
root = dom.getRoot();
|
1187
|
+
editor.onKeyDown.add(function(editor, e) {
|
1188
|
+
var keyCode = e.keyCode, isCollapsed;
|
1180
1189
|
|
1181
|
-
//
|
1182
|
-
if (
|
1183
|
-
|
1184
|
-
container = getEndPointNode(rng, start);
|
1190
|
+
// Empty the editor if it's needed for example backspace at <p><b>|</b></p>
|
1191
|
+
if (!e.isDefaultPrevented() && (keyCode == DELETE || keyCode == BACKSPACE)) {
|
1192
|
+
isCollapsed = editor.selection.isCollapsed();
|
1185
1193
|
|
1186
|
-
|
1187
|
-
|
1194
|
+
// Selection is collapsed but the editor isn't empty
|
1195
|
+
if (isCollapsed && !dom.isEmpty(editor.getBody())) {
|
1196
|
+
return;
|
1188
1197
|
}
|
1189
|
-
}
|
1190
1198
|
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
}
|
1195
|
-
|
1196
|
-
// Walk up the DOM tree to see if the endpoint is at the beginning/end of body
|
1197
|
-
while (container !== root) {
|
1198
|
-
childNode = container.parentNode[start ? 'firstChild' : 'lastChild'];
|
1199
|
-
|
1200
|
-
// If first/last element is a BR then jump to it's sibling in case: <p>x<br></p>
|
1201
|
-
if (childNode.nodeName == "BR") {
|
1202
|
-
childNode = childNode[start ? 'nextSibling' : 'previousSibling'] || childNode;
|
1199
|
+
// IE deletes all contents correctly when everything is selected
|
1200
|
+
if (tinymce.isIE && !isCollapsed) {
|
1201
|
+
return;
|
1203
1202
|
}
|
1204
1203
|
|
1205
|
-
//
|
1206
|
-
if (
|
1207
|
-
return
|
1204
|
+
// Selection isn't collapsed but not all the contents is selected
|
1205
|
+
if (!isCollapsed && !allContentsSelected(editor.selection.getRng())) {
|
1206
|
+
return;
|
1208
1207
|
}
|
1209
1208
|
|
1210
|
-
|
1209
|
+
// Manually empty the editor
|
1210
|
+
editor.setContent('');
|
1211
|
+
editor.selection.setCursorLocation(editor.getBody(), 0);
|
1212
|
+
editor.nodeChanged();
|
1211
1213
|
}
|
1214
|
+
});
|
1215
|
+
};
|
1212
1216
|
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
if (!e.isDefaultPrevented() && (keyCode == DELETE || keyCode == BACKSPACE)) {
|
1220
|
-
rng = selection.getRng(true);
|
1221
|
-
|
1222
|
-
if (isAtStartEndOfBody(rng, true) && isAtStartEndOfBody(rng, false) &&
|
1223
|
-
(rng.collapsed || dom.findCommonAncestor(getEndPointNode(rng, true), getEndPointNode(rng)) === dom.getRoot())) {
|
1224
|
-
editor.setContent('');
|
1225
|
-
editor.nodeChanged();
|
1226
|
-
e.preventDefault();
|
1227
|
-
}
|
1217
|
+
function selectAll() {
|
1218
|
+
editor.onKeyDown.add(function(editor, e) {
|
1219
|
+
if (e.keyCode == 65 && VK.metaKeyPressed(e)) {
|
1220
|
+
e.preventDefault();
|
1221
|
+
editor.execCommand('SelectAll');
|
1228
1222
|
}
|
1229
1223
|
});
|
1230
1224
|
};
|
@@ -1393,16 +1387,15 @@ tinymce.util.Quirks = function(editor) {
|
|
1393
1387
|
}
|
1394
1388
|
|
1395
1389
|
function addNewLinesBeforeBrInPre() {
|
1396
|
-
var documentMode = editor.getDoc().documentMode;
|
1397
|
-
|
1398
1390
|
// IE8+ rendering mode does the right thing with BR in PRE
|
1399
|
-
if (
|
1391
|
+
if (getDocumentMode() > 7) {
|
1400
1392
|
return;
|
1401
1393
|
}
|
1402
1394
|
|
1403
1395
|
// Enable display: none in area and add a specific class that hides all BR elements in PRE to
|
1404
1396
|
// avoid the caret from getting stuck at the BR elements while pressing the right arrow key
|
1405
1397
|
setEditorCommandState('RespectVisibilityInDesign', true);
|
1398
|
+
editor.contentStyles.push('.mceHideBrInPre pre br {display: none}');
|
1406
1399
|
dom.addClass(editor.getBody(), 'mceHideBrInPre');
|
1407
1400
|
|
1408
1401
|
// Adds a \n before all BR elements in PRE to get them visual
|
@@ -1608,13 +1601,105 @@ tinymce.util.Quirks = function(editor) {
|
|
1608
1601
|
editor.onSetContent.add(repaint);
|
1609
1602
|
};
|
1610
1603
|
|
1611
|
-
function
|
1604
|
+
function deleteControlItemOnBackSpace() {
|
1612
1605
|
editor.onKeyDown.add(function(editor, e) {
|
1613
|
-
|
1606
|
+
var rng;
|
1607
|
+
|
1608
|
+
if (!e.isDefaultPrevented() && e.keyCode == BACKSPACE) {
|
1609
|
+
rng = editor.getDoc().selection.createRange();
|
1610
|
+
if (rng && rng.item) {
|
1611
|
+
e.preventDefault();
|
1612
|
+
editor.undoManager.beforeChange();
|
1613
|
+
dom.remove(rng.item(0));
|
1614
|
+
editor.undoManager.add();
|
1615
|
+
}
|
1616
|
+
}
|
1617
|
+
});
|
1618
|
+
};
|
1619
|
+
|
1620
|
+
function renderEmptyBlocksFix() {
|
1621
|
+
var emptyBlocksCSS;
|
1622
|
+
|
1623
|
+
// IE10+
|
1624
|
+
if (getDocumentMode() >= 10) {
|
1625
|
+
emptyBlocksCSS = '';
|
1626
|
+
tinymce.each('p div h1 h2 h3 h4 h5 h6'.split(' '), function(name, i) {
|
1627
|
+
emptyBlocksCSS += (i > 0 ? ',' : '') + name + ':empty';
|
1628
|
+
});
|
1629
|
+
|
1630
|
+
editor.contentStyles.push(emptyBlocksCSS + '{padding-right: 1px !important}');
|
1631
|
+
}
|
1632
|
+
};
|
1633
|
+
|
1634
|
+
function fakeImageResize() {
|
1635
|
+
var mouseDownImg, startX, startY, startW, startH;
|
1636
|
+
|
1637
|
+
if (!settings.object_resizing || settings.webkit_fake_resize === false) {
|
1638
|
+
return;
|
1639
|
+
}
|
1640
|
+
|
1641
|
+
editor.contentStyles.push('.mceResizeImages img {cursor: se-resize !important}');
|
1642
|
+
|
1643
|
+
function resizeImage(e) {
|
1644
|
+
var deltaX, deltaY, ratio, width, height;
|
1645
|
+
|
1646
|
+
if (mouseDownImg) {
|
1647
|
+
deltaX = e.screenX - startX;
|
1648
|
+
deltaY = e.screenY - startY;
|
1649
|
+
ratio = Math.max((startW + deltaX) / startW, (startH + deltaY) / startH);
|
1650
|
+
|
1651
|
+
// Only update styles if the user draged one pixel or more
|
1652
|
+
if (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1) {
|
1653
|
+
// Constrain proportions
|
1654
|
+
width = Math.round(startW * ratio);
|
1655
|
+
height = Math.round(startH * ratio);
|
1656
|
+
|
1657
|
+
// Resize by using style or attribute
|
1658
|
+
if (mouseDownImg.style.width) {
|
1659
|
+
dom.setStyle(mouseDownImg, 'width', width);
|
1660
|
+
} else {
|
1661
|
+
dom.setAttrib(mouseDownImg, 'width', width);
|
1662
|
+
}
|
1663
|
+
|
1664
|
+
// Resize by using style or attribute
|
1665
|
+
if (mouseDownImg.style.height) {
|
1666
|
+
dom.setStyle(mouseDownImg, 'height', height);
|
1667
|
+
} else {
|
1668
|
+
dom.setAttrib(mouseDownImg, 'height', height);
|
1669
|
+
}
|
1670
|
+
|
1671
|
+
if (!dom.hasClass(editor.getBody(), 'mceResizeImages')) {
|
1672
|
+
dom.addClass(editor.getBody(), 'mceResizeImages');
|
1673
|
+
}
|
1674
|
+
}
|
1675
|
+
}
|
1676
|
+
};
|
1677
|
+
|
1678
|
+
editor.onMouseDown.add(function(editor, e) {
|
1679
|
+
var target = e.target;
|
1680
|
+
|
1681
|
+
if (target.nodeName == "IMG") {
|
1682
|
+
mouseDownImg = target;
|
1683
|
+
startX = e.screenX;
|
1684
|
+
startY = e.screenY;
|
1685
|
+
startW = mouseDownImg.clientWidth;
|
1686
|
+
startH = mouseDownImg.clientHeight;
|
1687
|
+
dom.bind(editor.getDoc(), 'mousemove', resizeImage);
|
1614
1688
|
e.preventDefault();
|
1615
|
-
|
1616
|
-
|
1617
|
-
|
1689
|
+
}
|
1690
|
+
});
|
1691
|
+
|
1692
|
+
// Unbind events on node change and restore resize cursor
|
1693
|
+
editor.onNodeChange.add(function() {
|
1694
|
+
if (mouseDownImg) {
|
1695
|
+
mouseDownImg = null;
|
1696
|
+
dom.unbind(editor.getDoc(), 'mousemove', resizeImage);
|
1697
|
+
}
|
1698
|
+
|
1699
|
+
if (selection.getNode().nodeName == "IMG") {
|
1700
|
+
dom.addClass(editor.getBody(), 'mceResizeImages');
|
1701
|
+
} else {
|
1702
|
+
dom.removeClass(editor.getBody(), 'mceResizeImages');
|
1618
1703
|
}
|
1619
1704
|
});
|
1620
1705
|
};
|
@@ -1635,6 +1720,9 @@ tinymce.util.Quirks = function(editor) {
|
|
1635
1720
|
// iOS
|
1636
1721
|
if (tinymce.isIDevice) {
|
1637
1722
|
selectionChangeNodeChanged();
|
1723
|
+
} else {
|
1724
|
+
fakeImageResize();
|
1725
|
+
selectAll();
|
1638
1726
|
}
|
1639
1727
|
}
|
1640
1728
|
|
@@ -1644,7 +1732,8 @@ tinymce.util.Quirks = function(editor) {
|
|
1644
1732
|
ensureBodyHasRoleApplication();
|
1645
1733
|
addNewLinesBeforeBrInPre();
|
1646
1734
|
removePreSerializedStylesWhenSelectingControls();
|
1647
|
-
|
1735
|
+
deleteControlItemOnBackSpace();
|
1736
|
+
renderEmptyBlocksFix();
|
1648
1737
|
}
|
1649
1738
|
|
1650
1739
|
// Gecko
|
@@ -2107,9 +2196,9 @@ tinymce.html.Styles = function(settings, schema) {
|
|
2107
2196
|
|
2108
2197
|
if (!html5) {
|
2109
2198
|
html5 = mapCache.html5 = unpack({
|
2110
|
-
A : 'id|accesskey|class|dir|draggable|item|hidden|itemprop|role|spellcheck|style|subject|title',
|
2199
|
+
A : 'id|accesskey|class|dir|draggable|item|hidden|itemprop|role|spellcheck|style|subject|title|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup',
|
2111
2200
|
B : '#|a|abbr|area|audio|b|bdo|br|button|canvas|cite|code|command|datalist|del|dfn|em|embed|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|meta|' +
|
2112
|
-
'meter|noscript|object|output|progress|q|ruby|samp|script|select|small|span|strong|sub|sup|svg|textarea|time|var|video',
|
2201
|
+
'meter|noscript|object|output|progress|q|ruby|samp|script|select|small|span|strong|sub|sup|svg|textarea|time|var|video|wbr',
|
2113
2202
|
C : '#|a|abbr|area|address|article|aside|audio|b|bdo|blockquote|br|button|canvas|cite|code|command|datalist|del|details|dfn|dialog|div|dl|em|embed|fieldset|' +
|
2114
2203
|
'figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|hr|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|menu|meta|meter|nav|noscript|ol|object|output|' +
|
2115
2204
|
'p|pre|progress|q|ruby|samp|script|section|select|small|span|strong|style|sub|sup|svg|table|textarea|time|ul|var|video'
|
@@ -2218,7 +2307,8 @@ tinymce.html.Styles = function(settings, schema) {
|
|
2218
2307
|
'tbody[A][tr]' +
|
2219
2308
|
'tr[A][th|td]' +
|
2220
2309
|
'th[A|headers|rowspan|colspan|scope][B]' +
|
2221
|
-
'td[A|headers|rowspan|colspan][C]'
|
2310
|
+
'td[A|headers|rowspan|colspan][C]' +
|
2311
|
+
'wbr[A][]'
|
2222
2312
|
);
|
2223
2313
|
}
|
2224
2314
|
|
@@ -2399,7 +2489,7 @@ tinymce.html.Styles = function(settings, schema) {
|
|
2399
2489
|
// Setup map objects
|
2400
2490
|
whiteSpaceElementsMap = createLookupTable('whitespace_elements', 'pre script style textarea');
|
2401
2491
|
selfClosingElementsMap = createLookupTable('self_closing_elements', 'colgroup dd dt li option p td tfoot th thead tr');
|
2402
|
-
shortEndedElementsMap = createLookupTable('short_ended_elements', 'area base basefont br col frame hr img input isindex link meta param embed source');
|
2492
|
+
shortEndedElementsMap = createLookupTable('short_ended_elements', 'area base basefont br col frame hr img input isindex link meta param embed source wbr');
|
2403
2493
|
boolAttrMap = createLookupTable('boolean_attributes', 'checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls');
|
2404
2494
|
nonEmptyElementsMap = createLookupTable('non_empty_elements', 'td th iframe video audio object', shortEndedElementsMap);
|
2405
2495
|
blockElementsMap = createLookupTable('block_elements', 'h1 h2 h3 h4 h5 h6 hr p div address pre form table tbody thead tfoot ' +
|
@@ -4657,7 +4747,7 @@ tinymce.dom = {};
|
|
4657
4747
|
|
4658
4748
|
// Old API supported multiple targets
|
4659
4749
|
if (target && target instanceof Array) {
|
4660
|
-
var i = target;
|
4750
|
+
var i = target.length;
|
4661
4751
|
|
4662
4752
|
while (i--) {
|
4663
4753
|
self.add(target[i], events, func, scope);
|
@@ -5499,6 +5589,32 @@ tinymce.dom.TreeWalker = function(start_node, root_node) {
|
|
5499
5589
|
return this.styles.serialize(o, name);
|
5500
5590
|
},
|
5501
5591
|
|
5592
|
+
addStyle: function(cssText) {
|
5593
|
+
var doc = this.doc, head;
|
5594
|
+
|
5595
|
+
// Create style element if needed
|
5596
|
+
styleElm = doc.getElementById('mceDefaultStyles');
|
5597
|
+
if (!styleElm) {
|
5598
|
+
styleElm = doc.createElement('style'),
|
5599
|
+
styleElm.id = 'mceDefaultStyles';
|
5600
|
+
styleElm.type = 'text/css';
|
5601
|
+
|
5602
|
+
head = doc.getElementsByTagName('head')[0]
|
5603
|
+
if (head.firstChild) {
|
5604
|
+
head.insertBefore(styleElm, head.firstChild);
|
5605
|
+
} else {
|
5606
|
+
head.appendChild(styleElm);
|
5607
|
+
}
|
5608
|
+
}
|
5609
|
+
|
5610
|
+
// Append style data to old or new style element
|
5611
|
+
if (styleElm.styleSheet) {
|
5612
|
+
styleElm.styleSheet.cssText += cssText;
|
5613
|
+
} else {
|
5614
|
+
styleElm.appendChild(doc.createTextNode(cssText));
|
5615
|
+
}
|
5616
|
+
},
|
5617
|
+
|
5502
5618
|
loadCSS : function(u) {
|
5503
5619
|
var t = this, d = t.doc, head;
|
5504
5620
|
|
@@ -5622,13 +5738,13 @@ tinymce.dom.TreeWalker = function(start_node, root_node) {
|
|
5622
5738
|
// This seems to fix this problem
|
5623
5739
|
|
5624
5740
|
// Create new div with HTML contents and a BR infront to keep comments
|
5625
|
-
|
5626
|
-
|
5741
|
+
var newElement = self.create('div');
|
5742
|
+
newElement.innerHTML = '<br />' + html;
|
5627
5743
|
|
5628
5744
|
// Add all children from div to target
|
5629
|
-
each (
|
5745
|
+
each (tinymce.grep(newElement.childNodes), function(node, i) {
|
5630
5746
|
// Skip br element
|
5631
|
-
if (i)
|
5747
|
+
if (i && element.canHaveHTML)
|
5632
5748
|
element.appendChild(node);
|
5633
5749
|
});
|
5634
5750
|
}
|
@@ -9069,7 +9185,7 @@ window.tinymce.dom.Sizzle = Sizzle;
|
|
9069
9185
|
},
|
9070
9186
|
|
9071
9187
|
getStart : function() {
|
9072
|
-
var rng =
|
9188
|
+
var self = this, rng = self.getRng(), startElement, parentElement, checkRng, node;
|
9073
9189
|
|
9074
9190
|
if (rng.duplicate || rng.item) {
|
9075
9191
|
// Control selection, return first item
|
@@ -9080,6 +9196,9 @@ window.tinymce.dom.Sizzle = Sizzle;
|
|
9080
9196
|
checkRng = rng.duplicate();
|
9081
9197
|
checkRng.collapse(1);
|
9082
9198
|
startElement = checkRng.parentElement();
|
9199
|
+
if (startElement.ownerDocument !== self.dom.doc) {
|
9200
|
+
startElement = self.dom.getRoot();
|
9201
|
+
}
|
9083
9202
|
|
9084
9203
|
// Check if range parent is inside the start element, then return the inner parent element
|
9085
9204
|
// This will fix issues when a single element is selected, IE would otherwise return the wrong start element
|
@@ -9106,31 +9225,34 @@ window.tinymce.dom.Sizzle = Sizzle;
|
|
9106
9225
|
},
|
9107
9226
|
|
9108
9227
|
getEnd : function() {
|
9109
|
-
var
|
9228
|
+
var self = this, rng = self.getRng(), endElement, endOffset;
|
9110
9229
|
|
9111
|
-
if (
|
9112
|
-
if (
|
9113
|
-
return
|
9230
|
+
if (rng.duplicate || rng.item) {
|
9231
|
+
if (rng.item)
|
9232
|
+
return rng.item(0);
|
9114
9233
|
|
9115
|
-
|
9116
|
-
|
9117
|
-
|
9234
|
+
rng = rng.duplicate();
|
9235
|
+
rng.collapse(0);
|
9236
|
+
endElement = rng.parentElement();
|
9237
|
+
if (endElement.ownerDocument !== self.dom.doc) {
|
9238
|
+
endElement = self.dom.getRoot();
|
9239
|
+
}
|
9118
9240
|
|
9119
|
-
if (
|
9120
|
-
return
|
9241
|
+
if (endElement && endElement.nodeName == 'BODY')
|
9242
|
+
return endElement.lastChild || endElement;
|
9121
9243
|
|
9122
|
-
return
|
9244
|
+
return endElement;
|
9123
9245
|
} else {
|
9124
|
-
|
9125
|
-
|
9246
|
+
endElement = rng.endContainer;
|
9247
|
+
endOffset = rng.endOffset;
|
9126
9248
|
|
9127
|
-
if (
|
9128
|
-
|
9249
|
+
if (endElement.nodeType == 1 && endElement.hasChildNodes())
|
9250
|
+
endElement = endElement.childNodes[endOffset > 0 ? endOffset - 1 : endOffset];
|
9129
9251
|
|
9130
|
-
if (
|
9131
|
-
return
|
9252
|
+
if (endElement && endElement.nodeType == 3)
|
9253
|
+
return endElement.parentNode;
|
9132
9254
|
|
9133
|
-
return
|
9255
|
+
return endElement;
|
9134
9256
|
}
|
9135
9257
|
},
|
9136
9258
|
|
@@ -11475,7 +11597,7 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
|
|
11475
11597
|
l = DOM.encode(s.label || '');
|
11476
11598
|
h = '<a role="button" id="' + this.id + '" href="javascript:;" class="' + cp + ' ' + cp + 'Enabled ' + s['class'] + (l ? ' ' + cp + 'Labeled' : '') +'" onmousedown="return false;" onclick="return false;" aria-labelledby="' + this.id + '_voice" title="' + DOM.encode(s.title) + '">';
|
11477
11599
|
if (s.image && !(this.editor &&this.editor.forcedHighContrastMode) )
|
11478
|
-
h += '<img class="mceIcon" src="' + s.image + '" alt="' + DOM.encode(s.title) + '"
|
11600
|
+
h += '<span class="mceIcon ' + s['class'] + '"><img class="mceIcon" src="' + s.image + '" alt="' + DOM.encode(s.title) + '" /></span>' + (l ? '<span class="' + cp + 'Label">' + l + '</span>' : '');
|
11479
11601
|
else
|
11480
11602
|
h += '<span class="mceIcon ' + s['class'] + '"></span>' + (l ? '<span class="' + cp + 'Label">' + l + '</span>' : '');
|
11481
11603
|
|
@@ -12183,6 +12305,16 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
|
|
12183
12305
|
DOM.select('a', t.id + '_menu')[0].focus(); // Select first link
|
12184
12306
|
}
|
12185
12307
|
|
12308
|
+
t.keyboardNav = new tinymce.ui.KeyboardNavigation({
|
12309
|
+
root: t.id + '_menu',
|
12310
|
+
items: DOM.select('a', t.id + '_menu'),
|
12311
|
+
onCancel: function() {
|
12312
|
+
t.hideMenu();
|
12313
|
+
t.focus();
|
12314
|
+
}
|
12315
|
+
});
|
12316
|
+
|
12317
|
+
t.keyboardNav.focus();
|
12186
12318
|
t.isMenuVisible = 1;
|
12187
12319
|
},
|
12188
12320
|
|
@@ -12203,6 +12335,7 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
|
|
12203
12335
|
|
12204
12336
|
t.isMenuVisible = 0;
|
12205
12337
|
t.onHideMenu.dispatch();
|
12338
|
+
t.keyboardNav.destroy();
|
12206
12339
|
}
|
12207
12340
|
},
|
12208
12341
|
|
@@ -12267,15 +12400,6 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
|
|
12267
12400
|
}
|
12268
12401
|
|
12269
12402
|
DOM.addClass(m, 'mceColorSplitMenu');
|
12270
|
-
|
12271
|
-
new tinymce.ui.KeyboardNavigation({
|
12272
|
-
root: t.id + '_menu',
|
12273
|
-
items: DOM.select('a', t.id + '_menu'),
|
12274
|
-
onCancel: function() {
|
12275
|
-
t.hideMenu();
|
12276
|
-
t.focus();
|
12277
|
-
}
|
12278
|
-
});
|
12279
12403
|
|
12280
12404
|
// Prevent IE from scrolling and hindering click to occur #4019
|
12281
12405
|
Event.add(t.id + '_menu', 'mousedown', function(e) {return Event.cancel(e);});
|
@@ -12317,11 +12441,17 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
|
|
12317
12441
|
},
|
12318
12442
|
|
12319
12443
|
destroy : function() {
|
12320
|
-
this
|
12444
|
+
var self = this;
|
12321
12445
|
|
12322
|
-
|
12323
|
-
|
12324
|
-
|
12446
|
+
self.parent();
|
12447
|
+
|
12448
|
+
Event.clear(self.id + '_menu');
|
12449
|
+
Event.clear(self.id + '_more');
|
12450
|
+
DOM.remove(self.id + '_menu');
|
12451
|
+
|
12452
|
+
if (self.keyboardNav) {
|
12453
|
+
self.keyboardNav.destroy();
|
12454
|
+
}
|
12325
12455
|
}
|
12326
12456
|
});
|
12327
12457
|
})(tinymce);
|
@@ -12965,6 +13095,8 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
12965
13095
|
|
12966
13096
|
self.contentCSS = [];
|
12967
13097
|
|
13098
|
+
self.contentStyles = [];
|
13099
|
+
|
12968
13100
|
// Creates all events like onClick, onSetContent etc see Editor.Events.js for the actual logic
|
12969
13101
|
self.setupEvents();
|
12970
13102
|
|
@@ -13156,12 +13288,6 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
13156
13288
|
|
13157
13289
|
t.controlManager = new tinymce.ControlManager(t);
|
13158
13290
|
|
13159
|
-
t.onExecCommand.add(function(ed, c) {
|
13160
|
-
// Don't refresh the select lists until caret move
|
13161
|
-
if (!/^(FontName|FontSize)$/.test(c))
|
13162
|
-
t.nodeChanged();
|
13163
|
-
});
|
13164
|
-
|
13165
13291
|
// Enables users to override the control factory
|
13166
13292
|
t.onBeforeRenderUI.dispatch(t, t.controlManager);
|
13167
13293
|
|
@@ -13321,7 +13447,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
13321
13447
|
},
|
13322
13448
|
|
13323
13449
|
initContentBody : function() {
|
13324
|
-
var self = this, settings = self.settings, targetElm = DOM.get(self.id), doc = self.getDoc(), html, body;
|
13450
|
+
var self = this, settings = self.settings, targetElm = DOM.get(self.id), doc = self.getDoc(), html, body, contentCssText;
|
13325
13451
|
|
13326
13452
|
// Setup iframe body
|
13327
13453
|
if ((!isIE || !tinymce.relaxedDomain) && !settings.content_editable) {
|
@@ -13430,6 +13556,12 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
13430
13556
|
self.enterKey = new tinymce.EnterKey(self);
|
13431
13557
|
self.editorCommands = new tinymce.EditorCommands(self);
|
13432
13558
|
|
13559
|
+
self.onExecCommand.add(function(editor, command) {
|
13560
|
+
// Don't refresh the select lists until caret move
|
13561
|
+
if (!/^(FontName|FontSize)$/.test(command))
|
13562
|
+
self.nodeChanged();
|
13563
|
+
});
|
13564
|
+
|
13433
13565
|
// Pass through
|
13434
13566
|
self.serializer.onPreProcess.add(function(se, o) {
|
13435
13567
|
return self.onPreProcess.dispatch(self, o, se);
|
@@ -13492,6 +13624,17 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
13492
13624
|
self.focus(true);
|
13493
13625
|
self.nodeChanged({initial : true});
|
13494
13626
|
|
13627
|
+
// Add editor specific CSS styles
|
13628
|
+
if (self.contentStyles.length > 0) {
|
13629
|
+
contentCssText = '';
|
13630
|
+
|
13631
|
+
each(self.contentStyles, function(style) {
|
13632
|
+
contentCssText += style + "\r\n";
|
13633
|
+
});
|
13634
|
+
|
13635
|
+
self.dom.addStyle(contentCssText);
|
13636
|
+
}
|
13637
|
+
|
13495
13638
|
// Load specified content CSS last
|
13496
13639
|
each(self.contentCSS, function(url) {
|
13497
13640
|
self.dom.loadCSS(url);
|
@@ -14119,7 +14262,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
14119
14262
|
return;
|
14120
14263
|
|
14121
14264
|
case 'A':
|
14122
|
-
if (!elm
|
14265
|
+
if (!dom.getAttrib(elm, 'href', false)) {
|
14123
14266
|
value = dom.getAttrib(elm, 'name') || elm.id;
|
14124
14267
|
cls = 'mceItemAnchor';
|
14125
14268
|
|
@@ -14148,13 +14291,12 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
14148
14291
|
// Don't clear the window or document if content editable
|
14149
14292
|
// is enabled since other instances might still be present
|
14150
14293
|
if (!self.settings.content_editable) {
|
14151
|
-
Event.
|
14152
|
-
Event.
|
14294
|
+
Event.unbind(self.getWin());
|
14295
|
+
Event.unbind(self.getDoc());
|
14153
14296
|
}
|
14154
14297
|
|
14155
|
-
Event.
|
14156
|
-
Event.clear(
|
14157
|
-
Event.unbind(elm);
|
14298
|
+
Event.unbind(self.getBody());
|
14299
|
+
Event.clear(elm);
|
14158
14300
|
|
14159
14301
|
self.execCallback('remove_instance_callback', self);
|
14160
14302
|
self.onRemove.dispatch(self);
|
@@ -14356,8 +14498,10 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
14356
14498
|
// Handle legacy handle_event_callback option
|
14357
14499
|
if (settings.handle_event_callback) {
|
14358
14500
|
self.onEvent.add(function(ed, e, o) {
|
14359
|
-
if (self.execCallback('handle_event_callback', e, ed, o) === false)
|
14360
|
-
|
14501
|
+
if (self.execCallback('handle_event_callback', e, ed, o) === false) {
|
14502
|
+
e.preventDefault();
|
14503
|
+
e.stopPropagation();
|
14504
|
+
}
|
14361
14505
|
});
|
14362
14506
|
}
|
14363
14507
|
|
@@ -14423,9 +14567,12 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
14423
14567
|
self.focus(true);
|
14424
14568
|
};
|
14425
14569
|
|
14426
|
-
function nodeChanged() {
|
14427
|
-
// Normalize selection for example <b>a</b><i>|a</i> becomes <b>a|</b><i>a</i>
|
14428
|
-
|
14570
|
+
function nodeChanged(ed, e) {
|
14571
|
+
// Normalize selection for example <b>a</b><i>|a</i> becomes <b>a|</b><i>a</i> except for Ctrl+A since it selects everything
|
14572
|
+
if (e.keyCode != 65 || !tinymce.VK.metaKeyPressed(e)) {
|
14573
|
+
self.selection.normalize();
|
14574
|
+
}
|
14575
|
+
|
14429
14576
|
self.nodeChanged();
|
14430
14577
|
}
|
14431
14578
|
|
@@ -14469,7 +14616,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
14469
14616
|
var keyCode = e.keyCode;
|
14470
14617
|
|
14471
14618
|
if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 13 || keyCode == 45 || keyCode == 46 || keyCode == 8 || (tinymce.isMac && (keyCode == 91 || keyCode == 93)) || e.ctrlKey)
|
14472
|
-
nodeChanged();
|
14619
|
+
nodeChanged(ed, e);
|
14473
14620
|
});
|
14474
14621
|
|
14475
14622
|
// Add reset handler
|
@@ -14896,6 +15043,10 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
|
|
14896
15043
|
editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, function() { return value }));
|
14897
15044
|
},
|
14898
15045
|
|
15046
|
+
mceToggleFormat : function(command, ui, value) {
|
15047
|
+
toggleFormat(value);
|
15048
|
+
},
|
15049
|
+
|
14899
15050
|
mceSetContent : function(command, ui, value) {
|
14900
15051
|
editor.setContent(value);
|
14901
15052
|
},
|
@@ -15284,7 +15435,7 @@ tinymce.ForceBlocks = function(editor) {
|
|
15284
15435
|
var settings = editor.settings, dom = editor.dom, selection = editor.selection, blockElements = editor.schema.getBlockElements();
|
15285
15436
|
|
15286
15437
|
function addRootBlocks() {
|
15287
|
-
var node = selection.getStart(), rootNode = editor.getBody(), rng, startContainer, startOffset, endContainer, endOffset, rootBlockNode, tempNode, offset = -0xFFFFFF, wrapped;
|
15438
|
+
var node = selection.getStart(), rootNode = editor.getBody(), rng, startContainer, startOffset, endContainer, endOffset, rootBlockNode, tempNode, offset = -0xFFFFFF, wrapped, isInEditorDocument;
|
15288
15439
|
|
15289
15440
|
if (!node || node.nodeType !== 1 || !settings.forced_root_block)
|
15290
15441
|
return;
|
@@ -15312,6 +15463,7 @@ tinymce.ForceBlocks = function(editor) {
|
|
15312
15463
|
rng.moveToElementText(node);
|
15313
15464
|
}
|
15314
15465
|
|
15466
|
+
isInEditorDocument = rng.parentElement().ownerDocument === editor.getDoc();
|
15315
15467
|
tmpRng = rng.duplicate();
|
15316
15468
|
tmpRng.collapse(true);
|
15317
15469
|
startOffset = tmpRng.move('character', offset) * -1;
|
@@ -15342,28 +15494,30 @@ tinymce.ForceBlocks = function(editor) {
|
|
15342
15494
|
}
|
15343
15495
|
}
|
15344
15496
|
|
15345
|
-
if (
|
15346
|
-
rng.setStart
|
15347
|
-
|
15348
|
-
|
15349
|
-
|
15350
|
-
|
15351
|
-
|
15352
|
-
|
15353
|
-
|
15354
|
-
|
15497
|
+
if (wrapped) {
|
15498
|
+
if (rng.setStart) {
|
15499
|
+
rng.setStart(startContainer, startOffset);
|
15500
|
+
rng.setEnd(endContainer, endOffset);
|
15501
|
+
selection.setRng(rng);
|
15502
|
+
} else {
|
15503
|
+
// Only select if the previous selection was inside the document to prevent auto focus in quirks mode
|
15504
|
+
if (isInEditorDocument) {
|
15505
|
+
try {
|
15506
|
+
rng = editor.getDoc().body.createTextRange();
|
15507
|
+
rng.moveToElementText(rootNode);
|
15508
|
+
rng.collapse(true);
|
15509
|
+
rng.moveStart('character', startOffset);
|
15355
15510
|
|
15356
|
-
|
15357
|
-
|
15511
|
+
if (endOffset > 0)
|
15512
|
+
rng.moveEnd('character', endOffset);
|
15358
15513
|
|
15359
|
-
|
15360
|
-
|
15361
|
-
|
15514
|
+
rng.select();
|
15515
|
+
} catch (ex) {
|
15516
|
+
// Ignore
|
15517
|
+
}
|
15518
|
+
}
|
15362
15519
|
}
|
15363
|
-
}
|
15364
15520
|
|
15365
|
-
// Only trigger nodeChange when we wrapped nodes to prevent a forever loop
|
15366
|
-
if (wrapped) {
|
15367
15521
|
editor.nodeChanged();
|
15368
15522
|
}
|
15369
15523
|
};
|
@@ -17949,7 +18103,7 @@ tinymce.onAddEditor.add(function(tinymce, ed) {
|
|
17949
18103
|
var TreeWalker = tinymce.dom.TreeWalker;
|
17950
18104
|
|
17951
18105
|
tinymce.EnterKey = function(editor) {
|
17952
|
-
var dom = editor.dom, selection = editor.selection, settings = editor.settings, undoManager = editor.undoManager;
|
18106
|
+
var dom = editor.dom, selection = editor.selection, settings = editor.settings, undoManager = editor.undoManager, nonEmptyElementsMap = editor.schema.getNonEmptyElements();
|
17953
18107
|
|
17954
18108
|
function handleEnterKey(evt) {
|
17955
18109
|
var rng = selection.getRng(true), tmpRng, editableRoot, container, offset, parentBlock, documentMode,
|
@@ -17959,11 +18113,48 @@ tinymce.onAddEditor.add(function(tinymce, ed) {
|
|
17959
18113
|
function canSplitBlock(node) {
|
17960
18114
|
return node &&
|
17961
18115
|
dom.isBlock(node) &&
|
17962
|
-
!/^(TD|TH|CAPTION)$/.test(node.nodeName) &&
|
18116
|
+
!/^(TD|TH|CAPTION|FORM)$/.test(node.nodeName) &&
|
17963
18117
|
!/^(fixed|absolute)/i.test(node.style.position) &&
|
17964
18118
|
dom.getContentEditable(node) !== "true";
|
17965
18119
|
};
|
17966
18120
|
|
18121
|
+
// Renders empty block on IE
|
18122
|
+
function renderBlockOnIE(block) {
|
18123
|
+
var oldRng;
|
18124
|
+
|
18125
|
+
if (tinymce.isIE && dom.isBlock(block)) {
|
18126
|
+
oldRng = selection.getRng();
|
18127
|
+
block.appendChild(dom.create('span', null, '\u00a0'));
|
18128
|
+
selection.select(block);
|
18129
|
+
block.lastChild.outerHTML = '';
|
18130
|
+
selection.setRng(oldRng);
|
18131
|
+
}
|
18132
|
+
};
|
18133
|
+
|
18134
|
+
// Remove the first empty inline element of the block so this: <p><b><em></em></b>x</p> becomes this: <p>x</p>
|
18135
|
+
function trimInlineElementsOnLeftSideOfBlock(block) {
|
18136
|
+
var node = block, firstChilds = [], i;
|
18137
|
+
|
18138
|
+
// Find inner most first child ex: <p><i><b>*</b></i></p>
|
18139
|
+
while (node = node.firstChild) {
|
18140
|
+
if (dom.isBlock(node)) {
|
18141
|
+
return;
|
18142
|
+
}
|
18143
|
+
|
18144
|
+
if (node.nodeType == 1 && !nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
|
18145
|
+
firstChilds.push(node);
|
18146
|
+
}
|
18147
|
+
}
|
18148
|
+
|
18149
|
+
i = firstChilds.length;
|
18150
|
+
while (i--) {
|
18151
|
+
node = firstChilds[i];
|
18152
|
+
if (!node.hasChildNodes() || (node.firstChild == node.lastChild && node.firstChild.nodeValue === '')) {
|
18153
|
+
dom.remove(node);
|
18154
|
+
}
|
18155
|
+
}
|
18156
|
+
};
|
18157
|
+
|
17967
18158
|
// Moves the caret to a suitable position within the root for example in the first non pure whitespace text node or before an image
|
17968
18159
|
function moveToCaretPosition(root) {
|
17969
18160
|
var walker, node, rng, y, viewPort, lastNode = root, tempElm;
|
@@ -17980,7 +18171,7 @@ tinymce.onAddEditor.add(function(tinymce, ed) {
|
|
17980
18171
|
break;
|
17981
18172
|
}
|
17982
18173
|
|
17983
|
-
if (
|
18174
|
+
if (nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
|
17984
18175
|
rng.setStartBefore(node);
|
17985
18176
|
rng.setEndBefore(node);
|
17986
18177
|
break;
|
@@ -18077,6 +18268,11 @@ tinymce.onAddEditor.add(function(tinymce, ed) {
|
|
18077
18268
|
return true;
|
18078
18269
|
}
|
18079
18270
|
|
18271
|
+
// If the caret if before the first element in parentBlock
|
18272
|
+
if (start && container.nodeType == 1 && container == parentBlock.firstChild) {
|
18273
|
+
return true;
|
18274
|
+
}
|
18275
|
+
|
18080
18276
|
// Caret can be before/after a table
|
18081
18277
|
if (container.nodeName === "TABLE" || (container.previousSibling && container.previousSibling.nodeName == "TABLE")) {
|
18082
18278
|
return (isAfterLastNodeInContainer && !start) || (!isAfterLastNodeInContainer && start);
|
@@ -18084,21 +18280,35 @@ tinymce.onAddEditor.add(function(tinymce, ed) {
|
|
18084
18280
|
|
18085
18281
|
// Walk the DOM and look for text nodes or non empty elements
|
18086
18282
|
walker = new TreeWalker(container, parentBlock);
|
18087
|
-
|
18283
|
+
|
18284
|
+
// If caret is in beginning or end of a text block then jump to the next/previous node
|
18285
|
+
if (container.nodeType == 3) {
|
18286
|
+
if (start && offset == 0) {
|
18287
|
+
walker.prev();
|
18288
|
+
} else if (!start && offset == container.nodeValue.length) {
|
18289
|
+
walker.next();
|
18290
|
+
}
|
18291
|
+
}
|
18292
|
+
|
18293
|
+
while (node = walker.current()) {
|
18088
18294
|
if (node.nodeType === 1) {
|
18089
18295
|
// Ignore bogus elements
|
18090
|
-
if (node.getAttribute('data-mce-bogus')) {
|
18091
|
-
|
18092
|
-
|
18093
|
-
|
18094
|
-
|
18095
|
-
|
18096
|
-
if (name === 'IMG') {
|
18097
|
-
return false;
|
18296
|
+
if (!node.getAttribute('data-mce-bogus')) {
|
18297
|
+
// Keep empty elements like <img /> <input /> but not trailing br:s like <p>text|<br></p>
|
18298
|
+
name = node.nodeName.toLowerCase();
|
18299
|
+
if (nonEmptyElementsMap[name] && name !== 'br') {
|
18300
|
+
return false;
|
18301
|
+
}
|
18098
18302
|
}
|
18099
18303
|
} else if (node.nodeType === 3 && !/^[ \t\r\n]*$/.test(node.nodeValue)) {
|
18100
18304
|
return false;
|
18101
18305
|
}
|
18306
|
+
|
18307
|
+
if (start) {
|
18308
|
+
walker.prev();
|
18309
|
+
} else {
|
18310
|
+
walker.next();
|
18311
|
+
}
|
18102
18312
|
}
|
18103
18313
|
|
18104
18314
|
return true;
|
@@ -18182,6 +18392,7 @@ tinymce.onAddEditor.add(function(tinymce, ed) {
|
|
18182
18392
|
} else if (isFirstOrLastLi()) {
|
18183
18393
|
// Last LI in list then temove LI and add text block after list
|
18184
18394
|
dom.insertAfter(newBlock, containerBlock);
|
18395
|
+
renderBlockOnIE(newBlock);
|
18185
18396
|
} else {
|
18186
18397
|
// Middle LI in list the split the list and insert a text block in the middle
|
18187
18398
|
// Extract after fragment and insert it after the current block
|
@@ -18273,6 +18484,22 @@ tinymce.onAddEditor.add(function(tinymce, ed) {
|
|
18273
18484
|
return parent !== root ? editableRoot : root;
|
18274
18485
|
};
|
18275
18486
|
|
18487
|
+
// Adds a BR at the end of blocks that only contains an IMG or INPUT since these might be floated and then they won't expand the block
|
18488
|
+
function addBrToBlockIfNeeded(block) {
|
18489
|
+
var lastChild;
|
18490
|
+
|
18491
|
+
// IE will render the blocks correctly other browsers needs a BR
|
18492
|
+
if (!tinymce.isIE) {
|
18493
|
+
block.normalize(); // Remove empty text nodes that got left behind by the extract
|
18494
|
+
|
18495
|
+
// Check if the block is empty or contains a floated last child
|
18496
|
+
lastChild = block.lastChild;
|
18497
|
+
if (!lastChild || (/^(left|right)$/gi.test(dom.getStyle(lastChild, 'float', true)))) {
|
18498
|
+
dom.add(block, 'br');
|
18499
|
+
}
|
18500
|
+
}
|
18501
|
+
};
|
18502
|
+
|
18276
18503
|
// Delete any selected contents
|
18277
18504
|
if (!rng.collapsed) {
|
18278
18505
|
editor.execCommand('Delete');
|
@@ -18295,7 +18522,11 @@ tinymce.onAddEditor.add(function(tinymce, ed) {
|
|
18295
18522
|
if (container.nodeType == 1 && container.hasChildNodes()) {
|
18296
18523
|
isAfterLastNodeInContainer = offset > container.childNodes.length - 1;
|
18297
18524
|
container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
|
18298
|
-
|
18525
|
+
if (isAfterLastNodeInContainer && container.nodeType == 3) {
|
18526
|
+
offset = container.nodeValue.length;
|
18527
|
+
} else {
|
18528
|
+
offset = 0;
|
18529
|
+
}
|
18299
18530
|
}
|
18300
18531
|
|
18301
18532
|
// Get editable root node normaly the body element but sometimes a div or span
|
@@ -18376,9 +18607,12 @@ tinymce.onAddEditor.add(function(tinymce, ed) {
|
|
18376
18607
|
} else {
|
18377
18608
|
dom.insertAfter(newBlock, parentBlock);
|
18378
18609
|
}
|
18610
|
+
|
18611
|
+
moveToCaretPosition(newBlock);
|
18379
18612
|
} else if (isCaretAtStartOrEndOfBlock(true)) {
|
18380
18613
|
// Insert new block before
|
18381
18614
|
newBlock = parentBlock.parentNode.insertBefore(createNewBlock(), parentBlock);
|
18615
|
+
renderBlockOnIE(newBlock);
|
18382
18616
|
} else {
|
18383
18617
|
// Extract after fragment and insert it after the current block
|
18384
18618
|
tmpRng = rng.cloneRange();
|
@@ -18387,10 +18621,12 @@ tinymce.onAddEditor.add(function(tinymce, ed) {
|
|
18387
18621
|
trimLeadingLineBreaks(fragment);
|
18388
18622
|
newBlock = fragment.firstChild;
|
18389
18623
|
dom.insertAfter(fragment, parentBlock);
|
18624
|
+
trimInlineElementsOnLeftSideOfBlock(newBlock);
|
18625
|
+
addBrToBlockIfNeeded(parentBlock);
|
18626
|
+
moveToCaretPosition(newBlock);
|
18390
18627
|
}
|
18391
18628
|
|
18392
18629
|
dom.setAttrib(newBlock, 'id', ''); // Remove ID since it needs to be document unique
|
18393
|
-
moveToCaretPosition(newBlock);
|
18394
18630
|
undoManager.add();
|
18395
18631
|
}
|
18396
18632
|
|