WordPress.org

Make WordPress Core

Ticket #33300: 33300.5.patch

File 33300.5.patch, 4.4 KB (added by iseulde, 5 years ago)
  • src/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js

     
    2626                        { start: '#####', format: 'h5' },
    2727                        { start: '######', format: 'h6' },
    2828                        { start: '>', format: 'blockquote' },
    29                         { regExp: /^\s*(?:(?:\* ?){3,}|(?:_ ?){3,}|(?:- ?){3,})\s*$/, element: 'hr' }
     29                        { regExp: /^\s*(?:(?:\* ?){3,}|(?:_ ?){3,}|(?:- ?){3,})\s*$/, element: 'hr' },
     30                        { regExp: /^`{3,}$/, format: 'pre' }
    3031                ];
    3132
    3233                var inlinePatterns = [
     
    6061                        }
    6162
    6263                        if ( event.keyCode === VK.ENTER && ! VK.modifierPressed( event ) ) {
    63                                 enter();
     64                                enter( event );
    6465                        }
    6566                }, true );
    6667
     
    230231                        } );
    231232                }
    232233
    233                 function enter() {
     234                function enter( event ) {
    234235                        var rng = editor.selection.getRng(),
    235236                                start = rng.startContainer,
     237                                offset = rng.startOffset,
    236238                                node = firstTextNode( start ),
    237239                                i = enterPatterns.length,
    238                                 text, pattern, parent;
     240                                text, pattern, parent, match;
    239241
    240242                        if ( ! node ) {
    241243                                return;
     
    250252                                                break;
    251253                                        }
    252254                                } else if ( enterPatterns[ i ].regExp ) {
    253                                         if ( enterPatterns[ i ].regExp.test( text ) ) {
     255                                        if ( match = text.match( enterPatterns[ i ].regExp ) ) {
    254256                                                pattern = enterPatterns[ i ];
    255257                                                break;
    256258                                        }
     
    265267                                return;
    266268                        }
    267269
    268                         editor.once( 'keyup', function() {
     270                        if ( match && pattern.format ) {
    269271                                editor.undoManager.add();
    270272
    271273                                editor.undoManager.transact( function() {
    272                                         if ( pattern.format ) {
    273                                                 editor.formatter.apply( pattern.format, {}, node );
    274                                                 node.replaceData( 0, node.data.length, ltrim( node.data.slice( pattern.start.length ) ) );
    275                                         } else if ( pattern.element ) {
    276                                                 parent = node.parentNode && node.parentNode.parentNode;
     274                                        editor.formatter.apply( pattern.format );
    277275
    278                                                 if ( parent ) {
    279                                                         parent.replaceChild( document.createElement( pattern.element ), node.parentNode );
    280                                                 }
     276                                        parent = node.parentNode;
     277
     278                                        node.deleteData( 0, match[0].length );
     279
     280                                        if ( ! parent.innerHTML ) {
     281                                                parent.appendChild( document.createElement( 'br' ) );
    281282                                        }
     283
     284                                        editor.selection.setCursorLocation( parent );
    282285                                } );
    283286
    284287                                // We need to wait for native events to be triggered.
    285288                                setTimeout( function() {
    286289                                        canUndo = 'enter';
    287290                                } );
    288                         } );
     291
     292                                event.preventDefault();
     293                                event.stopImmediatePropagation();
     294                        } else {
     295                                editor.once( 'keyup', function() {
     296                                        editor.undoManager.add();
     297
     298                                        editor.undoManager.transact( function() {
     299                                                if ( pattern.format ) {
     300                                                        editor.formatter.apply( pattern.format, {}, node );
     301
     302                                                        if ( pattern.start ) {
     303                                                                node.replaceData( 0, node.data.length, ltrim( node.data.slice( pattern.start.length ) ) );
     304                                                        }
     305                                                } else if ( pattern.element ) {
     306                                                        parent = node.parentNode && node.parentNode.parentNode;
     307
     308                                                        if ( parent ) {
     309                                                                parent.replaceChild( document.createElement( pattern.element ), node.parentNode );
     310                                                        }
     311                                                }
     312                                        } );
     313
     314                                        // We need to wait for native events to be triggered.
     315                                        setTimeout( function() {
     316                                                canUndo = 'enter';
     317                                        } );
     318                                } );
     319                        }
    289320                }
    290321
    291322                function ltrim( text ) {
  • tests/qunit/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js

     
    311311                }, assert.async() );
    312312        } );
    313313
    314         QUnit.test( 'Horizontal Rule', function( assert ) {
     314        QUnit.test( 'Horizontal Rule.', function( assert ) {
    315315                type( '   ---   \n', function() {
    316316                        assert.equal( editor.getContent(), '<hr />\n<p>&nbsp;</p>' );
    317317                }, assert.async() );
    318318        } );
     319
     320        QUnit.test( 'Code block.', function( assert ) {
     321                type( '```\ntest', function() {
     322                        assert.equal( editor.getContent(), '<pre>test</pre>' );
     323                }, assert.async() );
     324        } );
     325
     326        QUnit.test( 'Code block with text.', function( assert ) {
     327                editor.setContent( '<p>test</p>' );
     328                editor.selection.setCursorLocation();
     329
     330                type( '```\n', function() {
     331                        assert.equal( editor.getContent(), '<pre>test</pre>' );
     332                }, assert.async() );
     333        } );
    319334} )( window.jQuery, window.QUnit, window.tinymce, window.setTimeout );