splitting blocks from spans
[fnpeditor.git] / src / editor / plugins / core / core.js
index cde08d6..425b161 100644 (file)
@@ -19,6 +19,7 @@ plugin.documentExtension.textNode.transformations = {
     breakContent: {
         impl: function(args) {
             var node = this,
+                isSpan = node.parent().getTagName() === 'span',
                 parentDescribingNodes = [],
                 newNodes, emptyText;
             newNodes = node.split({offset: args.offset});
@@ -40,10 +41,51 @@ plugin.documentExtension.textNode.transformations = {
             parentDescribingNodes.forEach(function(node) {
                 newNodes.first.append(node);
             });
+
+            var parent, newNode;
+
+            var copyNode = function(n) {
+                var attrs = {};
+                n.getAttrs().forEach(function(attr) {
+                    attrs[attr.name] = attr.value;
+                });
+
+                return node.document.createDocumentNode({
+                    tagName: n.getTagName(),
+                    attrs: attrs
+                });
+            };
+
+            var move = function(node, to) {
+                var copy;
+                if(!node.containsNode(newNodes.second)) {
+                    to.append(node);
+                    return false;
+                } else {
+                    if(!node.sameNode(newNodes.second)) {
+                        copy = to.append(copyNode(node));
+                        node.contents().some(function(n) {
+                            return move(n, copy);
+                        });
+                    }
+                    return true;
+                }
+            };
+
+            if(isSpan) {
+                newNodes.first.parents().some(function(p) {
+                    if(p.getTagName() !== 'span') {
+                        parent = p;
+                        return true;
+                    }
+                });
+                newNode = parent.before({tagName: parent.getTagName(), attrs: {'class': parent.getClass()}});
+                parent.contents().some(function(n) {
+                    return move(n, newNode);
+                });
+            }
+
             return _.extend(newNodes, {emptyText: emptyText});
-        },
-        getChangeRoot: function() {
-            return this.context.parent().parent();
         }
     },
     mergeContentUp: function() {
@@ -88,10 +130,23 @@ plugin.documentExtension.elementNode.transformations = {
             prev = toMerge.prev();
 
         var merge = function(from, to) {
-            from.contents().forEach(function(node) {
-                to.append(node);
+            var toret;
+            from.contents().forEach(function(node, idx) {
+                var len, ret;
+                if(idx === 0 && node.nodeType === Node.TEXT_NODE) {
+                    len = node.getText().length;
+                }
+                ret = to.append(node);
+                
+                if(idx === 0) {
+                    toret = {
+                        node: ret,
+                        offset: ret.getText().length - len
+                    };
+                }
             });
             from.detach();
+            return toret;
         };
 
         var strategies = [
@@ -101,12 +156,11 @@ plugin.documentExtension.elementNode.transformations = {
                 },
                 run: function() {
                     if(prev && prev.is('p') || prev.is({tagName: 'header'})) {
-                        merge(toMerge, prev);
+                        return merge(toMerge, prev);
                     }
                     if(prev && prev.is('list')) {
                         var items = prev.contents().filter(function(n) { return n.is('item');});
-                        merge(toMerge, items[items.length-1]);
-                        //return {node: toMerge, offset:0};
+                        return merge(toMerge, items[items.length-1]);
                     }
                 }
             },
@@ -116,7 +170,7 @@ plugin.documentExtension.elementNode.transformations = {
                 },
                 run: function() {
                     if(prev && prev.is('p') || prev.is({tagName: 'header'})) {
-                        merge(toMerge, prev);
+                        return merge(toMerge, prev);
                     }
                 }
             },
@@ -127,7 +181,7 @@ plugin.documentExtension.elementNode.transformations = {
                 run: function() {
                     var list;
                     if(prev && prev.is('item')) {
-                        merge(toMerge, prev);
+                        return merge(toMerge, prev);
                     } else if(!prev && (list = toMerge.parent()) && list.is('list')) {
                         list.before(toMerge);
                         toMerge.setClass('p');