tinymce.PluginManager.add('lists', function(editor) {
var self = this;
+ function isChildOfBody(elm) {
+ return editor.$.contains(editor.getBody(), elm);
+ }
+
+ function isBr(node) {
+ return node && node.nodeName == 'BR';
+ }
+
function isListNode(node) {
- return node && (/^(OL|UL|DL)$/).test(node.nodeName);
+ return node && (/^(OL|UL|DL)$/).test(node.nodeName) && isChildOfBody(node);
}
function isFirstChild(node) {
return true;
}
- if (sibling && sibling.nodeName == 'LI' && isListNode(li.lastChild)) {
+ /*if (sibling && sibling.nodeName == 'LI' && isListNode(li.lastChild)) {
return false;
- }
+ }*/
sibling = li.previousSibling;
if (sibling && sibling.nodeName == 'LI') {
}
function applyList(listName) {
- var rng = selection.getRng(true), bookmark = createBookmark(rng), listItemName = 'LI';
+ var rng = selection.getRng(true), bookmark, listItemName = 'LI';
+
+ if (dom.getContentEditable(selection.getNode()) === "false") {
+ return;
+ }
listName = listName.toUpperCase();
return;
}
- if (dom.isBlock(node) || node.nodeName == 'BR') {
- if (node.nodeName == 'BR') {
+ if (dom.isBlock(node) || isBr(node)) {
+ if (isBr(node)) {
dom.remove(node);
}
return textBlocks;
}
+ bookmark = createBookmark(rng);
+
tinymce.each(getSelectedTextBlocks(), function(block) {
var listBlock, sibling;
};
}
+ function isBogusBr(node) {
+ if (!isBr(node)) {
+ return false;
+ }
+
+ if (dom.isBlock(node.nextSibling) && !isBr(node.previousSibling)) {
+ return true;
+ }
+
+ return false;
+ }
+
self.backspaceDelete = function(isForward) {
function findNextCaretContainer(rng, isForward) {
var node = rng.startContainer, offset = rng.startOffset;
}
nonEmptyBlocks = editor.schema.getNonEmptyElements();
- walker = new tinymce.dom.TreeWalker(rng.startContainer);
+ if (node.nodeType == 1) {
+ node = tinymce.dom.RangeUtils.getNode(node, offset);
+ }
+
+ walker = new tinymce.dom.TreeWalker(node, editor.getBody());
+
+ // Delete at <li>|<br></li> then jump over the bogus br
+ if (isForward) {
+ if (isBogusBr(node)) {
+ walker.next();
+ }
+ }
- while ((node = walker[isForward ? 'next' : 'prev']())) {
+ while ((node = walker[isForward ? 'next' : 'prev2']())) {
if (node.nodeName == 'LI' && !node.hasChildNodes()) {
return node;
}
function mergeLiElements(fromElm, toElm) {
var node, listNode, ul = fromElm.parentNode;
+ if (!isChildOfBody(fromElm) || !isChildOfBody(toElm)) {
+ return;
+ }
+
if (isListNode(toElm.lastChild)) {
listNode = toElm.lastChild;
}
+ if (ul == toElm.lastChild) {
+ if (isBr(ul.previousSibling)) {
+ dom.remove(ul.previousSibling);
+ }
+ }
+
node = toElm.lastChild;
- if (node && node.nodeName == 'BR' && fromElm.hasChildNodes()) {
+ if (node && isBr(node) && fromElm.hasChildNodes()) {
dom.remove(node);
}