v1.0
只读模式 group, 分享 评论更多问题 博客标签总是存在一个
This commit is contained in:
1 parent
7e458bb433
commit
6987a38820
1453 files changed
+114558
-91533
No files matched your search
Regular → Executable
+117
-38
@@ -9,12 +9,13 @@
|
||||
*/
|
||||
|
||||
/*global tinymce:true */
|
||||
/*eslint consistent-this:0 */
|
||||
|
||||
tinymce.PluginManager.add('lists', function(editor) {
|
||||
var plugin = this;
|
||||
var self = this;
|
||||
|
||||
function isListNode(node) {
|
||||
return node && (/^(OL|UL)$/).test(node.nodeName);
|
||||
return node && (/^(OL|UL|DL)$/).test(node.nodeName);
|
||||
}
|
||||
|
||||
function isFirstChild(node) {
|
||||
@@ -29,10 +30,6 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
return node && !!editor.schema.getTextBlockElements()[node.nodeName];
|
||||
}
|
||||
|
||||
function isBookmarkNode(node) {
|
||||
return node && node.nodeName === 'SPAN' && node.getAttribute('data-mce-type') === 'bookmark';
|
||||
}
|
||||
|
||||
editor.on('init', function() {
|
||||
var dom = editor.dom, selection = editor.selection;
|
||||
|
||||
@@ -205,21 +202,35 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
|
||||
function getSelectedListItems() {
|
||||
return tinymce.grep(selection.getSelectedBlocks(), function(block) {
|
||||
return block.nodeName == 'LI';
|
||||
return /^(LI|DT|DD)$/.test(block.nodeName);
|
||||
});
|
||||
}
|
||||
|
||||
function splitList(ul, li, newBlock) {
|
||||
var tmpRng, fragment;
|
||||
var tmpRng, fragment, bookmarks, node;
|
||||
|
||||
var bookmarks = dom.select('span[data-mce-type="bookmark"]', ul);
|
||||
function removeAndKeepBookmarks(targetNode) {
|
||||
tinymce.each(bookmarks, function(node) {
|
||||
targetNode.parentNode.insertBefore(node, li.parentNode);
|
||||
});
|
||||
|
||||
dom.remove(targetNode);
|
||||
}
|
||||
|
||||
bookmarks = dom.select('span[data-mce-type="bookmark"]', ul);
|
||||
newBlock = newBlock || createNewTextBlock(li);
|
||||
tmpRng = dom.createRng();
|
||||
tmpRng.setStartAfter(li);
|
||||
tmpRng.setEndAfter(ul);
|
||||
fragment = tmpRng.extractContents();
|
||||
|
||||
for (node = fragment.firstChild; node; node = node.firstChild) {
|
||||
if (node.nodeName == 'LI' && dom.isEmpty(node)) {
|
||||
dom.remove(node);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!dom.isEmpty(fragment)) {
|
||||
dom.insertAfter(fragment, ul);
|
||||
}
|
||||
@@ -227,14 +238,14 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
dom.insertAfter(newBlock, ul);
|
||||
|
||||
if (dom.isEmpty(li.parentNode)) {
|
||||
tinymce.each(bookmarks, function(node) {
|
||||
li.parentNode.parentNode.insertBefore(node, li.parentNode);
|
||||
});
|
||||
|
||||
dom.remove(li.parentNode);
|
||||
removeAndKeepBookmarks(li.parentNode);
|
||||
}
|
||||
|
||||
dom.remove(li);
|
||||
|
||||
if (dom.isEmpty(ul)) {
|
||||
dom.remove(ul);
|
||||
}
|
||||
}
|
||||
|
||||
function mergeWithAdjacentLists(listBlock) {
|
||||
@@ -297,6 +308,11 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
}
|
||||
}
|
||||
|
||||
if (li.nodeName == 'DD') {
|
||||
dom.rename(li, 'DT');
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isFirstChild(li) && isLastChild(li)) {
|
||||
if (ulParent.nodeName == "LI") {
|
||||
dom.insertAfter(li, ulParent);
|
||||
@@ -368,6 +384,11 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
}
|
||||
}
|
||||
|
||||
if (li.nodeName == 'DT') {
|
||||
dom.rename(li, 'DD');
|
||||
return true;
|
||||
}
|
||||
|
||||
sibling = li.previousSibling;
|
||||
|
||||
if (sibling && isListNode(sibling)) {
|
||||
@@ -461,7 +482,13 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
}
|
||||
|
||||
function applyList(listName) {
|
||||
var rng = selection.getRng(true), bookmark = createBookmark(rng);
|
||||
var rng = selection.getRng(true), bookmark = createBookmark(rng), listItemName = 'LI';
|
||||
|
||||
listName = listName.toUpperCase();
|
||||
|
||||
if (listName == 'DL') {
|
||||
listItemName = 'DT';
|
||||
}
|
||||
|
||||
function getSelectedTextBlocks() {
|
||||
var textBlocks = [], root = editor.getBody();
|
||||
@@ -521,7 +548,7 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
}
|
||||
|
||||
var nextSibling = node.nextSibling;
|
||||
if (isBookmarkNode(node)) {
|
||||
if (tinymce.dom.BookmarkManager.isBookmarkNode(node)) {
|
||||
if (isTextBlock(nextSibling) || (!nextSibling && node.parentNode == root)) {
|
||||
block = null;
|
||||
return;
|
||||
@@ -540,21 +567,19 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
return textBlocks;
|
||||
}
|
||||
|
||||
var textBlocks = getSelectedTextBlocks();
|
||||
|
||||
tinymce.each(textBlocks, function(block) {
|
||||
tinymce.each(getSelectedTextBlocks(), function(block) {
|
||||
var listBlock, sibling;
|
||||
|
||||
sibling = block.previousSibling;
|
||||
if (sibling && isListNode(sibling) && sibling.nodeName == listName) {
|
||||
listBlock = sibling;
|
||||
block = dom.rename(block, 'LI');
|
||||
block = dom.rename(block, listItemName);
|
||||
sibling.appendChild(block);
|
||||
} else {
|
||||
listBlock = dom.create(listName);
|
||||
block.parentNode.insertBefore(listBlock, block);
|
||||
listBlock.appendChild(block);
|
||||
block = dom.rename(block, 'LI');
|
||||
block = dom.rename(block, listItemName);
|
||||
}
|
||||
|
||||
mergeWithAdjacentLists(listBlock);
|
||||
@@ -587,7 +612,7 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
}
|
||||
|
||||
function toggleList(listName) {
|
||||
var parentList = dom.getParent(selection.getStart(), 'OL,UL');
|
||||
var parentList = dom.getParent(selection.getStart(), 'OL,UL,DL');
|
||||
|
||||
if (parentList) {
|
||||
if (parentList.nodeName == listName) {
|
||||
@@ -602,16 +627,35 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
}
|
||||
}
|
||||
|
||||
plugin.backspaceDelete = function(isForward) {
|
||||
function queryListCommandState(listName) {
|
||||
return function() {
|
||||
var parentList = dom.getParent(editor.selection.getStart(), 'UL,OL,DL');
|
||||
|
||||
return parentList && parentList.nodeName == listName;
|
||||
};
|
||||
}
|
||||
|
||||
self.backspaceDelete = function(isForward) {
|
||||
function findNextCaretContainer(rng, isForward) {
|
||||
var node = rng.startContainer, offset = rng.startOffset;
|
||||
var nonEmptyBlocks, walker;
|
||||
|
||||
if (node.nodeType == 3 && (isForward ? offset < node.data.length : offset > 0)) {
|
||||
return node;
|
||||
}
|
||||
|
||||
var walker = new tinymce.dom.TreeWalker(rng.startContainer);
|
||||
nonEmptyBlocks = editor.schema.getNonEmptyElements();
|
||||
walker = new tinymce.dom.TreeWalker(rng.startContainer);
|
||||
|
||||
while ((node = walker[isForward ? 'next' : 'prev']())) {
|
||||
if (node.nodeName == 'LI' && !node.hasChildNodes()) {
|
||||
return node;
|
||||
}
|
||||
|
||||
if (nonEmptyBlocks[node.nodeName]) {
|
||||
return node;
|
||||
}
|
||||
|
||||
if (node.nodeType == 3 && node.data.length > 0) {
|
||||
return node;
|
||||
}
|
||||
@@ -630,8 +674,14 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
dom.remove(node);
|
||||
}
|
||||
|
||||
while ((node = fromElm.firstChild)) {
|
||||
toElm.appendChild(node);
|
||||
if (dom.isEmpty(toElm)) {
|
||||
dom.$(toElm).empty();
|
||||
}
|
||||
|
||||
if (!dom.isEmpty(fromElm)) {
|
||||
while ((node = fromElm.firstChild)) {
|
||||
toElm.appendChild(node);
|
||||
}
|
||||
}
|
||||
|
||||
if (listNode) {
|
||||
@@ -673,14 +723,22 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
}
|
||||
};
|
||||
|
||||
editor.addCommand('Indent', function() {
|
||||
if (!indentSelection()) {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
editor.on('BeforeExecCommand', function(e) {
|
||||
var cmd = e.command.toLowerCase(), isHandled;
|
||||
|
||||
editor.addCommand('Outdent', function() {
|
||||
if (!outdentSelection()) {
|
||||
if (cmd == "indent") {
|
||||
if (indentSelection()) {
|
||||
isHandled = true;
|
||||
}
|
||||
} else if (cmd == "outdent") {
|
||||
if (outdentSelection()) {
|
||||
isHandled = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (isHandled) {
|
||||
editor.fire('ExecCommand', {command: e.command});
|
||||
e.preventDefault();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
@@ -693,8 +751,21 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
toggleList('OL');
|
||||
});
|
||||
|
||||
editor.addCommand('InsertDefinitionList', function() {
|
||||
toggleList('DL');
|
||||
});
|
||||
|
||||
editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState('UL'));
|
||||
editor.addQueryStateHandler('InsertOrderedList', queryListCommandState('OL'));
|
||||
editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState('DL'));
|
||||
|
||||
editor.on('keydown', function(e) {
|
||||
if (e.keyCode == 9 && editor.dom.getParent(editor.selection.getStart(), 'LI')) {
|
||||
// Check for tab but not ctrl/cmd+tab since it switches browser tabs
|
||||
if (e.keyCode != 9 || tinymce.util.VK.metaKeyPressed(e)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (editor.dom.getParent(editor.selection.getStart(), 'LI,DT,DD')) {
|
||||
e.preventDefault();
|
||||
|
||||
if (e.shiftKey) {
|
||||
@@ -714,19 +785,27 @@ tinymce.PluginManager.add('lists', function(editor) {
|
||||
var ctrl = this;
|
||||
|
||||
editor.on('nodechange', function() {
|
||||
var li = editor.dom.getParent(editor.selection.getNode(), 'LI,UL,OL');
|
||||
ctrl.disabled(li && (li.nodeName != 'LI' || isFirstChild(li)));
|
||||
var blocks = editor.selection.getSelectedBlocks();
|
||||
var disable = false;
|
||||
|
||||
for (var i = 0, l = blocks.length; !disable && i < l; i++) {
|
||||
var tag = blocks[i].nodeName;
|
||||
|
||||
disable = (tag == 'LI' && isFirstChild(blocks[i]) || tag == 'UL' || tag == 'OL' || tag == 'DD');
|
||||
}
|
||||
|
||||
ctrl.disabled(disable);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
editor.on('keydown', function(e) {
|
||||
if (e.keyCode == tinymce.util.VK.BACKSPACE) {
|
||||
if (plugin.backspaceDelete()) {
|
||||
if (self.backspaceDelete()) {
|
||||
e.preventDefault();
|
||||
}
|
||||
} else if (e.keyCode == tinymce.util.VK.DELETE) {
|
||||
if (plugin.backspaceDelete(true)) {
|
||||
if (self.backspaceDelete(true)) {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user