editor: plugins/core support for Node.object.describesParent
[fnpeditor.git] / src / editor / plugins / core / core.js
index ade5d93..c12405b 100644 (file)
@@ -26,6 +26,14 @@ plugin.documentExtension.textNode.transformations = {
                     return true; // break
                 }
             });
+            newNodes.second.contents()
+                .filter(function(child) {
+                    return child.object.describesParent;
+                })
+                .forEach(function(child) {
+                    //child.detach();
+                    newNodes.first.append(child);
+                });
             return _.extend(newNodes, {emptyText: emptyText});
         },
         getChangeRoot: function() {
@@ -79,7 +87,17 @@ var undoRedoAction = function(dir) {
             icon: 'share-alt',
             iconStyle: dir === 'undo' ? '-webkit-transform: scale(-1,1); transform: scale(-1, 1)' : '',
             execute: function(callback, params) {
+                var metadata = _.last(params.document[dir+'Stack']).metadata,
+                    fragment = metadata && metadata.fragment;
                 params.document[dir]();
+                if(fragment) {
+                    if(!fragment.isValid()) {
+                        fragment.restoreFromPaths();
+                    }
+                    if(fragment.isValid()) {
+                        callback(fragment);
+                    }
+                }
                 callback();
             },
         },
@@ -210,7 +228,8 @@ var createWrapTextAction = function(createParams) {
                             return newFragment;
                         }, {
                             metadata: {
-                                description: createParams.unwrapDescription
+                                description: createParams.unwrapDescription,
+                                fragment: params.fragment
                             },
                             success: callback
                         });
@@ -246,7 +265,8 @@ var createWrapTextAction = function(createParams) {
                             }
                         }, {
                             metadata: {
-                                description: createParams.wrapDescription
+                                description: createParams.wrapDescription,
+                                fragment: params.fragment
                             },
                             success: callback
                         });
@@ -266,7 +286,11 @@ var createLinkFromSelection = function(callback, params) {
             executeButtonText: gettext('Apply'),
             cancelButtonText: gettext('Cancel'),
             fields: [
-                {label: gettext('Link'), name: 'href', type: 'input'}
+                {label: gettext('Link'), name: 'href', type: 'input',
+                prePasteHandler: function(text) {
+                                    return params.fragment.document.getLinkForUrl(text);
+                                }.bind(this)
+                }
             ]
         }),
         action = this;
@@ -284,7 +308,8 @@ var createLinkFromSelection = function(callback, params) {
             return doc.createFragment(doc.CaretFragment, {node: span.contents()[0], offset:0});
         }, {
             metadata: {
-                description: action.getState().description
+                description: action.getState().description,
+                fragment: params.fragment
             },
             success: callback
         });
@@ -312,7 +337,8 @@ var editLink = function(callback, params) {
             return params.fragment;
         }, {
             metadata: {
-                description: action.getState().description
+                description: action.getState().description,
+                fragment: params.fragment
             },
             success: callback
         });