只读模式
group, 分享
评论更多问题
博客标签总是存在一个
This commit is contained in:
lealife committed 2015-06-15 18:01:48 +08:00
1 parent 7e458bb433
commit 6987a38820
1453 files changed
+114558 -91533

No files matched your search

+117 -38
View File
@@ -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();
}
}