Ticket #31669: 31669.10.patch
File 31669.10.patch, 7.0 KB (added by , 10 years ago) |
---|
-
src/wp-includes/js/mce-view.js
87 87 * and creates a new instance for every match. 88 88 * 89 89 * @param {String} content The string to scan. 90 * 91 * @return {String} The string with markers. 90 92 */ 91 93 setMarkers: function( content ) { 92 94 var pieces = [ { content: content } ], … … 298 300 /** 299 301 * Renders all view nodes tied to this view instance that are not yet rendered. 300 302 * 303 * @param {String} content The content to render. Optional. 301 304 * @param {Boolean} force Rerender all view nodes tied to this view instance. 302 305 */ 303 render: function( force ) { 306 render: function( content, force ) { 307 if ( content != null ) { 308 this.content = content; 309 } 310 311 content = this.getContent(); 312 304 313 // If there's nothing to render an no loader needs to be shown, stop. 305 if ( ! this.loader && ! this.getContent()) {314 if ( ! this.loader && ! content ) { 306 315 return; 307 316 } 308 317 … … 312 321 // Replace any left over markers. 313 322 this.replaceMarkers(); 314 323 315 if ( this.getContent() ) { 316 this.setContent( this.getContent(), function( editor, node ) { 317 $( node ).data( 'rendered', true ).trigger( 'wp-mce-view-bind' ); 324 if ( content ) { 325 this.setContent( content, function( editor, node ) { 326 $( node ).data( 'rendered', true ); 327 this.bindNode.apply( this, arguments ); 318 328 }, force ? null : false ); 319 329 } else { 320 330 this.setLoader(); … … 322 332 }, 323 333 324 334 /** 335 * Binds a given node after its content is added to the DOM. 336 */ 337 bindNode: function() {}, 338 339 /** 340 * Unbinds a given node before its content is removed from the DOM. 341 */ 342 unbindNode: function() {}, 343 344 /** 325 345 * Unbinds all view nodes tied to this view instance. 326 346 * Runs before their content is removed from the DOM. 327 347 */ 328 348 unbind: function() { 329 349 this.getNodes( function( editor, node ) { 350 this.unbindNode.apply( this, arguments ); 330 351 $( node ).trigger( 'wp-mce-view-unbind' ); 331 352 }, true ); 332 353 }, … … 461 482 * @param {Boolean} rendered Only set for (un)rendered nodes. Optional. 462 483 */ 463 484 setIframes: function( head, body, callback, rendered ) { 464 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; 485 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver, 486 self = this; 465 487 466 488 this.getNodes( function( editor, node, content ) { 467 489 // Seems Firefox needs a bit of time to insert/set the view nodes, … … 582 604 editor.off( 'wp-body-class-change', classChange ); 583 605 } ); 584 606 585 callback && callback.apply( this, arguments );607 callback && callback.apply( self, arguments ); 586 608 }, 50 ); 587 609 }, rendered ); 588 610 }, … … 663 685 * @param {HTMLElement} node The view node to remove. 664 686 */ 665 687 remove: function( editor, node ) { 688 this.unbindNode.call( this, editor, node, $( node ).find( '.wpview-content' ).get( 0 ) ); 666 689 $( node ).trigger( 'wp-mce-view-unbind' ); 667 690 editor.dom.remove( node ); 668 691 } … … 726 749 } 727 750 } ); 728 751 729 self. content =self.template( {752 self.render( self.template( { 730 753 attachments: attachments, 731 754 columns: attrs.columns ? parseInt( attrs.columns, 10 ) : wp.media.galleryDefaults.columns 732 } ); 733 734 self.render(); 755 } ) ); 735 756 } ) 736 757 .fail( function( jqXHR, textStatus ) { 737 758 self.setError( textStatus ); … … 752 773 } ); 753 774 } 754 775 755 wp.ajax.send( this.action, { 756 data: { 757 post_ID: postID, 758 type: this.shortcode.tag, 759 shortcode: this.shortcode.string() 760 } 776 wp.ajax.post( this.action, { 777 post_ID: postID, 778 type: this.shortcode.tag, 779 shortcode: this.shortcode.string() 761 780 } ) 762 781 .done( function( response ) { 763 self.content = response; 764 self.render(); 782 self.render( response ); 765 783 } ) 766 784 .fail( function( response ) { 767 785 if ( self.url ) { -
src/wp-includes/js/tinymce/plugins/wpview/plugin.js
4 4 * WordPress View plugin. 5 5 */ 6 6 tinymce.PluginManager.add( 'wpview', function( editor ) { 7 var selected, 7 var $ = editor.$, 8 selected, 8 9 Env = tinymce.Env, 9 10 VK = tinymce.util.VK, 10 11 TreeWalker = tinymce.dom.TreeWalker, … … 153 154 154 155 // Remove the content of view wrappers from HTML string 155 156 function emptyViews( content ) { 156 return content.replace(/<div[^>]+data-wpview-text=\"([^"]+)"[^>]*>[\s\S]+?wpview-selection-after[^>]+>(?: |\u00a0)*<\/p><\/div>/g, '$1' ); 157 function callback() { 158 return '<p>' + decodeURIComponent( arguments[1] ) + '</p>'; 159 } 160 161 content = content.replace( /<div[^>]+data-wpview-text="([^"]+)"[^>]*>[\s\S]+?wpview-selection-after[^>]+>[^<]+<\/p><\/div>/g, callback ); 162 content = content.replace( /<p[^>]+data-wpview-marker="([^"]+)"[^>]*>[^<]+<\/p>/g, callback ); 163 164 return content; 157 165 } 158 166 159 167 // Prevent adding undo levels on changes inside a view wrapper 160 168 editor.on( 'BeforeAddUndo', function( event ) { 161 if ( event.l astLevel && emptyViews( event.level.content ) === emptyViews( event.lastLevel.content )) {162 event. preventDefault();169 if ( event.level.content ) { 170 event.level.content = emptyViews( event.level.content ); 163 171 } 164 172 }); 165 173 … … 169 177 editor.on( 'BeforeSetContent', function( event ) { 170 178 var node; 171 179 180 if ( ! event.selection ) { 181 wp.mce.views.unbind(); 182 } 183 172 184 if ( ! event.content ) { 173 185 return; 174 186 } … … 335 347 } 336 348 }); 337 349 338 editor.on( 'PreProcess', function( event ) { 339 // Empty the wpview wrap nodes 340 tinymce.each( editor.dom.select( 'div[data-wpview-text]', event.node ), function( node ) { 341 node.textContent = node.innerText = '\u00a0'; 342 }); 343 }); 350 function resetViews( context ) { 351 tinymce.each( [ 352 'data-wpview-text', 353 'data-wpview-marker' 354 ], function( attr ) { 355 $( '[' + attr + ']', context ).each( function() { 356 var $this = $( this ); 357 358 $this.replaceWith( 359 $( document.createElement( 'P' ) ).text( 360 decodeURIComponent( $this.attr( attr ) ) 361 ) 362 ); 363 } ); 364 } ); 365 } 344 366 345 editor.on( 'PostProcess', function( event ) {346 if ( event.content ) {347 event.content = event.content.replace( /<div [^>]*?data-wpview-text="([^"]*)"[^>]*>[\s\S]*?<\/div>/g, function( match, shortcode ) {348 if ( shortcode ) { 349 return '<p>' + window.decodeURIComponent( shortcode ) + '</p>'; 350 }351 return ''; // If error, remove the view wrapper352 });353 }367 editor.on( 'PreProcess', function( event ) { 368 // Replace the view nodes with their text in the DOM clone. 369 resetViews( event.node ); 370 }, true ); 371 372 editor.on( 'hide', function() { 373 // Replace the view nodes with their text directly in the editor body. 374 wp.mce.views.unbind(); 375 resetViews(); 354 376 }); 355 377 356 378 // Excludes arrow keys, delete, backspace, enter, space bar.