WordPress.org

Make WordPress Core

Ticket #36585: 36585.2.diff

File 36585.2.diff, 5.6 KB (added by jnylen0, 4 years ago)

Existing tests pass, new tests added.

  • tests/qunit/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js

     
    66                return;
    77        }
    88
    9         function mceType(chr) {
    10                 var editor = tinymce.activeEditor, keyCode, charCode, evt, startElm, rng, startContainer, startOffset, textNode;
     9        function mceType( chr, eventType ) {
     10                var editor = tinymce.activeEditor,
     11                        doKeyDown  = ! eventType || /\bkeydown\b/.test( eventType ),
     12                        doKeyPress = ! eventType || /\bkeypress\b/.test( eventType ),
     13                        doKeyUp    = ! eventType || /\bkeyup\b/.test( eventType ),
     14                        keyCode, charCode, evt,
     15                        startElm, rng, startContainer, startOffset,
     16                        textNode;
    1117
    1218                function charCodeToKeyCode(charCode) {
    1319                        var lookup = {
     
    5662                evt = evt || {keyCode: keyCode, charCode: charCode};
    5763
    5864                startElm = editor.selection.getStart();
    59                 fakeEvent(startElm, 'keydown', evt);
    60                 fakeEvent(startElm, 'keypress', evt);
     65                if ( doKeyDown ) {
     66                        fakeEvent(startElm, 'keydown', evt);
     67                }
     68                if ( doKeyPress ) {
     69                        fakeEvent(startElm, 'keypress', evt);
     70                }
    6171
    62                 if (!evt.isDefaultPrevented()) {
     72                if ( ( doKeyDown || doKeyPress ) && ! evt.isDefaultPrevented() ) {
    6373                        if (keyCode === 8) {
    6474                                if (editor.getDoc().selection) {
    6575                                        rng = editor.getDoc().selection.createRange();
     
    109119                        }
    110120                }
    111121
    112                 fakeEvent(startElm, 'keyup', evt);
     122                if ( doKeyUp ) {
     123                        fakeEvent( startElm, 'keyup', evt );
     124                }
    113125        }
    114126
    115127        function type() {
     
    219231                }, assert.async() );
    220232        } );
    221233
    222         QUnit.test( 'Only transform when at the cursor is at the start.', function( assert ) {
     234        QUnit.test( 'Only transform when the cursor is at the start.', function( assert ) {
    223235                editor.setContent( '<p>* test</p>' );
    224236                editor.selection.setCursorLocation( editor.$( 'p' )[0].firstChild, 6 );
    225237
     
    228240                }, assert.async() );
    229241        } );
    230242
     243        QUnit.test( 'Transform when space pressed along with another key. (1)', function( assert ) {
     244                var done = assert.async();
     245
     246                editor.setContent( '<p>*' );
     247                editor.selection.setCursorLocation( editor.$( 'p' )[0].firstChild, 1 );
     248
     249                mceType( ' ', 'keydown,keypress' );
     250                mceType( 'a', 'keydown,keypress' );
     251                mceType( ' ', 'keyup' );
     252                mceType( 'a', 'keyup' );
     253
     254                setTimeout( function() {
     255                        assert.equal( editor.getContent(), '<ul>\n<li>a</li>\n</ul>' );
     256                        assert.equal( editor.selection.getRng().startOffset, 1 );
     257                        done();
     258                } );
     259        } );
     260
     261        QUnit.test( 'Transform when space pressed along with another key. (2)', function( assert ) {
     262                var done = assert.async();
     263
     264                editor.setContent( '<p>*' );
     265                editor.selection.setCursorLocation( editor.$( 'p' )[0].firstChild, 1 );
     266
     267                mceType( ' ', 'keydown,keypress' );
     268                mceType( '0', 'keydown,keypress' );
     269                mceType( '0', 'keyup' );
     270                mceType( ' ', 'keyup' );
     271
     272                setTimeout( function() {
     273                        assert.equal( editor.getContent(), '<ul>\n<li>0</li>\n</ul>' );
     274                        assert.equal( editor.selection.getRng().startOffset, 1 );
     275                        done();
     276                } );
     277        } );
     278
     279        QUnit.test( 'Transform when space pressed along with another key, then backspace to undo.', function( assert ) {
     280                editor.setContent( '<p>*' );
     281                editor.selection.setCursorLocation( editor.$( 'p' )[0].firstChild, 1 );
     282
     283                mceType( ' ', 'keydown,keypress' );
     284                mceType( 'a', 'keydown,keypress' );
     285                mceType( ' ', 'keyup' );
     286                mceType( 'a', 'keyup' );
     287
     288                type( '\b', function() {
     289                        assert.equal( editor.getContent(), '<p>* a</p>' );
     290                        assert.equal( editor.selection.getRng().startOffset, 3 );
     291                }, assert.async() );
     292        } );
     293
    231294        QUnit.test( 'Backspace should undo the transformation.', function( assert ) {
    232295                editor.setContent( '<p>test</p>' );
    233296                editor.selection.setCursorLocation();
  • src/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js

     
    3939
    4040                var canUndo;
    4141                var chars = [];
     42                var isSpacePressed = false;
     43                var keysPressedWithSpace = [];
    4244
    4345                tinymce.each( inlinePatterns, function( pattern ) {
    4446                        tinymce.each( ( pattern.start + pattern.end ).split( '' ), function( c ) {
     
    6264                        if ( event.keyCode === VK.ENTER && ! VK.modifierPressed( event ) ) {
    6365                                enter();
    6466                        }
     67
     68                        if ( event.keyCode === VK.SPACEBAR && ! event.ctrlKey && ! event.metaKey && ! event.altKey ) {
     69                                isSpacePressed = true;
     70                        } else if ( isSpacePressed && event.keyCode > 32 && event.keyCode < 127 ) {
     71                                keysPressedWithSpace.push( event.keyCode );
     72                        }
    6573                }, true );
    6674
    6775                editor.on( 'keyup', function( event ) {
    6876                        if ( event.keyCode === VK.SPACEBAR && ! event.ctrlKey && ! event.metaKey && ! event.altKey ) {
    6977                                space();
     78                                isSpacePressed = false;
     79                                keysPressedWithSpace = [];
    7080                        } else if ( event.keyCode > 47 && ! ( event.keyCode >= 91 && event.keyCode <= 93 ) ) {
    7181                                inline();
    7282                        }
     
    204214                        tinymce.each( spacePatterns, function( pattern ) {
    205215                                var match = text.match( pattern.regExp );
    206216
    207                                 if ( ! match || rng.startOffset !== match[0].length ) {
     217                                if ( ! match || rng.startOffset !== match[0].length + keysPressedWithSpace.length ) {
    208218                                        return;
    209219                                }
    210220
     
    217227                                                parent.appendChild( document.createElement( 'br' ) );
    218228                                        }
    219229
    220                                         editor.selection.setCursorLocation( parent );
     230                                        if ( keysPressedWithSpace.length === 0 ) {
     231                                                editor.selection.setCursorLocation( parent );
     232                                        }
    221233                                        editor.execCommand( pattern.cmd );
    222234                                } );
    223235