diff --git a/src/wp-includes/js/mce-view.js b/src/wp-includes/js/mce-view.js
index 9817454..1c939ec 100644
|
a
|
b
|
window.wp = window.wp || {}; |
| 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 } ], |
| … |
… |
window.wp = window.wp || {}; |
| 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 | |
| … |
… |
window.wp = window.wp || {}; |
| 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(); |
| … |
… |
window.wp = window.wp || {}; |
| 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 | }, |
| … |
… |
window.wp = window.wp || {}; |
| 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 | |
| | 486 | var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver, |
| | 487 | self = this; |
| 465 | 488 | |
| 466 | 489 | this.getNodes( function( editor, node, content ) { |
| 467 | | // Seems Firefox needs a bit of time to insert/set the view nodes, |
| 468 | | // or the iframe will fail especially when switching Text => Visual. |
| 469 | | setTimeout( function() { |
| 470 | | var dom = editor.dom, |
| 471 | | styles = '', |
| 472 | | bodyClasses = editor.getBody().className || '', |
| 473 | | iframe, iframeDoc, observer, i; |
| 474 | | |
| 475 | | tinymce.each( dom.$( |
| 476 | | 'link[rel="stylesheet"]', |
| 477 | | editor.getDoc().getElementsByTagName( 'head' )[0] |
| 478 | | ), function( link ) { |
| 479 | | if ( |
| 480 | | link.href && |
| 481 | | link.href.indexOf( 'skins/lightgray/content.min.css' ) === -1 && |
| 482 | | link.href.indexOf( 'skins/wordpress/wp-content.css' ) === -1 |
| 483 | | ) { |
| 484 | | styles += dom.getOuterHTML( link ); |
| 485 | | } |
| 486 | | } ); |
| 487 | 490 | |
| 488 | | content.innerHTML = ''; |
| | 491 | console.log( head ); |
| | 492 | |
| | 493 | var dom = editor.dom, |
| | 494 | styles = '', |
| | 495 | bodyClasses = editor.getBody().className || '', |
| | 496 | iframe, iframeDoc, observer, i; |
| | 497 | |
| | 498 | if ( ! head ) { |
| | 499 | head = editor.getDoc().getElementsByTagName( 'head' )[0].innerHTML |
| | 500 | } |
| | 501 | |
| | 502 | tinymce.each( dom.$( 'link[rel="stylesheet"]', head ), function( link ) { |
| | 503 | if ( link.href && link.href.indexOf( 'skins/lightgray/content.min.css' ) === -1 && |
| | 504 | link.href.indexOf( 'skins/wordpress/wp-content.css' ) === -1 ) { |
| | 505 | |
| | 506 | styles += dom.getOuterHTML( link ); |
| | 507 | } |
| | 508 | } ); |
| 489 | 509 | |
| | 510 | content.innerHTML = ''; |
| | 511 | |
| | 512 | // Seems the browsers need a bit of time to insert/set the view nodes, |
| | 513 | // or the iframe will fail especially when switching Text => Visual. |
| | 514 | setTimeout( function() { |
| 490 | 515 | iframe = dom.add( content, 'iframe', { |
| 491 | 516 | /* jshint scripturl: true */ |
| 492 | 517 | src: tinymce.Env.ie ? 'javascript:""' : '', |
| … |
… |
window.wp = window.wp || {}; |
| 582 | 607 | editor.off( 'wp-body-class-change', classChange ); |
| 583 | 608 | } ); |
| 584 | 609 | |
| 585 | | callback && callback.apply( this, arguments ); |
| | 610 | callback && callback.apply( self, arguments ); |
| 586 | 611 | }, 50 ); |
| 587 | 612 | }, rendered ); |
| 588 | 613 | }, |
| … |
… |
window.wp = window.wp || {}; |
| 663 | 688 | * @param {HTMLElement} node The view node to remove. |
| 664 | 689 | */ |
| 665 | 690 | remove: function( editor, node ) { |
| | 691 | this.unbindNode.call( this, editor, node, $( node ).find( '.wpview-content' ).get( 0 ) ); |
| 666 | 692 | $( node ).trigger( 'wp-mce-view-unbind' ); |
| 667 | 693 | editor.dom.remove( node ); |
| 668 | 694 | } |
| … |
… |
window.wp = window.wp || {}; |
| 726 | 752 | } |
| 727 | 753 | } ); |
| 728 | 754 | |
| 729 | | self.content = self.template( { |
| | 755 | self.render( self.template( { |
| 730 | 756 | attachments: attachments, |
| 731 | 757 | columns: attrs.columns ? parseInt( attrs.columns, 10 ) : wp.media.galleryDefaults.columns |
| 732 | | } ); |
| 733 | | |
| 734 | | self.render(); |
| | 758 | } ) ); |
| 735 | 759 | } ) |
| 736 | 760 | .fail( function( jqXHR, textStatus ) { |
| 737 | 761 | self.setError( textStatus ); |
| … |
… |
window.wp = window.wp || {}; |
| 752 | 776 | } ); |
| 753 | 777 | } |
| 754 | 778 | |
| 755 | | wp.ajax.send( this.action, { |
| 756 | | data: { |
| 757 | | post_ID: postID, |
| 758 | | type: this.shortcode.tag, |
| 759 | | shortcode: this.shortcode.string() |
| 760 | | } |
| | 779 | wp.ajax.post( this.action, { |
| | 780 | post_ID: postID, |
| | 781 | type: this.shortcode.tag, |
| | 782 | shortcode: this.shortcode.string() |
| 761 | 783 | } ) |
| 762 | 784 | .done( function( response ) { |
| 763 | | self.content = response; |
| 764 | | self.render(); |
| | 785 | self.render( response ); |
| 765 | 786 | } ) |
| 766 | 787 | .fail( function( response ) { |
| 767 | 788 | if ( self.url ) { |
diff --git a/src/wp-includes/js/tinymce/plugins/wpview/plugin.js b/src/wp-includes/js/tinymce/plugins/wpview/plugin.js
index 9a8b650..657317e 100644
|
a
|
b
|
|
| 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, |
| … |
… |
tinymce.PluginManager.add( 'wpview', function( editor ) { |
| 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 | content = content.replace( /<div[^>]+data-wpview-text="([^"]+)"[^>]*>[\s\S]+?wpview-selection-after[^>]+>[^<>]*<\/p>\s*<\/div>/g, function( all, match ) { |
| | 158 | return '<p>' + window.decodeURIComponent( match ) + '</p>'; |
| | 159 | }); |
| | 160 | |
| | 161 | return content.replace( / data-wpview-marker="[^"]+"/g, '' ); |
| 157 | 162 | } |
| 158 | 163 | |
| 159 | 164 | // Prevent adding undo levels on changes inside a view wrapper |
| 160 | 165 | editor.on( 'BeforeAddUndo', function( event ) { |
| 161 | | if ( event.lastLevel && emptyViews( event.level.content ) === emptyViews( event.lastLevel.content ) ) { |
| 162 | | event.preventDefault(); |
| | 166 | if ( event.level.content ) { |
| | 167 | event.level.content = emptyViews( event.level.content ); |
| 163 | 168 | } |
| 164 | 169 | }); |
| 165 | 170 | |
| … |
… |
tinymce.PluginManager.add( 'wpview', function( editor ) { |
| 169 | 174 | editor.on( 'BeforeSetContent', function( event ) { |
| 170 | 175 | var node; |
| 171 | 176 | |
| | 177 | if ( ! event.selection ) { |
| | 178 | wp.mce.views.unbind(); |
| | 179 | } |
| | 180 | |
| 172 | 181 | if ( ! event.content ) { |
| 173 | 182 | return; |
| 174 | 183 | } |
| … |
… |
tinymce.PluginManager.add( 'wpview', function( editor ) { |
| 339 | 348 | } |
| 340 | 349 | }); |
| 341 | 350 | |
| 342 | | editor.on( 'PreProcess', function( event ) { |
| 343 | | // Empty the wpview wrap nodes |
| 344 | | tinymce.each( editor.dom.select( 'div[data-wpview-text]', event.node ), function( node ) { |
| 345 | | node.textContent = node.innerText = '\u00a0'; |
| | 351 | function resetViews( rootNode ) { |
| | 352 | // Replace view nodes |
| | 353 | $( 'div[data-wpview-text]', rootNode ).each( function( i, node ) { |
| | 354 | var $node = $( node ), |
| | 355 | text = window.decodeURIComponent( $node.attr( 'data-wpview-text' ) || '' ); |
| | 356 | |
| | 357 | if ( text && node.parentNode ) { |
| | 358 | $node.replaceWith( $( editor.dom.create('p') ).text( text ) ); |
| | 359 | } |
| 346 | 360 | }); |
| 347 | | }); |
| 348 | 361 | |
| 349 | | editor.on( 'PostProcess', function( event ) { |
| 350 | | if ( event.content ) { |
| 351 | | event.content = event.content.replace( /<div [^>]*?data-wpview-text="([^"]*)"[^>]*>[\s\S]*?<\/div>/g, function( match, shortcode ) { |
| 352 | | if ( shortcode ) { |
| 353 | | return '<p>' + window.decodeURIComponent( shortcode ) + '</p>'; |
| 354 | | } |
| 355 | | return ''; // If error, remove the view wrapper |
| 356 | | }); |
| 357 | | } |
| | 362 | // Remove marker attributes |
| | 363 | $( 'p[data-wpview-marker]', rootNode ).attr( 'data-wpview-marker', null ); |
| | 364 | } |
| | 365 | |
| | 366 | editor.on( 'PreProcess', function( event ) { |
| | 367 | // Replace the view nodes with their text in the DOM clone. |
| | 368 | resetViews( event.node ); |
| | 369 | }, true ); |
| | 370 | |
| | 371 | editor.on( 'hide', function() { |
| | 372 | // Replace the view nodes with their text directly in the editor body. |
| | 373 | wp.mce.views.unbind(); |
| | 374 | resetViews( editor.getBody() ); |
| 358 | 375 | }); |
| 359 | 376 | |
| 360 | 377 | // Excludes arrow keys, delete, backspace, enter, space bar. |