tinymce-rails 4.3.13 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +1 -2
- data/app/assets/source/tinymce/tinymce.js +224 -51
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/imagetools/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +2 -2
- data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.ie7.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/atomic.js +5 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-atomic.js +1491 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-browser.js +1491 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-demo.js +1491 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/bootstrap-prod.js +1491 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/browser.js +10 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/demo.js +8 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/bolt/prod.js +5 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/config/dent/depend.js +21 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/compile/bootstrap.js +1526 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/compile/theme.js +1589 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/inline/theme.js +1674 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/inline/theme.raw.js +1674 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/demo/css/demo.css +25 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/demo/html/demo.html +42 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/demo/js/tinymce/inlite/Demo.js +28 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/Theme.js +143 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Arr.js +22 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Bookmark.js +130 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Unlink.js +84 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Uuid.js +34 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Actions.js +106 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Convert.js +37 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/ElementMatcher.js +47 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Layout.js +95 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Matcher.js +39 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Measure.js +70 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/PredicateId.js +32 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/SelectionMatcher.js +55 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/SkinLoader.js +45 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/UrlType.js +22 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/file/Conversions.js +31 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/file/Picker.js +40 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Buttons.js +80 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Forms.js +102 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Panel.js +216 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Toolbar.js +126 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/alien/ArrTest.js +9 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/alien/UuidTest.js +10 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/core/ConvertTest.js +12 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/core/MatcherTest.js +51 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/core/UrlTypeTest.js +25 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/ThemeTest.js +202 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/alien/BookmarkTest.js +65 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/alien/UnlinkTest.js +38 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/ActionsTest.js +177 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/ElementMatcher.js +69 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/LayoutTest.js +118 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/MeasureTest.js +62 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/PredicateIdTest.js +26 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/SelectionMatcherTest.js +76 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/file/ConversionsTest.js +41 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/file/SelectionMatcher.js +55 -0
- data/vendor/assets/javascripts/tinymce/themes/inlite/theme.js +1 -0
- data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
- data/vendor/assets/javascripts/tinymce/tinymce.js +13 -13
- metadata +57 -3
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
blockquote {
|
|
2
|
+
border-left: 3px solid rgba(0,0,0,.8);
|
|
3
|
+
padding-left: 20px;
|
|
4
|
+
margin: 0;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.mce-edit-focus {
|
|
8
|
+
outline: 1px solid blue;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.tinymce {
|
|
12
|
+
margin: 10px;
|
|
13
|
+
padding: 10px;
|
|
14
|
+
overflow: auto;
|
|
15
|
+
border: 1px solid gray;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
table, td {
|
|
19
|
+
border: 1px dashed gray;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/*.mce-tinymce-inline {
|
|
23
|
+
transition: left 50ms ease-in-out, top 50ms ease-in-out;
|
|
24
|
+
}
|
|
25
|
+
*/
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>inlite-theme Demo Page</title>
|
|
5
|
+
<link href="../css/demo.css" rel="stylesheet">
|
|
6
|
+
<script src="../../../../../tinymce.dev.js"></script>
|
|
7
|
+
<script src="../../../config/bolt/bootstrap-demo.js"></script>
|
|
8
|
+
<script>
|
|
9
|
+
ephox.bolt.module.api.main('tinymce/inlite/Demo');
|
|
10
|
+
</script>
|
|
11
|
+
</head>
|
|
12
|
+
|
|
13
|
+
<body>
|
|
14
|
+
<h2>inlite-theme Demo Page</h2>
|
|
15
|
+
<div id="ephox-ui">
|
|
16
|
+
<div class="tinymce" style="width: 900px; min-height: 100px">
|
|
17
|
+
<p>
|
|
18
|
+
<img src="https://www.tinymce.com/images/glyph-tinymce@2x.png" style="width: 100px; float: right">
|
|
19
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultricies posuere felis sed interdum. Quisque nec diam
|
|
20
|
+
nec purus gravida dapibus
|
|
21
|
+
</p>
|
|
22
|
+
<p>
|
|
23
|
+
eget non <a href="http://www.tinymce.com">nulla</a>. Ut eu vestibulum libero. Vestibulum pretium est vitae metus auctor, quis fermentum mi
|
|
24
|
+
luctus. Fusce aliquet tincidunt massa vitae scelerisque. Vivamus in tellus risus. Mauris auctor metus ut gravida feugiat.
|
|
25
|
+
Nunc consequat urna eu augue commodo, eget malesuada odio fringilla. Morbi vitae turpis in elit laoreet malesuada a nec massa.
|
|
26
|
+
</p>
|
|
27
|
+
<table>
|
|
28
|
+
<tbody>
|
|
29
|
+
<tr>
|
|
30
|
+
<td>Lorem ipsum dolor sit amet</td>
|
|
31
|
+
<td>Lorem ipsum dolor sit amet</td>
|
|
32
|
+
</tr>
|
|
33
|
+
<tr>
|
|
34
|
+
<td>Vivamus in tellus risus</td>
|
|
35
|
+
<td>Vivamus in tellus risus</td>
|
|
36
|
+
</tr>
|
|
37
|
+
</tbody>
|
|
38
|
+
</table>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</body>
|
|
42
|
+
</html>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo.js
|
|
3
|
+
*
|
|
4
|
+
* Released under LGPL License.
|
|
5
|
+
* Copyright (c) 1999-2016 Ephox Corp. All rights reserved
|
|
6
|
+
*
|
|
7
|
+
* License: http://www.tinymce.com/license
|
|
8
|
+
* Contributing: http://www.tinymce.com/contributing
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/*eslint no-console:0 */
|
|
12
|
+
|
|
13
|
+
define('tinymce/inlite/Demo', [
|
|
14
|
+
'tinymce/inlite/Theme',
|
|
15
|
+
'global!tinymce'
|
|
16
|
+
], function(Theme, tinymce) {
|
|
17
|
+
tinymce.init({
|
|
18
|
+
selector: 'div.tinymce',
|
|
19
|
+
theme: 'inlite',
|
|
20
|
+
plugins: 'image table link paste contextmenu textpattern autolink',
|
|
21
|
+
insert_toolbar: 'quickimage quicktable',
|
|
22
|
+
selection_toolbar: 'bold italic | quicklink h2 h3 blockquote',
|
|
23
|
+
inline: true,
|
|
24
|
+
paste_data_images: true
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
return function() {};
|
|
28
|
+
});
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme.js
|
|
3
|
+
*
|
|
4
|
+
* Released under LGPL License.
|
|
5
|
+
* Copyright (c) 1999-2016 Ephox Corp. All rights reserved
|
|
6
|
+
*
|
|
7
|
+
* License: http://www.tinymce.com/license
|
|
8
|
+
* Contributing: http://www.tinymce.com/contributing
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
define('tinymce/inlite/Theme', [
|
|
12
|
+
'global!tinymce.ThemeManager',
|
|
13
|
+
'global!tinymce.util.Delay',
|
|
14
|
+
'tinymce/inlite/ui/Panel',
|
|
15
|
+
'tinymce/inlite/ui/Buttons',
|
|
16
|
+
'tinymce/inlite/core/SkinLoader',
|
|
17
|
+
'tinymce/inlite/core/SelectionMatcher',
|
|
18
|
+
'tinymce/inlite/core/ElementMatcher',
|
|
19
|
+
'tinymce/inlite/core/Matcher',
|
|
20
|
+
'tinymce/inlite/alien/Arr',
|
|
21
|
+
'tinymce/inlite/core/PredicateId'
|
|
22
|
+
], function(ThemeManager, Delay, Panel, Buttons, SkinLoader, SelectionMatcher, ElementMatcher, Matcher, Arr, PredicateId) {
|
|
23
|
+
var getSelectionElements = function (editor) {
|
|
24
|
+
var node = editor.selection.getNode();
|
|
25
|
+
var elms = editor.dom.getParents(node);
|
|
26
|
+
return elms;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
var createToolbar = function (editor, selector, id, items) {
|
|
30
|
+
var selectorPredicate = function (elm) {
|
|
31
|
+
return editor.dom.is(elm, selector);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
predicate: selectorPredicate,
|
|
36
|
+
id: id,
|
|
37
|
+
items: items
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
var getToolbars = function (editor) {
|
|
42
|
+
var contextToolbars = editor.contextToolbars;
|
|
43
|
+
|
|
44
|
+
return Arr.flatten([
|
|
45
|
+
contextToolbars ? contextToolbars : [],
|
|
46
|
+
createToolbar(editor, 'img', 'image', 'alignleft aligncenter alignright')
|
|
47
|
+
]);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
var findMatchResult = function (editor, toolbars) {
|
|
51
|
+
var result, elements, contextToolbarsPredicateIds;
|
|
52
|
+
|
|
53
|
+
elements = getSelectionElements(editor);
|
|
54
|
+
contextToolbarsPredicateIds = PredicateId.fromContextToolbars(toolbars);
|
|
55
|
+
|
|
56
|
+
result = Matcher.match(editor, [
|
|
57
|
+
ElementMatcher.element(elements[0], contextToolbarsPredicateIds),
|
|
58
|
+
SelectionMatcher.textSelection('text'),
|
|
59
|
+
SelectionMatcher.emptyTextBlock(elements, 'insert'),
|
|
60
|
+
ElementMatcher.parent(elements, contextToolbarsPredicateIds)
|
|
61
|
+
]);
|
|
62
|
+
|
|
63
|
+
return result && result.rect ? result : null;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
var togglePanel = function (editor) {
|
|
67
|
+
var toggle = function () {
|
|
68
|
+
var toolbars = getToolbars(editor);
|
|
69
|
+
var result = findMatchResult(editor, toolbars);
|
|
70
|
+
result ? Panel.show(editor, result.id, result.rect, toolbars) : Panel.hide();
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
return function () {
|
|
74
|
+
if (!editor.removed) {
|
|
75
|
+
toggle();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
var ignoreWhenFormIsVisible = function (f) {
|
|
81
|
+
return function () {
|
|
82
|
+
if (!Panel.inForm()) {
|
|
83
|
+
f();
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
var bindContextualToolbarsEvents = function (editor) {
|
|
89
|
+
var throttledTogglePanel = Delay.throttle(togglePanel(editor), 0);
|
|
90
|
+
var throttledTogglePanelWhenNotInForm = Delay.throttle(ignoreWhenFormIsVisible(togglePanel(editor)), 0);
|
|
91
|
+
|
|
92
|
+
editor.on('blur hide ObjectResizeStart', Panel.hide);
|
|
93
|
+
editor.on('click', throttledTogglePanel);
|
|
94
|
+
editor.on('nodeChange mouseup', throttledTogglePanelWhenNotInForm);
|
|
95
|
+
editor.on('ResizeEditor ResizeWindow keyup', throttledTogglePanel);
|
|
96
|
+
editor.on('remove', Panel.remove);
|
|
97
|
+
|
|
98
|
+
editor.shortcuts.add('Alt+F10', '', Panel.focus);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
var overrideLinkShortcut = function (editor) {
|
|
102
|
+
editor.shortcuts.remove('meta+k');
|
|
103
|
+
editor.shortcuts.add('meta+k', '', function () {
|
|
104
|
+
var toolbars = getToolbars(editor);
|
|
105
|
+
var result = result = Matcher.match(editor, [
|
|
106
|
+
SelectionMatcher.textSelection('quicklink')
|
|
107
|
+
]);
|
|
108
|
+
|
|
109
|
+
if (result) {
|
|
110
|
+
Panel.show(editor, result.id, result.rect, toolbars);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
var renderInlineUI = function (editor) {
|
|
116
|
+
var skinName = editor.settings.skin || 'lightgray';
|
|
117
|
+
|
|
118
|
+
SkinLoader.load(editor, skinName, function () {
|
|
119
|
+
bindContextualToolbarsEvents(editor);
|
|
120
|
+
overrideLinkShortcut(editor);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
return {};
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
var fail = function (message) {
|
|
127
|
+
throw new Error(message);
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
ThemeManager.add('inlite', function (editor) {
|
|
131
|
+
Buttons.addToEditor(editor);
|
|
132
|
+
|
|
133
|
+
var renderUI = function () {
|
|
134
|
+
return editor.inline ? renderInlineUI(editor) : fail('inlite theme only supports inline mode.');
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
renderUI: renderUI
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
return function() {};
|
|
143
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arr.js
|
|
3
|
+
*
|
|
4
|
+
* Released under LGPL License.
|
|
5
|
+
* Copyright (c) 1999-2016 Ephox Corp. All rights reserved
|
|
6
|
+
*
|
|
7
|
+
* License: http://www.tinymce.com/license
|
|
8
|
+
* Contributing: http://www.tinymce.com/contributing
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
define('tinymce/inlite/alien/Arr', [
|
|
12
|
+
], function () {
|
|
13
|
+
var flatten = function (arr) {
|
|
14
|
+
return arr.reduce(function (results, item) {
|
|
15
|
+
return Array.isArray(item) ? results.concat(flatten(item)) : results.concat(item);
|
|
16
|
+
}, []);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
flatten: flatten
|
|
21
|
+
};
|
|
22
|
+
});
|
data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Bookmark.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bookmark.js
|
|
3
|
+
*
|
|
4
|
+
* Released under LGPL License.
|
|
5
|
+
* Copyright (c) 1999-2016 Ephox Corp. All rights reserved
|
|
6
|
+
*
|
|
7
|
+
* License: http://www.tinymce.com/license
|
|
8
|
+
* Contributing: http://www.tinymce.com/contributing
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
define('tinymce/inlite/alien/Bookmark', [
|
|
12
|
+
], function () {
|
|
13
|
+
/**
|
|
14
|
+
* Returns a range bookmark. This will convert indexed bookmarks into temporary span elements with
|
|
15
|
+
* index 0 so that they can be restored properly after the DOM has been modified. Text bookmarks will not have spans
|
|
16
|
+
* added to them since they can be restored after a dom operation.
|
|
17
|
+
*
|
|
18
|
+
* So this: <p><b>|</b><b>|</b></p>
|
|
19
|
+
* becomes: <p><b><span data-mce-type="bookmark">|</span></b><b data-mce-type="bookmark">|</span></b></p>
|
|
20
|
+
*
|
|
21
|
+
* @param {DOMRange} rng DOM Range to get bookmark on.
|
|
22
|
+
* @return {Object} Bookmark object.
|
|
23
|
+
*/
|
|
24
|
+
var create = function (dom, rng) {
|
|
25
|
+
var bookmark = {};
|
|
26
|
+
|
|
27
|
+
function setupEndPoint(start) {
|
|
28
|
+
var offsetNode, container, offset;
|
|
29
|
+
|
|
30
|
+
container = rng[start ? 'startContainer' : 'endContainer'];
|
|
31
|
+
offset = rng[start ? 'startOffset' : 'endOffset'];
|
|
32
|
+
|
|
33
|
+
if (container.nodeType == 1) {
|
|
34
|
+
offsetNode = dom.create('span', {'data-mce-type': 'bookmark'});
|
|
35
|
+
|
|
36
|
+
if (container.hasChildNodes()) {
|
|
37
|
+
offset = Math.min(offset, container.childNodes.length - 1);
|
|
38
|
+
|
|
39
|
+
if (start) {
|
|
40
|
+
container.insertBefore(offsetNode, container.childNodes[offset]);
|
|
41
|
+
} else {
|
|
42
|
+
dom.insertAfter(offsetNode, container.childNodes[offset]);
|
|
43
|
+
}
|
|
44
|
+
} else {
|
|
45
|
+
container.appendChild(offsetNode);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
container = offsetNode;
|
|
49
|
+
offset = 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
bookmark[start ? 'startContainer' : 'endContainer'] = container;
|
|
53
|
+
bookmark[start ? 'startOffset' : 'endOffset'] = offset;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
setupEndPoint(true);
|
|
57
|
+
|
|
58
|
+
if (!rng.collapsed) {
|
|
59
|
+
setupEndPoint();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return bookmark;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Moves the selection to the current bookmark and removes any selection container wrappers.
|
|
67
|
+
*
|
|
68
|
+
* @param {Object} bookmark Bookmark object to move selection to.
|
|
69
|
+
*/
|
|
70
|
+
var resolve = function (dom, bookmark) {
|
|
71
|
+
function restoreEndPoint(start) {
|
|
72
|
+
var container, offset, node;
|
|
73
|
+
|
|
74
|
+
function nodeIndex(container) {
|
|
75
|
+
var node = container.parentNode.firstChild, idx = 0;
|
|
76
|
+
|
|
77
|
+
while (node) {
|
|
78
|
+
if (node == container) {
|
|
79
|
+
return idx;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Skip data-mce-type=bookmark nodes
|
|
83
|
+
if (node.nodeType != 1 || node.getAttribute('data-mce-type') != 'bookmark') {
|
|
84
|
+
idx++;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
node = node.nextSibling;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return -1;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
container = node = bookmark[start ? 'startContainer' : 'endContainer'];
|
|
94
|
+
offset = bookmark[start ? 'startOffset' : 'endOffset'];
|
|
95
|
+
|
|
96
|
+
if (!container) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (container.nodeType == 1) {
|
|
101
|
+
offset = nodeIndex(container);
|
|
102
|
+
container = container.parentNode;
|
|
103
|
+
dom.remove(node);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
bookmark[start ? 'startContainer' : 'endContainer'] = container;
|
|
107
|
+
bookmark[start ? 'startOffset' : 'endOffset'] = offset;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
restoreEndPoint(true);
|
|
111
|
+
restoreEndPoint();
|
|
112
|
+
|
|
113
|
+
var rng = dom.createRng();
|
|
114
|
+
|
|
115
|
+
rng.setStart(bookmark.startContainer, bookmark.startOffset);
|
|
116
|
+
|
|
117
|
+
if (bookmark.endContainer) {
|
|
118
|
+
rng.setEnd(bookmark.endContainer, bookmark.endOffset);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return rng;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
create: create,
|
|
126
|
+
resolve: resolve
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
|
data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/alien/Unlink.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unlink.js
|
|
3
|
+
*
|
|
4
|
+
* Released under LGPL License.
|
|
5
|
+
* Copyright (c) 1999-2016 Ephox Corp. All rights reserved
|
|
6
|
+
*
|
|
7
|
+
* License: http://www.tinymce.com/license
|
|
8
|
+
* Contributing: http://www.tinymce.com/contributing
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Unlink implementation that doesn't leave partial links for example it would produce:
|
|
13
|
+
* a[b<a href="x">c]d</a>e -> a[bc]de
|
|
14
|
+
* instead of:
|
|
15
|
+
* a[b<a href="x">c]d</a>e -> a[bc]<a href="x">d</a>e
|
|
16
|
+
*/
|
|
17
|
+
define("tinymce/inlite/alien/Unlink", [
|
|
18
|
+
'tinymce/inlite/alien/Bookmark',
|
|
19
|
+
'global!tinymce.util.Tools',
|
|
20
|
+
'global!tinymce.dom.TreeWalker',
|
|
21
|
+
'global!tinymce.dom.RangeUtils'
|
|
22
|
+
], function (Bookmark, Tools, TreeWalker, RangeUtils) {
|
|
23
|
+
var getSelectedElements = function (rootElm, startNode, endNode) {
|
|
24
|
+
var walker, node, elms = [];
|
|
25
|
+
|
|
26
|
+
walker = new TreeWalker(startNode, rootElm);
|
|
27
|
+
for (node = startNode; node; node = walker.next()) {
|
|
28
|
+
if (node.nodeType === 1) {
|
|
29
|
+
elms.push(node);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (node === endNode) {
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return elms;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
var unwrapElements = function (editor, elms) {
|
|
41
|
+
var bookmark, dom, selection;
|
|
42
|
+
|
|
43
|
+
dom = editor.dom;
|
|
44
|
+
selection = editor.selection;
|
|
45
|
+
bookmark = Bookmark.create(dom, selection.getRng());
|
|
46
|
+
|
|
47
|
+
Tools.each(elms, function (elm) {
|
|
48
|
+
editor.dom.remove(elm, true);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
selection.setRng(Bookmark.resolve(dom, bookmark));
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
var isLink = function (elm) {
|
|
55
|
+
return elm.nodeName === 'A' && elm.hasAttribute('href');
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
var getParentAnchorOrSelf = function (dom, elm) {
|
|
59
|
+
var anchorElm = dom.getParent(elm, isLink);
|
|
60
|
+
return anchorElm ? anchorElm : elm;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
var getSelectedAnchors = function (editor) {
|
|
64
|
+
var startElm, endElm, rootElm, anchorElms, selection, dom, rng;
|
|
65
|
+
|
|
66
|
+
selection = editor.selection;
|
|
67
|
+
dom = editor.dom;
|
|
68
|
+
rng = selection.getRng();
|
|
69
|
+
startElm = getParentAnchorOrSelf(dom, RangeUtils.getNode(rng.startContainer, rng.startOffset));
|
|
70
|
+
endElm = RangeUtils.getNode(rng.endContainer, rng.endOffset);
|
|
71
|
+
rootElm = editor.getBody();
|
|
72
|
+
anchorElms = Tools.grep(getSelectedElements(rootElm, startElm, endElm), isLink);
|
|
73
|
+
|
|
74
|
+
return anchorElms;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
var unlinkSelection = function (editor) {
|
|
78
|
+
unwrapElements(editor, getSelectedAnchors(editor));
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
unlinkSelection: unlinkSelection
|
|
83
|
+
};
|
|
84
|
+
});
|