WordPress.org

Make WordPress Core

Ticket #22407: 22407.patch

File 22407.patch, 3.0 KB (added by azaozz, 9 years ago)
  • wp-includes/js/tinymce/plugins/wpview/editor_plugin_src.js

     
    1111                init : function( editor, url ) {
    1212                        var wpView = this;
    1313
     14                        this.editor = editor;
     15
    1416                        // Check if the `wp.mce` API exists.
    1517                        if ( typeof wp === 'undefined' || ! wp.mce )
    1618                                return;
     
    1820                        editor.onPreInit.add( function( editor ) {
    1921                                // Add elements so we can set `contenteditable` to false.
    2022                                editor.schema.addValidElements('div[*],span[*]');
     23
     24                                editor.undoManager.onBeforeAdd.addToTop(function(undoManager, o){
     25                                        o.content = wp.mce.view.toText( o.content );
     26
     27                                        console.log( 'undo.onBeforeAdd = '+o.content )
     28                                });
     29
     30                                editor.undoManager.onRedo.addToTop(function(undoManager, o){
     31                                        // Add back any views that were converted to text before deleting them
     32                                        o.content = wp.mce.view.toViews( o.content );
     33
     34                                        console.log( 'onRedo = '+o.content )
     35                                });
    2136                        });
    2237
    2338                        // When the editor's content changes, scan the new content for
     
    129144
    130145                                // If delete or backspace is pressed, delete the view.
    131146                                if ( keyCode === VK.DELETE || keyCode === VK.BACKSPACE ) {
    132                                         if ( (instance = wp.mce.view.instance( selected )) ) {
     147                                        if ( instance = wp.mce.view.instance( selected ) ) {
     148                                                var dom = editor.dom, parent = selected.parentNode, html, temp, viewText;
     149
     150                                                // Get the view's HTML as string and convert it to text mode
     151                                                html = wp.mce.view.toText( dom.getOuterHTML(selected) );
     152
     153                                                // Create a temporary span to hold the view's text and replace the view with the temp span
     154                                                temp = dom.create('span', {}, html);
     155                                                dom.replace( temp, selected );
     156
     157                                                // Run any "remove" callbacks
     158                                                // (At this point the view has alredy been removed from the dom. Could that cause problems?)
    133159                                                instance.remove();
    134160                                                wpView.deselect();
     161
     162                                                // Get the text for the view again in case it has changed
     163                                                viewText = temp.innerHTML;
     164                                                // Remove the temp <span> leaving its content only
     165                                                dom.remove(temp, true);
     166
     167                                                // Cancel the undo level up to this point
     168                                                editor.execCommand('mceEndUndoLevel', false, {}, {skip_undo: true});
     169
     170                                                // Finally delete the view's text. This will be saved in the undo level.
     171                                                parent.innerHTML = parent.innerHTML.replace(viewText, '');
     172                                                editor.nodeChanged();
    135173                                        }
    136174                                }
    137175
     
    140178                                if ( event.metaKey || event.ctrlKey || ( keyCode >= 112 && keyCode <= 123 ) )
    141179                                        return;
    142180
    143                                 event.preventDefault();
     181                                editor.dom.event.prevent(event);
    144182                        });
    145183                },
    146184
    147185                getParentView : function( node ) {
    148                         while ( node ) {
     186                        while ( node && node.nodeName != 'BODY' ) {
    149187                                if ( this.isView( node ) )
    150188                                        return node;
    151189
     
    185223
    186224        // Register plugin
    187225        tinymce.PluginManager.add( 'wpview', tinymce.plugins.wpView );
    188 })();
    189  No newline at end of file
     226})();