Make WordPress Core

Changeset 32678


Ignore:
Timestamp:
06/01/2015 06:08:19 PM (10 years ago)
Author:
azaozz
Message:

TinyMCE wpView: preserve HTML wrapped in shortcodes.
Fixes #32078.

Location:
trunk/src/wp-includes/js
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/js/mce-view.js

    r32258 r32678  
    9494            var pieces = [ { content: content } ],
    9595                self = this,
    96                 instance,
    97                 current;
     96                instance, current;
    9897
    9998            _.each( views, function( view, type ) {
     
    103102                _.each( current, function( piece ) {
    104103                    var remaining = piece.content,
    105                         result;
     104                        result, text;
    106105
    107106                    // Ignore processed pieces, but retain their location.
     
    120119
    121120                        instance = self.createInstance( type, result.content, result.options );
     121                        text = instance.loader ? '.' : instance.text;
    122122
    123123                        // Add the processed piece for the match.
    124124                        pieces.push( {
    125                             content: '<p data-wpview-marker="' + instance.encodedText + '">' + instance.text + '</p>',
     125                            content: '<p data-wpview-marker="' + instance.encodedText + '">' + text + '</p>',
    126126                            processed: true
    127127                        } );
     
    139139            } );
    140140
    141             return _.pluck( pieces, 'content' ).join( '' );
     141            content = _.pluck( pieces, 'content' ).join( '' );
     142            return content.replace( /<p>\s*<p data-wpview-marker=/g, '<p data-wpview-marker=' ).replace( /<\/p>\s*<\/p>/g, '</p>' );
    142143        },
    143144
     
    417418        replaceMarkers: function() {
    418419            this.getMarkers( function( editor, node ) {
    419                 if ( $( node ).text() !== this.text ) {
     420                if ( ! this.loader && $( node ).text() !== this.text ) {
    420421                    editor.dom.setAttrib( node, 'data-wpview-marker', null );
    421422                    return;
  • trunk/src/wp-includes/js/media-audiovideo.js

    r32125 r32678  
    705705            if ( -1 === content.indexOf( attachment.get( 'url' ) ) ) {
    706706                content += [
    707                     '<track srclang="en" label="English"kind="subtitles" src="',
     707                    '<track srclang="en" label="English" kind="subtitles" src="',
    708708                    attachment.get( 'url' ),
    709709                    '" />'
  • trunk/src/wp-includes/js/media/views/frame/video-details.js

    r31935 r32678  
    121121            if ( -1 === content.indexOf( attachment.get( 'url' ) ) ) {
    122122                content += [
    123                     '<track srclang="en" label="English"kind="subtitles" src="',
     123                    '<track srclang="en" label="English" kind="subtitles" src="',
    124124                    attachment.get( 'url' ),
    125125                    '" />'
  • trunk/src/wp-includes/js/tinymce/plugins/wpview/plugin.js

    r32257 r32678  
    153153    }
    154154
    155     // Remove the content of view wrappers from HTML string
    156     function emptyViews( content ) {
    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, '' );
     155    function resetViewsCallback( match, viewText ) {
     156        return '<p>' + window.decodeURIComponent( viewText ) + '</p>';
     157    }
     158
     159    // Replace the view tags with the view string
     160    function resetViews( content ) {
     161        return content.replace( /<div[^>]+data-wpview-text="([^"]+)"[^>]*>(?:[\s\S]+?wpview-selection-after[^>]+>[^<>]*<\/p>\s*|\.)<\/div>/g, resetViewsCallback )
     162            .replace( /<p [^>]*?data-wpview-marker="([^"]+)"[^>]*>[\s\S]*?<\/p>/g, resetViewsCallback );
    162163    }
    163164
     
    165166    editor.on( 'BeforeAddUndo', function( event ) {
    166167        if ( event.level.content ) {
    167             event.level.content = emptyViews( event.level.content );
     168            event.level.content = resetViews( event.level.content );
    168169        }
    169170    });
     
    349350    });
    350351
    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             }
     352    // Empty the wpview wrap and marker nodes
     353    function emptyViewNodes( rootNode ) {
     354        $( 'div[data-wpview-text], p[data-wpview-marker]', rootNode ).each( function( i, node ) {
     355            node.innerHTML = '.';
    360356        });
    361 
    362         // Remove marker attributes
    363         $( 'p[data-wpview-marker]', rootNode ).attr( 'data-wpview-marker', null );
    364     }
    365 
     357    }
     358
     359    // Run that before the DOM cleanup
    366360    editor.on( 'PreProcess', function( event ) {
    367         // Replace the view nodes with their text in the DOM clone.
    368         resetViews( event.node );
     361        emptyViewNodes( event.node );
    369362    }, true );
    370363
    371364    editor.on( 'hide', function() {
    372         // Replace the view nodes with their text directly in the editor body.
    373365        wp.mce.views.unbind();
    374366        deselect();
    375         resetViews( editor.getBody() );
     367        emptyViewNodes();
     368    });
     369
     370    editor.on( 'PostProcess', function( event ) {
     371        if ( event.content ) {
     372            event.content = event.content.replace( /<div [^>]*?data-wpview-text="([^"]+)"[^>]*>[\s\S]*?<\/div>/g, resetViewsCallback )
     373                .replace( /<p [^>]*?data-wpview-marker="([^"]+)"[^>]*>[\s\S]*?<\/p>/g, resetViewsCallback );
     374        }
    376375    });
    377376
Note: See TracChangeset for help on using the changeset viewer.