tinymce-rails 4.5.2 → 4.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/source/tinymce/tinymce.js +236 -102
- data/lib/tinymce/rails/helper.rb +14 -9
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autolink/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/codesample/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/fullpage/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/imagetools/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/importcss/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/link/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/searchreplace/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/spellchecker/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/textcolor/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/textpattern/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/toc/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/visualchars/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/wordcount/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/themes/inlite/theme.js +1 -1
- data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
- data/vendor/assets/javascripts/tinymce/tinymce.js +12 -12
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9808866a3ad5c5a46861b01522aafb0dba776911
|
4
|
+
data.tar.gz: be58c3335fbd9f2dc321ca66936752345ab1b636
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85cbf78343282ee27f87884ab317ade4521eb490200883d3d754ac2b2169973ff08bbbf38c8da9a6897f1df9774e035c9569d6cd27a56437dca0ae649d8d8f31
|
7
|
+
data.tar.gz: 54a027cc2c06eb045f295e3564a1729c81ca03cf5535841aaab89b1734370876241bf841738f32d14940ca44a8850b4227602cdf0c1464c188225e2f53922676
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// 4.5.
|
1
|
+
// 4.5.3 (2017-02-01)
|
2
2
|
|
3
3
|
/**
|
4
4
|
* Compiled inline version. (Library mode)
|
@@ -7854,7 +7854,7 @@ define("tinymce/dom/DOMUtils", [
|
|
7854
7854
|
* @method getParent
|
7855
7855
|
* @param {Node/String} node DOM node to search parents on or ID string.
|
7856
7856
|
* @param {function} selector Selection function or CSS selector to execute on each node.
|
7857
|
-
* @param {Node} root Optional root element, never go
|
7857
|
+
* @param {Node} root Optional root element, never go beyond this point.
|
7858
7858
|
* @return {Node} DOM Node or null if it wasn't found.
|
7859
7859
|
*/
|
7860
7860
|
getParent: function(node, selector, root) {
|
@@ -7868,7 +7868,7 @@ define("tinymce/dom/DOMUtils", [
|
|
7868
7868
|
* @method getParents
|
7869
7869
|
* @param {Node/String} node DOM node to search parents on or ID string.
|
7870
7870
|
* @param {function} selector Selection function to execute on each node or CSS pattern.
|
7871
|
-
* @param {Node} root Optional root element, never go
|
7871
|
+
* @param {Node} root Optional root element, never go beyond this point.
|
7872
7872
|
* @return {Array} Array of nodes or null if it wasn't found.
|
7873
7873
|
*/
|
7874
7874
|
getParents: function(node, selector, root, collect) {
|
@@ -8981,12 +8981,13 @@ define("tinymce/dom/DOMUtils", [
|
|
8981
8981
|
* @return {Boolean} true/false if the node is empty or not.
|
8982
8982
|
*/
|
8983
8983
|
isEmpty: function(node, elements) {
|
8984
|
-
var self = this, i, attributes, type, walker, name, brCount = 0;
|
8984
|
+
var self = this, i, attributes, type, whitespace, walker, name, brCount = 0;
|
8985
8985
|
|
8986
8986
|
node = node.firstChild;
|
8987
8987
|
if (node) {
|
8988
8988
|
walker = new TreeWalker(node, node.parentNode);
|
8989
8989
|
elements = elements || (self.schema ? self.schema.getNonEmptyElements() : null);
|
8990
|
+
whitespace = self.schema ? self.schema.getWhiteSpaceElements() : {};
|
8990
8991
|
|
8991
8992
|
do {
|
8992
8993
|
type = node.nodeType;
|
@@ -9029,7 +9030,12 @@ define("tinymce/dom/DOMUtils", [
|
|
9029
9030
|
}
|
9030
9031
|
|
9031
9032
|
// Keep non whitespace text nodes
|
9032
|
-
if (
|
9033
|
+
if (type === 3 && !whiteSpaceRegExp.test(node.nodeValue)) {
|
9034
|
+
return false;
|
9035
|
+
}
|
9036
|
+
|
9037
|
+
// Keep whitespace preserve elements
|
9038
|
+
if (type === 3 && node.parentNode && whitespace[node.parentNode.nodeName] && whiteSpaceRegExp.test(node.nodeValue)) {
|
9033
9039
|
return false;
|
9034
9040
|
}
|
9035
9041
|
|
@@ -11558,11 +11564,14 @@ define("tinymce/html/Node", [], function() {
|
|
11558
11564
|
* node.isEmpty({img: true});
|
11559
11565
|
* @method isEmpty
|
11560
11566
|
* @param {Object} elements Name/value object with elements that are automatically treated as non empty elements.
|
11567
|
+
* @param {Object} whitespace Name/value object with elements that are automatically treated whitespace preservables.
|
11561
11568
|
* @return {Boolean} true/false if the node is empty or not.
|
11562
11569
|
*/
|
11563
|
-
isEmpty: function(elements) {
|
11570
|
+
isEmpty: function(elements, whitespace) {
|
11564
11571
|
var self = this, node = self.firstChild, i, name;
|
11565
11572
|
|
11573
|
+
whitespace = whitespace || {};
|
11574
|
+
|
11566
11575
|
if (node) {
|
11567
11576
|
do {
|
11568
11577
|
if (node.type === 1) {
|
@@ -11592,7 +11601,12 @@ define("tinymce/html/Node", [], function() {
|
|
11592
11601
|
}
|
11593
11602
|
|
11594
11603
|
// Keep non whitespace text nodes
|
11595
|
-
if (
|
11604
|
+
if (node.type === 3 && !whiteSpaceRegExp.test(node.value)) {
|
11605
|
+
return false;
|
11606
|
+
}
|
11607
|
+
|
11608
|
+
// Keep whitespace preserve elements
|
11609
|
+
if (node.type === 3 && node.parent && whitespace[node.parent.name] && whiteSpaceRegExp.test(node.value)) {
|
11596
11610
|
return false;
|
11597
11611
|
}
|
11598
11612
|
} while ((node = walk(node, self)));
|
@@ -12026,13 +12040,17 @@ define("tinymce/html/Schema", [
|
|
12026
12040
|
validClasses = compileElementMap(settings.valid_classes, 'map');
|
12027
12041
|
|
12028
12042
|
// Setup map objects
|
12029
|
-
whiteSpaceElementsMap = createLookupTable(
|
12043
|
+
whiteSpaceElementsMap = createLookupTable(
|
12044
|
+
'whitespace_elements',
|
12045
|
+
'pre script noscript style textarea video audio iframe object code'
|
12046
|
+
);
|
12030
12047
|
selfClosingElementsMap = createLookupTable('self_closing_elements', 'colgroup dd dt li option p td tfoot th thead tr');
|
12031
12048
|
shortEndedElementsMap = createLookupTable('short_ended_elements', 'area base basefont br col frame hr img input isindex link ' +
|
12032
12049
|
'meta param embed source wbr track');
|
12033
12050
|
boolAttrMap = createLookupTable('boolean_attributes', 'checked compact declare defer disabled ismap multiple nohref noresize ' +
|
12034
12051
|
'noshade nowrap readonly selected autoplay loop controls');
|
12035
|
-
nonEmptyElementsMap = createLookupTable('non_empty_elements', 'td th iframe video audio object
|
12052
|
+
nonEmptyElementsMap = createLookupTable('non_empty_elements', 'td th iframe video audio object ' +
|
12053
|
+
'script pre code', shortEndedElementsMap);
|
12036
12054
|
moveCaretBeforeOnEnterElementsMap = createLookupTable('move_caret_before_on_enter_elements', 'table', nonEmptyElementsMap);
|
12037
12055
|
textBlockElementsMap = createLookupTable('text_block_elements', 'h1 h2 h3 h4 h5 h6 p div address pre form ' +
|
12038
12056
|
'blockquote center dir fieldset header footer article section hgroup aside nav figure');
|
@@ -13173,6 +13191,18 @@ define("tinymce/html/DomParser", [
|
|
13173
13191
|
], function(Node, Schema, SaxParser, Tools) {
|
13174
13192
|
var makeMap = Tools.makeMap, each = Tools.each, explode = Tools.explode, extend = Tools.extend;
|
13175
13193
|
|
13194
|
+
var paddEmptyNode = function (settings, node) {
|
13195
|
+
if (settings.padd_empty_with_br) {
|
13196
|
+
node.empty().append(new Node('br', '1')).shortEnded = true;
|
13197
|
+
} else {
|
13198
|
+
node.empty().append(new Node('#text', '3')).value = '\u00a0';
|
13199
|
+
}
|
13200
|
+
};
|
13201
|
+
|
13202
|
+
var hasOnlyChild = function (node, name) {
|
13203
|
+
return node && node.firstChild === node.lastChild && node.firstChild.name === name;
|
13204
|
+
};
|
13205
|
+
|
13176
13206
|
/**
|
13177
13207
|
* Constructs a new DomParser instance.
|
13178
13208
|
*
|
@@ -13191,10 +13221,11 @@ define("tinymce/html/DomParser", [
|
|
13191
13221
|
|
13192
13222
|
function fixInvalidChildren(nodes) {
|
13193
13223
|
var ni, node, parent, parents, newParent, currentNode, tempNode, childNode, i;
|
13194
|
-
var nonEmptyElements, nonSplitableElements, textBlockElements, specialElements, sibling, nextNode;
|
13224
|
+
var nonEmptyElements, whitespaceElements, nonSplitableElements, textBlockElements, specialElements, sibling, nextNode;
|
13195
13225
|
|
13196
13226
|
nonSplitableElements = makeMap('tr,td,th,tbody,thead,tfoot,table');
|
13197
13227
|
nonEmptyElements = schema.getNonEmptyElements();
|
13228
|
+
whitespaceElements = schema.getWhiteSpaceElements();
|
13198
13229
|
textBlockElements = schema.getTextBlockElements();
|
13199
13230
|
specialElements = schema.getSpecialElements();
|
13200
13231
|
|
@@ -13261,7 +13292,7 @@ define("tinymce/html/DomParser", [
|
|
13261
13292
|
currentNode = tempNode;
|
13262
13293
|
}
|
13263
13294
|
|
13264
|
-
if (!newParent.isEmpty(nonEmptyElements)) {
|
13295
|
+
if (!newParent.isEmpty(nonEmptyElements, whitespaceElements)) {
|
13265
13296
|
parent.insert(newParent, parents[0], true);
|
13266
13297
|
parent.insert(node, newParent);
|
13267
13298
|
} else {
|
@@ -13270,7 +13301,7 @@ define("tinymce/html/DomParser", [
|
|
13270
13301
|
|
13271
13302
|
// Check if the element is empty by looking through it's contents and special treatment for <p><br /></p>
|
13272
13303
|
parent = parents[0];
|
13273
|
-
if (parent.isEmpty(nonEmptyElements) || parent
|
13304
|
+
if (parent.isEmpty(nonEmptyElements, whitespaceElements) || hasOnlyChild(parent, 'br')) {
|
13274
13305
|
parent.empty().remove();
|
13275
13306
|
}
|
13276
13307
|
} else if (node.parent) {
|
@@ -13729,9 +13760,9 @@ define("tinymce/html/DomParser", [
|
|
13729
13760
|
|
13730
13761
|
// Handle empty nodes
|
13731
13762
|
if (elementRule.removeEmpty || elementRule.paddEmpty) {
|
13732
|
-
if (node.isEmpty(nonEmptyElements)) {
|
13763
|
+
if (node.isEmpty(nonEmptyElements, whiteSpaceElements)) {
|
13733
13764
|
if (elementRule.paddEmpty) {
|
13734
|
-
|
13765
|
+
paddEmptyNode(settings, node);
|
13735
13766
|
} else {
|
13736
13767
|
// Leave nodes that have a name like <a name="name">
|
13737
13768
|
if (!node.attributes.map.name && !node.attributes.map.id) {
|
@@ -13825,6 +13856,7 @@ define("tinymce/html/DomParser", [
|
|
13825
13856
|
self.addNodeFilter('br', function(nodes) {
|
13826
13857
|
var i, l = nodes.length, node, blockElements = extend({}, schema.getBlockElements());
|
13827
13858
|
var nonEmptyElements = schema.getNonEmptyElements(), parent, lastParent, prev, prevName;
|
13859
|
+
var whiteSpaceElements = schema.getNonEmptyElements();
|
13828
13860
|
var elementRule, textNode;
|
13829
13861
|
|
13830
13862
|
// Remove brs from body element as well
|
@@ -13863,7 +13895,7 @@ define("tinymce/html/DomParser", [
|
|
13863
13895
|
node.remove();
|
13864
13896
|
|
13865
13897
|
// Is the parent to be considered empty after we removed the BR
|
13866
|
-
if (parent.isEmpty(nonEmptyElements)) {
|
13898
|
+
if (parent.isEmpty(nonEmptyElements, whiteSpaceElements)) {
|
13867
13899
|
elementRule = schema.getElementRule(parent.name);
|
13868
13900
|
|
13869
13901
|
// Remove or padd the element depending on schema rule
|
@@ -13871,7 +13903,7 @@ define("tinymce/html/DomParser", [
|
|
13871
13903
|
if (elementRule.removeEmpty) {
|
13872
13904
|
parent.remove();
|
13873
13905
|
} else if (elementRule.paddEmpty) {
|
13874
|
-
|
13906
|
+
paddEmptyNode(settings, parent);
|
13875
13907
|
}
|
13876
13908
|
}
|
13877
13909
|
}
|
@@ -13890,7 +13922,7 @@ define("tinymce/html/DomParser", [
|
|
13890
13922
|
parent = parent.parent;
|
13891
13923
|
}
|
13892
13924
|
|
13893
|
-
if (lastParent === parent) {
|
13925
|
+
if (lastParent === parent && settings.padd_empty_with_br !== true) {
|
13894
13926
|
textNode = new Node('#text', 3);
|
13895
13927
|
textNode.value = '\u00a0';
|
13896
13928
|
node.replace(textNode);
|
@@ -13954,6 +13986,27 @@ define("tinymce/html/DomParser", [
|
|
13954
13986
|
});
|
13955
13987
|
}
|
13956
13988
|
|
13989
|
+
if (settings.fix_list_elements) {
|
13990
|
+
self.addNodeFilter('ul,ol', function(nodes) {
|
13991
|
+
var i = nodes.length, node, parentNode;
|
13992
|
+
|
13993
|
+
while (i--) {
|
13994
|
+
node = nodes[i];
|
13995
|
+
parentNode = node.parent;
|
13996
|
+
|
13997
|
+
if (parentNode.name === 'ul' || parentNode.name === 'ol') {
|
13998
|
+
if (node.prev && node.prev.name === 'li') {
|
13999
|
+
node.prev.append(node);
|
14000
|
+
} else {
|
14001
|
+
var li = new Node('li', 1);
|
14002
|
+
li.attr('style', 'list-style-type: none');
|
14003
|
+
node.wrap(li);
|
14004
|
+
}
|
14005
|
+
}
|
14006
|
+
}
|
14007
|
+
});
|
14008
|
+
}
|
14009
|
+
|
13957
14010
|
if (settings.validate && schema.getValidClasses()) {
|
13958
14011
|
self.addAttributeFilter('class', function(nodes) {
|
13959
14012
|
var i = nodes.length, node, classList, ci, className, classValue;
|
@@ -14471,7 +14524,7 @@ define("tinymce/dom/Serializer", [
|
|
14471
14524
|
bogusAllRegExp.lastIndex = index - matchLength;
|
14472
14525
|
}
|
14473
14526
|
|
14474
|
-
return
|
14527
|
+
return content;
|
14475
14528
|
}
|
14476
14529
|
|
14477
14530
|
/**
|
@@ -14660,24 +14713,6 @@ define("tinymce/dom/Serializer", [
|
|
14660
14713
|
}
|
14661
14714
|
});
|
14662
14715
|
|
14663
|
-
// Fix list elements, TODO: Replace this later
|
14664
|
-
if (settings.fix_list_elements) {
|
14665
|
-
htmlParser.addNodeFilter('ul,ol', function(nodes) {
|
14666
|
-
var i = nodes.length, node, parentNode;
|
14667
|
-
|
14668
|
-
while (i--) {
|
14669
|
-
node = nodes[i];
|
14670
|
-
parentNode = node.parent;
|
14671
|
-
|
14672
|
-
if (parentNode.name === 'ul' || parentNode.name === 'ol') {
|
14673
|
-
if (node.prev && node.prev.name === 'li') {
|
14674
|
-
node.prev.append(node);
|
14675
|
-
}
|
14676
|
-
}
|
14677
|
-
}
|
14678
|
-
});
|
14679
|
-
}
|
14680
|
-
|
14681
14716
|
// Remove internal data attributes
|
14682
14717
|
htmlParser.addAttributeFilter(
|
14683
14718
|
'data-mce-src,data-mce-href,data-mce-style,' +
|
@@ -19176,10 +19211,11 @@ define("tinymce/Formatter", [
|
|
19176
19211
|
"tinymce/dom/RangeUtils",
|
19177
19212
|
"tinymce/dom/BookmarkManager",
|
19178
19213
|
"tinymce/dom/ElementUtils",
|
19214
|
+
"tinymce/util/Fun",
|
19179
19215
|
"tinymce/util/Tools",
|
19180
19216
|
"tinymce/fmt/Preview",
|
19181
19217
|
"tinymce/fmt/Hooks"
|
19182
|
-
], function(TreeWalker, RangeUtils, BookmarkManager, ElementUtils, Tools, Preview, Hooks) {
|
19218
|
+
], function(TreeWalker, RangeUtils, BookmarkManager, ElementUtils, Fun, Tools, Preview, Hooks) {
|
19183
19219
|
/**
|
19184
19220
|
* Constructs a new formatter instance.
|
19185
19221
|
*
|
@@ -19782,15 +19818,38 @@ define("tinymce/Formatter", [
|
|
19782
19818
|
return count;
|
19783
19819
|
}
|
19784
19820
|
|
19785
|
-
function
|
19786
|
-
var child
|
19787
|
-
|
19788
|
-
|
19789
|
-
if (node.nodeType == 1 && !isBookmarkNode(node) && !isCaretNode(node)) {
|
19821
|
+
function getChildElementNode(root) {
|
19822
|
+
var child = false;
|
19823
|
+
each(root.childNodes, function(node) {
|
19824
|
+
if (isElementNode(node)) {
|
19790
19825
|
child = node;
|
19791
|
-
return
|
19826
|
+
return false; // break loop
|
19792
19827
|
}
|
19793
19828
|
});
|
19829
|
+
return child;
|
19830
|
+
}
|
19831
|
+
|
19832
|
+
function matchNestedWrapper(node, filter) {
|
19833
|
+
do {
|
19834
|
+
if (getChildCount(node) !== 1) {
|
19835
|
+
break;
|
19836
|
+
}
|
19837
|
+
|
19838
|
+
node = getChildElementNode(node);
|
19839
|
+
if (!node) {
|
19840
|
+
break;
|
19841
|
+
} else if (filter(node)) {
|
19842
|
+
return node;
|
19843
|
+
}
|
19844
|
+
} while (node);
|
19845
|
+
|
19846
|
+
return null;
|
19847
|
+
}
|
19848
|
+
|
19849
|
+
function mergeStyles(node) {
|
19850
|
+
var child, clone;
|
19851
|
+
|
19852
|
+
child = getChildElementNode(node);
|
19794
19853
|
|
19795
19854
|
// If child was found and of the same type as the current node
|
19796
19855
|
if (child && !isBookmarkNode(child) && matchName(child, format)) {
|
@@ -19814,6 +19873,15 @@ define("tinymce/Formatter", [
|
|
19814
19873
|
return;
|
19815
19874
|
}
|
19816
19875
|
|
19876
|
+
// fontSize defines the line height for the whole branch of nested style wrappers,
|
19877
|
+
// therefore it should be set on the outermost wrapper
|
19878
|
+
if (!isBlock(node) && !getStyle(node, 'fontSize')) {
|
19879
|
+
var styleNode = matchNestedWrapper(node, hasStyle('fontSize'));
|
19880
|
+
if (styleNode) {
|
19881
|
+
apply('fontsize', {value: getStyle(styleNode, 'fontSize')}, node);
|
19882
|
+
}
|
19883
|
+
}
|
19884
|
+
|
19817
19885
|
if (format.inline || format.wrapper) {
|
19818
19886
|
// Merges the current node with it's children of similar type to reduce the number of elements
|
19819
19887
|
if (!format.exact && childCount === 1) {
|
@@ -19834,19 +19902,20 @@ define("tinymce/Formatter", [
|
|
19834
19902
|
});
|
19835
19903
|
});
|
19836
19904
|
|
19837
|
-
// Remove
|
19905
|
+
// Remove format if direct parent already has the same format
|
19838
19906
|
if (matchNode(node.parentNode, name, vars)) {
|
19839
|
-
|
19840
|
-
|
19841
|
-
|
19907
|
+
if (removeFormat(format, vars, node)) {
|
19908
|
+
node = 0;
|
19909
|
+
}
|
19842
19910
|
}
|
19843
19911
|
|
19844
|
-
//
|
19912
|
+
// Remove format if any ancestor already has the same format
|
19845
19913
|
if (format.merge_with_parents) {
|
19846
19914
|
dom.getParent(node.parentNode, function(parent) {
|
19847
19915
|
if (matchNode(parent, name, vars)) {
|
19848
|
-
|
19849
|
-
|
19916
|
+
if (removeFormat(format, vars, node)) {
|
19917
|
+
node = 0;
|
19918
|
+
}
|
19850
19919
|
return TRUE;
|
19851
19920
|
}
|
19852
19921
|
});
|
@@ -19902,10 +19971,20 @@ define("tinymce/Formatter", [
|
|
19902
19971
|
bookmark = selection.getBookmark();
|
19903
19972
|
applyRngStyle(expandRng(selection.getRng(TRUE), formatList), bookmark);
|
19904
19973
|
|
19905
|
-
|
19906
|
-
|
19907
|
-
|
19908
|
-
|
19974
|
+
if (format.styles) {
|
19975
|
+
// Colored nodes should be underlined so that the color of the underline matches the text color.
|
19976
|
+
if (format.styles.color || format.styles.textDecoration) {
|
19977
|
+
walk(curSelNode, processUnderlineAndColor, 'childNodes');
|
19978
|
+
processUnderlineAndColor(curSelNode);
|
19979
|
+
}
|
19980
|
+
|
19981
|
+
// nodes with font-size should have their own background color as well to fit the line-height (see TINY-882)
|
19982
|
+
if (format.styles.backgroundColor) {
|
19983
|
+
processChildElements(curSelNode,
|
19984
|
+
hasStyle('fontSize'),
|
19985
|
+
applyStyle('backgroundColor', replaceVars(format.styles.backgroundColor, vars))
|
19986
|
+
);
|
19987
|
+
}
|
19909
19988
|
}
|
19910
19989
|
|
19911
19990
|
selection.moveToBookmark(bookmark);
|
@@ -20558,6 +20637,35 @@ define("tinymce/Formatter", [
|
|
20558
20637
|
return str1.toLowerCase() == str2.toLowerCase();
|
20559
20638
|
}
|
20560
20639
|
|
20640
|
+
function processChildElements(node, filter, process) {
|
20641
|
+
each(node.childNodes, function(node) {
|
20642
|
+
if (isElementNode(node)) {
|
20643
|
+
if (filter(node)) {
|
20644
|
+
process(node);
|
20645
|
+
}
|
20646
|
+
if (node.hasChildNodes()) {
|
20647
|
+
processChildElements(node, filter, process);
|
20648
|
+
}
|
20649
|
+
}
|
20650
|
+
});
|
20651
|
+
}
|
20652
|
+
|
20653
|
+
function isElementNode(node) {
|
20654
|
+
return node.nodeType == 1 && !isBookmarkNode(node) && !isWhiteSpaceNode(node) && !isCaretNode(node);
|
20655
|
+
}
|
20656
|
+
|
20657
|
+
function hasStyle(name) {
|
20658
|
+
return Fun.curry(function(name, node) {
|
20659
|
+
return !!(node && getStyle(node, name));
|
20660
|
+
}, name);
|
20661
|
+
}
|
20662
|
+
|
20663
|
+
function applyStyle(name, value) {
|
20664
|
+
return Fun.curry(function(name, value, node) {
|
20665
|
+
dom.setStyle(node, name, value);
|
20666
|
+
}, name, value);
|
20667
|
+
}
|
20668
|
+
|
20561
20669
|
/**
|
20562
20670
|
* Returns the style by name on the specified node. This method modifies the style
|
20563
20671
|
* contents to make it more easy to match. This will resolve a few browser issues.
|
@@ -21945,14 +22053,15 @@ define("tinymce/undo/Levels", [
|
|
21945
22053
|
};
|
21946
22054
|
|
21947
22055
|
var createFromEditor = function (editor) {
|
21948
|
-
var fragments, content;
|
22056
|
+
var fragments, content, trimmedFragments;
|
21949
22057
|
|
21950
22058
|
fragments = Fragments.read(editor.getBody());
|
21951
|
-
|
22059
|
+
trimmedFragments = Arr.map(fragments, function (html) {
|
21952
22060
|
return editor.serializer.trimContent(html);
|
21953
|
-
})
|
22061
|
+
});
|
22062
|
+
content = trimmedFragments.join('');
|
21954
22063
|
|
21955
|
-
return hasIframes(content) ? createFragmentedLevel(
|
22064
|
+
return hasIframes(content) ? createFragmentedLevel(trimmedFragments) : createCompleteLevel(content);
|
21956
22065
|
};
|
21957
22066
|
|
21958
22067
|
var applyToEditor = function (editor, level, before) {
|
@@ -22002,9 +22111,8 @@ define("tinymce/undo/Levels", [
|
|
22002
22111
|
define("tinymce/UndoManager", [
|
22003
22112
|
"tinymce/util/VK",
|
22004
22113
|
"tinymce/util/Tools",
|
22005
|
-
"tinymce/undo/Levels"
|
22006
|
-
|
22007
|
-
], function(VK, Tools, Levels, Env) {
|
22114
|
+
"tinymce/undo/Levels"
|
22115
|
+
], function(VK, Tools, Levels) {
|
22008
22116
|
return function(editor) {
|
22009
22117
|
var self = this, index = 0, data = [], beforeBookmark, isFirstTypedCharacter, locks = 0;
|
22010
22118
|
|
@@ -22069,7 +22177,7 @@ define("tinymce/UndoManager", [
|
|
22069
22177
|
editor.nodeChanged();
|
22070
22178
|
}
|
22071
22179
|
|
22072
|
-
if (keyCode === 46 || keyCode === 8
|
22180
|
+
if (keyCode === 46 || keyCode === 8) {
|
22073
22181
|
editor.nodeChanged();
|
22074
22182
|
}
|
22075
22183
|
|
@@ -23963,6 +24071,23 @@ define("tinymce/InsertContent", [
|
|
23963
24071
|
], function(Env, Tools, Serializer, CaretWalker, CaretPosition, ElementUtils, NodeType, InsertList) {
|
23964
24072
|
var isTableCell = NodeType.matchNodeNames('td th');
|
23965
24073
|
|
24074
|
+
var validInsertion = function (editor, value, parentNode) {
|
24075
|
+
// Should never insert content into bogus elements, since these can
|
24076
|
+
// be resize handles or similar
|
24077
|
+
if (parentNode.getAttribute('data-mce-bogus') === 'all') {
|
24078
|
+
parentNode.parentNode.insertBefore(editor.dom.createFragment(value), parentNode);
|
24079
|
+
} else {
|
24080
|
+
// Check if parent is empty or only has one BR element then set the innerHTML of that parent
|
24081
|
+
var node = parentNode.firstChild;
|
24082
|
+
var node2 = parentNode.lastChild;
|
24083
|
+
if (!node || (node === node2 && node.nodeName === 'BR')) {///
|
24084
|
+
editor.dom.setHTML(parentNode, value);
|
24085
|
+
} else {
|
24086
|
+
editor.selection.setContent(value);
|
24087
|
+
}
|
24088
|
+
}
|
24089
|
+
};
|
24090
|
+
|
23966
24091
|
var insertHtmlAtCaret = function(editor, value, details) {
|
23967
24092
|
var parser, serializer, parentNode, rootNode, fragment, args;
|
23968
24093
|
var marker, rng, node, node2, bookmarkHtml, merge;
|
@@ -24227,15 +24352,7 @@ define("tinymce/InsertContent", [
|
|
24227
24352
|
// If parser says valid we can insert the contents into that parent
|
24228
24353
|
if (!parserArgs.invalid) {
|
24229
24354
|
value = serializer.serialize(fragment);
|
24230
|
-
|
24231
|
-
// Check if parent is empty or only has one BR element then set the innerHTML of that parent
|
24232
|
-
node = parentNode.firstChild;
|
24233
|
-
node2 = parentNode.lastChild;
|
24234
|
-
if (!node || (node === node2 && node.nodeName === 'BR')) {
|
24235
|
-
dom.setHTML(parentNode, value);
|
24236
|
-
} else {
|
24237
|
-
selection.setContent(value);
|
24238
|
-
}
|
24355
|
+
validInsertion(editor, value, parentNode);
|
24239
24356
|
} else {
|
24240
24357
|
// If the fragment was invalid within that context then we need
|
24241
24358
|
// to parse and process the parent it's inserted into
|
@@ -24340,8 +24457,9 @@ define("tinymce/EditorCommands", [
|
|
24340
24457
|
"tinymce/util/Tools",
|
24341
24458
|
"tinymce/dom/RangeUtils",
|
24342
24459
|
"tinymce/dom/TreeWalker",
|
24343
|
-
"tinymce/InsertContent"
|
24344
|
-
|
24460
|
+
"tinymce/InsertContent",
|
24461
|
+
"tinymce/dom/NodeType"
|
24462
|
+
], function(Env, Tools, RangeUtils, TreeWalker, InsertContent, NodeType) {
|
24345
24463
|
// Added for compression purposes
|
24346
24464
|
var each = Tools.each, extend = Tools.extend;
|
24347
24465
|
var map = Tools.map, inArray = Tools.inArray, explode = Tools.explode;
|
@@ -24866,10 +24984,12 @@ define("tinymce/EditorCommands", [
|
|
24866
24984
|
var root = dom.getRoot(), rng;
|
24867
24985
|
|
24868
24986
|
if (selection.getRng().setStart) {
|
24869
|
-
|
24870
|
-
|
24871
|
-
|
24872
|
-
|
24987
|
+
var editingHost = dom.getParent(selection.getStart(), NodeType.isContentEditableTrue);
|
24988
|
+
if (editingHost) {
|
24989
|
+
rng = dom.createRng();
|
24990
|
+
rng.selectNodeContents(editingHost);
|
24991
|
+
selection.setRng(rng);
|
24992
|
+
}
|
24873
24993
|
} else {
|
24874
24994
|
// IE will render it's own root level block elements and sometimes
|
24875
24995
|
// even put font elements in them when the user starts typing. So we need to
|
@@ -34450,6 +34570,9 @@ define("tinymce/util/Quirks", [
|
|
34450
34570
|
* prevent empty paragraphs from being produced at beginning/end of contents.
|
34451
34571
|
*/
|
34452
34572
|
function emptyEditorOnDeleteEverything() {
|
34573
|
+
var deepEqual = function (a, b) {
|
34574
|
+
return a.getNode() === b.getNode() || a.isEqual(b);
|
34575
|
+
};
|
34453
34576
|
function isEverythingSelected(editor) {
|
34454
34577
|
var caretWalker = new CaretWalker(editor.getBody());
|
34455
34578
|
var rng = editor.selection.getRng();
|
@@ -34459,8 +34582,8 @@ define("tinymce/util/Quirks", [
|
|
34459
34582
|
var next = caretWalker.next(endCaretPos);
|
34460
34583
|
|
34461
34584
|
return !editor.selection.isCollapsed() &&
|
34462
|
-
(!prev || prev.isAtStart()) &&
|
34463
|
-
(!next || (next.isAtEnd() && startCaretPos
|
34585
|
+
(!prev || (prev.isAtStart() && deepEqual(startCaretPos, prev) === false)) &&
|
34586
|
+
(!next || (next.isAtEnd() && deepEqual(startCaretPos, next) === false));
|
34464
34587
|
}
|
34465
34588
|
|
34466
34589
|
// Type over case delete and insert this won't cover typeover with a IME but at least it covers the common case
|
@@ -36751,8 +36874,8 @@ define("tinymce/DragDropOverrides", [
|
|
36751
36874
|
var isContentEditableFalse = NodeType.isContentEditableFalse,
|
36752
36875
|
isContentEditableTrue = NodeType.isContentEditableTrue;
|
36753
36876
|
|
36754
|
-
var isDraggable = function (elm) {
|
36755
|
-
return isContentEditableFalse(elm);
|
36877
|
+
var isDraggable = function (rootElm, elm) {
|
36878
|
+
return isContentEditableFalse(elm) && elm !== rootElm;
|
36756
36879
|
};
|
36757
36880
|
|
36758
36881
|
var isValidDropTarget = function (editor, targetElement, dragElement) {
|
@@ -36857,7 +36980,7 @@ define("tinymce/DragDropOverrides", [
|
|
36857
36980
|
if (isLeftMouseButtonPressed(e)) {
|
36858
36981
|
var ceElm = Arr.find(editor.dom.getParents(e.target), Fun.or(isContentEditableFalse, isContentEditableTrue));
|
36859
36982
|
|
36860
|
-
if (isDraggable(ceElm)) {
|
36983
|
+
if (isDraggable(editor.getBody(), ceElm)) {
|
36861
36984
|
var elmPos = editor.dom.getPos(ceElm);
|
36862
36985
|
var bodyElm = editor.getBody();
|
36863
36986
|
var docElm = editor.getDoc().documentElement;
|
@@ -38986,7 +39109,7 @@ define("tinymce/Editor", [
|
|
38986
39109
|
while (i--) {
|
38987
39110
|
node = nodes[i];
|
38988
39111
|
|
38989
|
-
if (node.isEmpty(nonEmptyElements)) {
|
39112
|
+
if (node.isEmpty(nonEmptyElements) && node.getAll('br').length === 0) {
|
38990
39113
|
node.append(new Node('br', 1)).shortEnded = true;
|
38991
39114
|
}
|
38992
39115
|
}
|
@@ -39079,7 +39202,7 @@ define("tinymce/Editor", [
|
|
39079
39202
|
// Remove empty contents
|
39080
39203
|
if (settings.padd_empty_editor) {
|
39081
39204
|
self.on('PostProcess', function(e) {
|
39082
|
-
e.content = e.content.replace(/^(<p[^>]*>( | |\s|\u00a0
|
39205
|
+
e.content = e.content.replace(/^(<p[^>]*>( | |\s|\u00a0|<br \/>|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/, '');
|
39083
39206
|
});
|
39084
39207
|
}
|
39085
39208
|
|
@@ -39918,7 +40041,7 @@ define("tinymce/Editor", [
|
|
39918
40041
|
|
39919
40042
|
// Get raw contents or by default the cleaned contents
|
39920
40043
|
if (args.format == 'raw') {
|
39921
|
-
content = self.serializer.getTrimmedContent();
|
40044
|
+
content = Tools.trim(self.serializer.getTrimmedContent());
|
39922
40045
|
} else if (args.format == 'text') {
|
39923
40046
|
content = body.innerText || body.textContent;
|
39924
40047
|
} else {
|
@@ -40477,6 +40600,17 @@ define("tinymce/FocusManager", [
|
|
40477
40600
|
], function(DOMUtils, Delay, Env) {
|
40478
40601
|
var selectionChangeHandler, documentFocusInHandler, documentMouseUpHandler, DOM = DOMUtils.DOM;
|
40479
40602
|
|
40603
|
+
var isUIElement = function (editor, elm) {
|
40604
|
+
var customSelector = editor ? editor.settings.custom_ui_selector : '';
|
40605
|
+
var parent = DOM.getParent(elm, function (elm) {
|
40606
|
+
return (
|
40607
|
+
FocusManager.isEditorUIElement(elm) ||
|
40608
|
+
(customSelector ? editor.dom.is(elm, customSelector) : false)
|
40609
|
+
);
|
40610
|
+
});
|
40611
|
+
return parent !== null;
|
40612
|
+
};
|
40613
|
+
|
40480
40614
|
/**
|
40481
40615
|
* Constructs a new focus manager instance.
|
40482
40616
|
*
|
@@ -40528,10 +40662,6 @@ define("tinymce/FocusManager", [
|
|
40528
40662
|
return rng;
|
40529
40663
|
}
|
40530
40664
|
|
40531
|
-
function isUIElement(elm) {
|
40532
|
-
return !!DOM.getParent(elm, FocusManager.isEditorUIElement);
|
40533
|
-
}
|
40534
|
-
|
40535
40665
|
function registerEvents(e) {
|
40536
40666
|
var editor = e.editor;
|
40537
40667
|
|
@@ -40630,7 +40760,7 @@ define("tinymce/FocusManager", [
|
|
40630
40760
|
var focusedEditor = editorManager.focusedEditor;
|
40631
40761
|
|
40632
40762
|
// Still the same editor the blur was outside any editor UI
|
40633
|
-
if (!isUIElement(getActiveElement()) && focusedEditor == editor) {
|
40763
|
+
if (!isUIElement(editor, getActiveElement()) && focusedEditor == editor) {
|
40634
40764
|
editor.fire('blur', {focusedEditor: null});
|
40635
40765
|
editorManager.focusedEditor = null;
|
40636
40766
|
|
@@ -40658,7 +40788,7 @@ define("tinymce/FocusManager", [
|
|
40658
40788
|
}
|
40659
40789
|
|
40660
40790
|
// Fire a blur event if the element isn't a UI element
|
40661
|
-
if (target != document.body && !isUIElement(target) && editorManager.focusedEditor == activeEditor) {
|
40791
|
+
if (target != document.body && !isUIElement(activeEditor, target) && editorManager.focusedEditor == activeEditor) {
|
40662
40792
|
activeEditor.fire('blur', {focusedEditor: null});
|
40663
40793
|
editorManager.focusedEditor = null;
|
40664
40794
|
}
|
@@ -40717,6 +40847,8 @@ define("tinymce/FocusManager", [
|
|
40717
40847
|
return elm.className.toString().indexOf('mce-') !== -1;
|
40718
40848
|
};
|
40719
40849
|
|
40850
|
+
FocusManager._isUIElement = isUIElement;
|
40851
|
+
|
40720
40852
|
return FocusManager;
|
40721
40853
|
});
|
40722
40854
|
|
@@ -40843,7 +40975,7 @@ define("tinymce/EditorManager", [
|
|
40843
40975
|
* @property minorVersion
|
40844
40976
|
* @type String
|
40845
40977
|
*/
|
40846
|
-
minorVersion: '5.
|
40978
|
+
minorVersion: '5.3',
|
40847
40979
|
|
40848
40980
|
/**
|
40849
40981
|
* Release date of TinyMCE build.
|
@@ -40851,7 +40983,7 @@ define("tinymce/EditorManager", [
|
|
40851
40983
|
* @property releaseDate
|
40852
40984
|
* @type String
|
40853
40985
|
*/
|
40854
|
-
releaseDate: '2017-01
|
40986
|
+
releaseDate: '2017-02-01',
|
40855
40987
|
|
40856
40988
|
/**
|
40857
40989
|
* Collection of editor instances.
|
@@ -45417,7 +45549,7 @@ define("tinymce/fmt/FontInfo", [
|
|
45417
45549
|
elm = elm.parentNode;
|
45418
45550
|
}
|
45419
45551
|
|
45420
|
-
return
|
45552
|
+
return '';
|
45421
45553
|
};
|
45422
45554
|
|
45423
45555
|
var toPt = function (fontSize) {
|
@@ -45439,12 +45571,14 @@ define("tinymce/fmt/FontInfo", [
|
|
45439
45571
|
|
45440
45572
|
var getFontSize = function (rootElm, elm) {
|
45441
45573
|
var specifiedFontSize = getSpecifiedFontProp('fontSize', rootElm, elm);
|
45442
|
-
return specifiedFontSize ? specifiedFontSize : getComputedFontProp('fontSize', elm);
|
45574
|
+
return specifiedFontSize !== '' ? specifiedFontSize : getComputedFontProp('fontSize', elm);
|
45443
45575
|
};
|
45444
45576
|
|
45445
45577
|
var getFontFamily = function (rootElm, elm) {
|
45446
45578
|
var specifiedFontSize = getSpecifiedFontProp('fontFamily', rootElm, elm);
|
45447
|
-
|
45579
|
+
var fontValue = specifiedFontSize !== '' ? specifiedFontSize : getComputedFontProp('fontFamily', elm);
|
45580
|
+
|
45581
|
+
return fontValue !== undefined ? normalizeFontFamily(fontValue) : '';
|
45448
45582
|
};
|
45449
45583
|
|
45450
45584
|
return {
|
@@ -45849,10 +45983,9 @@ define("tinymce/ui/FormatControls", [
|
|
45849
45983
|
return function() {
|
45850
45984
|
var self = this;
|
45851
45985
|
|
45852
|
-
type = type == 'redo' ? 'hasRedo' : 'hasUndo';
|
45853
|
-
|
45854
45986
|
function checkState() {
|
45855
|
-
|
45987
|
+
var typeFn = type == 'redo' ? 'hasRedo' : 'hasUndo';
|
45988
|
+
return editor.undoManager ? editor.undoManager[typeFn]() : false;
|
45856
45989
|
}
|
45857
45990
|
|
45858
45991
|
self.disabled(!checkState());
|
@@ -46932,10 +47065,10 @@ define("tinymce/ui/MenuButton", [
|
|
46932
47065
|
*
|
46933
47066
|
* @method showMenu
|
46934
47067
|
*/
|
46935
|
-
showMenu: function() {
|
47068
|
+
showMenu: function(toggle) {
|
46936
47069
|
var self = this, menu;
|
46937
47070
|
|
46938
|
-
if (self.menu && self.menu.visible()) {
|
47071
|
+
if (self.menu && self.menu.visible() && toggle !== false) {
|
46939
47072
|
return self.hideMenu();
|
46940
47073
|
}
|
46941
47074
|
|
@@ -47071,7 +47204,8 @@ define("tinymce/ui/MenuButton", [
|
|
47071
47204
|
|
47072
47205
|
self.on('click', function(e) {
|
47073
47206
|
if (e.control === self && isChildOf(e.target, self.getEl())) {
|
47074
|
-
self.
|
47207
|
+
self.focus();
|
47208
|
+
self.showMenu(!e.aria);
|
47075
47209
|
|
47076
47210
|
if (e.aria) {
|
47077
47211
|
self.menu.items().filter(':visible')[0].focus();
|