WordPress.org

Make WordPress Core

Ticket #28195: 28195.4.patch

File 28195.4.patch, 5.5 KB (added by iseulde, 3 years ago)
  • src/wp-includes/js/mce-view.js

     
    88// Ensure the global `wp` object exists. 
    99window.wp = window.wp || {}; 
    1010 
    11 (function($){ 
     11( function( $ ) { 
    1212        var views = {}, 
    1313                instances = {}, 
    1414                media = wp.media, 
     
    637637        /** 
    638638         * TinyMCE handler for the embed shortcode 
    639639         */ 
    640         wp.mce.views.register( 'embed', { 
    641                 shortcode: 'embed', 
    642                 View: _.extend( {}, wp.media.mixin, { 
    643                         template: media.template( 'editor-embed' ), 
    644                         initialize: function( options ) { 
    645                                 this.players = []; 
    646                                 this.content = options.content; 
    647                                 this.parsed = false; 
    648                                 this.shortcode = options.shortcode; 
    649                                 _.bindAll( this, 'setHtml', 'setNode', 'fetch' ); 
    650                                 $( this ).on( 'ready', this.setNode ); 
    651                         }, 
    652                         unbind: function() { 
    653                                 var self = this; 
    654                                 _.each( this.players, function ( player ) { 
    655                                         player.pause(); 
    656                                         self.removePlayer( player ); 
    657                                 } ); 
    658                                 this.players = []; 
    659                         }, 
    660                         setNode: function ( e, node ) { 
    661                                 this.node = node; 
    662                                 if ( this.parsed ) { 
    663                                         this.parseMediaShortcodes(); 
    664                                 } else { 
    665                                         this.fetch(); 
    666                                 } 
    667                         }, 
    668                         fetch: function () { 
    669                                 wp.ajax.send( 'parse-embed', { 
    670                                         data: { 
    671                                                 post_ID: $( '#post_ID' ).val(), 
    672                                                 content: this.shortcode.string() 
    673                                         } 
    674                                 } ).done( this.setHtml ); 
    675                         }, 
    676                         setHtml: function ( content ) { 
    677                                 this.parsed = content; 
    678                                 $( this.node ).html( this.getHtml() ); 
     640        wp.mce.embedView = _.extend( {}, wp.media.mixin, { 
     641                template: media.template( 'editor-embed' ), 
     642                initialize: function( options ) { 
     643                        this.players = []; 
     644                        this.content = options.content; 
     645                        this.parsed = false; 
     646                        this.original = options.url || options.shortcode.string(); 
     647                        if ( options.url ) { 
     648                                this.shortcode = '[embed]' + options.url + '[/embed]'; 
     649                        } else { 
     650                                this.shortcode = options.shortcode.string(); 
     651                        } 
     652                        _.bindAll( this, 'setHtml', 'setNode', 'fetch' ); 
     653                        $( this ).on( 'ready', this.setNode ); 
     654                }, 
     655                unbind: function() { 
     656                        var self = this; 
     657                        _.each( this.players, function ( player ) { 
     658                                player.pause(); 
     659                                self.removePlayer( player ); 
     660                        } ); 
     661                        this.players = []; 
     662                }, 
     663                setNode: function ( e, node ) { 
     664                        this.node = node; 
     665                        if ( this.parsed ) { 
    679666                                this.parseMediaShortcodes(); 
    680                         }, 
    681                         parseMediaShortcodes: function () { 
    682                                 var self = this; 
    683                                 $( '.wp-audio-shortcode, .wp-video-shortcode', this.node ).each( function ( i, element ) { 
    684                                         self.players.push( new MediaElementPlayer( element, self.mejsSettings ) ); 
    685                                 } ); 
    686                         }, 
    687                         getHtml: function() { 
    688                                 if ( ! this.parsed ) { 
    689                                         return ''; 
     667                        } else { 
     668                                this.fetch(); 
     669                        } 
     670                }, 
     671                fetch: function () { 
     672                        wp.ajax.send( 'parse-embed', { 
     673                                data: { 
     674                                        post_ID: $( '#post_ID' ).val(), 
     675                                        content: this.shortcode 
    690676                                } 
    691                                 return this.template({ content: this.parsed }); 
     677                        } ).done( this.setHtml ); 
     678                }, 
     679                setHtml: function ( content ) { 
     680                        var test = '<a href', 
     681                                dom = tinymce.activeEditor.dom; 
     682 
     683                        this.parsed = content; 
     684 
     685                        if ( content.substring( 0, test.length ) === test ) { 
     686                                dom.replace( dom.create( 'P', null, this.original ), this.node ); 
     687                        } else { 
     688                                $( this.getHtml() ).insertBefore( $( this.node ).find( 'ins' ) ); 
    692689                        } 
    693                 } ), 
     690 
     691                        this.parseMediaShortcodes(); 
     692                }, 
     693                parseMediaShortcodes: function () { 
     694                        var self = this; 
     695                        $( '.wp-audio-shortcode, .wp-video-shortcode', this.node ).each( function ( i, element ) { 
     696                                self.players.push( new MediaElementPlayer( element, self.mejsSettings ) ); 
     697                        } ); 
     698                }, 
     699                getHtml: function() { 
     700                        if ( ! this.parsed ) { 
     701                                return ''; 
     702                        } 
     703                        return this.template( { content: this.parsed } ); 
     704                } 
     705        } ); 
     706 
     707        wp.mce.views.register( 'embed', { 
     708                shortcode: 'embed', 
     709                View: wp.mce.embedView, 
     710                edit: function() {} 
     711        } ); 
     712 
     713        wp.mce.views.register( 'embedURL', { 
     714                shortcode: 'embed', 
     715                toView: function( content ) { 
     716                        var re = /^<p>\s*(https?:\/\/[^\s"]+)\s*<\/p>$/gim, 
     717                                match = re.exec( content ); 
     718 
     719                        if ( ! match ) { 
     720                                return; 
     721                        } 
     722 
     723                        return { 
     724                                index: match.index, 
     725                                content: match[0], 
     726                                options: { 
     727                                        url: match[1] 
     728                                } 
     729                        }; 
     730                }, 
     731                View: wp.mce.embedView, 
    694732                edit: function() {} 
    695733        } ); 
    696734 
  • src/wp-includes/js/tinymce/plugins/wpview/plugin.js

     
    158158        // matching view patterns, and transform the matches into 
    159159        // view wrappers. 
    160160        editor.on( 'BeforeSetContent', function( event ) { 
     161                var node; 
     162 
    161163                if ( ! event.content ) { 
    162164                        return; 
    163165                } 
     
    166168                        wp.mce.views.unbind( editor ); 
    167169                } 
    168170 
    169                 event.content = wp.mce.views.toViews( event.content ); 
    170         }); 
     171                node = editor.selection.getNode(); 
    171172 
    172         editor.on( 'PastePreProcess', function( event ) { 
    173                 if ( event.content.match( /^\s*(https?:\/\/[^\s"]+)\s*$/im ) ) { 
    174                         event.content = '[embed]' + event.content + '[/embed]'; 
     173                // If a url is inserted in an empty paragraph, wrap the url in p tags so it's detected by wp.mce.views. 
     174                if ( node.nodeName === 'P' && editor.dom.isEmpty( node ) && event.content.match( /^\s*(https?:\/\/[^\s"]+)\s*$/im ) ) { 
     175                        event.content = '<p>' + event.content + '</p>'; 
    175176                } 
    176         } ); 
     177 
     178                event.content = wp.mce.views.toViews( event.content ); 
     179        }); 
    177180 
    178181        // When the editor's content has been updated and the DOM has been 
    179182        // processed, render the views in the document.