Make WordPress Core

Ticket #37091: 37091.patch

File 37091.patch, 4.7 KB (added by iseulde, 8 years ago)
  • src/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js

     
    3535
    3636                var inlinePatterns = [
    3737                        { start: '`', end: '`', format: 'code' }
     38                        // { regExp: /(?:^|\s):-?\)/, text: '\ud83d\ude42' },
     39                        // { regExp: /(?:^|\s)<3/, text: '\u2764\ufe0f' }
    3840                ];
    3941
     42                var smilies = {
     43                        ':)': '\ud83d\ude42'
     44                };
     45
    4046                var canUndo;
    4147                var chars = [];
    4248
     
    4854                        } );
    4955                } );
    5056
     57                tinymce.each( smilies, function( value, key ) {
     58                        var c = key.slice( -1 );
     59
     60                        if ( tinymce.inArray( chars, c ) === -1 ) {
     61                                chars.push( c );
     62                        }
     63                } );
     64
    5165                editor.on( 'selectionchange', function() {
    5266                        canUndo = null;
    5367                } );
     
    7589                        var rng = editor.selection.getRng();
    7690                        var node = rng.startContainer;
    7791                        var offset = rng.startOffset;
     92                        var findStart;
    7893                        var startOffset;
    7994                        var endOffset;
    8095                        var pattern;
     
    85100                                return;
    86101                        }
    87102
     103                        // Fast check for matching characters.
    88104                        if ( tinymce.inArray( chars, node.data.charAt( offset - 1 ) ) === -1 ) {
    89105                                return;
    90106                        }
    91107
    92                         function findStart( node ) {
     108                        findStart = function( node ) {
    93109                                var i = inlinePatterns.length;
    94110                                var offset;
    95111
     
    101117                                                return offset;
    102118                                        }
    103119                                }
    104                         }
     120                        };
    105121
    106122                        startOffset = findStart( node );
    107                         endOffset = node.data.lastIndexOf( pattern.end );
    108123
    109                         if ( startOffset === endOffset || endOffset === -1 ) {
    110                                 return;
    111                         }
    112 
    113                         if ( endOffset - startOffset <= pattern.start.length ) {
    114                                 return;
    115                         }
     124                        if ( startOffset ) {
     125                                endOffset = node.data.lastIndexOf( pattern.end );
    116126
    117                         if ( node.data.slice( startOffset + pattern.start.length, endOffset ).indexOf( pattern.start.slice( 0, 1 ) ) !== -1 ) {
    118                                 return;
    119                         }
    120 
    121                         format = editor.formatter.get( pattern.format );
     127                                if ( startOffset === endOffset || endOffset === -1 ) {
     128                                        return;
     129                                }
    122130
    123                         if ( format && format[0].inline ) {
    124                                 editor.undoManager.add();
     131                                if ( endOffset - startOffset <= pattern.start.length ) {
     132                                        return;
     133                                }
    125134
    126                                 editor.undoManager.transact( function() {
    127                                         node.insertData( offset, '\u200b' );
     135                                if ( node.data.slice( startOffset + pattern.start.length, endOffset ).indexOf( pattern.start.slice( 0, 1 ) ) !== -1 ) {
     136                                        return;
     137                                }
    128138
    129                                         node = node.splitText( startOffset );
    130                                         zero = node.splitText( offset - startOffset );
     139                                format = editor.formatter.get( pattern.format );
    131140
    132                                         node.deleteData( 0, pattern.start.length );
    133                                         node.deleteData( node.data.length - pattern.end.length, pattern.end.length );
     141                                if ( format && format[0].inline ) {
     142                                        editor.undoManager.add();
    134143
    135                                         editor.formatter.apply( pattern.format, {}, node );
     144                                        editor.undoManager.transact( function() {
     145                                                node.insertData( offset, '\u200b' );
    136146
    137                                         editor.selection.setCursorLocation( zero, 1 );
    138                                 } );
     147                                                node = node.splitText( startOffset );
     148                                                zero = node.splitText( offset - startOffset );
    139149
    140                                 // We need to wait for native events to be triggered.
    141                                 setTimeout( function() {
    142                                         canUndo = 'space';
     150                                                node.deleteData( 0, pattern.start.length );
     151                                                node.deleteData( node.data.length - pattern.end.length, pattern.end.length );
    143152
    144                                         editor.once( 'selectionchange', function() {
    145                                                 var offset;
     153                                                editor.formatter.apply( pattern.format, {}, node );
    146154
    147                                                 if ( zero ) {
    148                                                         offset = zero.data.indexOf( '\u200b' );
     155                                                editor.selection.setCursorLocation( zero, 1 );
     156                                        } );
    149157
    150                                                         if ( offset !== -1 ) {
    151                                                                 zero.deleteData( offset, offset + 1 );
     158                                        // We need to wait for native events to be triggered.
     159                                        setTimeout( function() {
     160                                                canUndo = 'space';
     161
     162                                                editor.once( 'selectionchange', function() {
     163                                                        var offset;
     164
     165                                                        if ( zero ) {
     166                                                                offset = zero.data.indexOf( '\u200b' );
     167
     168                                                                if ( offset !== -1 ) {
     169                                                                        zero.deleteData( offset, offset + 1 );
     170                                                                }
    152171                                                        }
    153                                                 }
     172                                                } );
    154173                                        } );
    155                                 } );
     174                                }
    156175                        }
     176
     177                        findStart = function( node ) {
     178                                var key;
     179                                var offset;
     180
     181                                for ( key in smilies ) {
     182                                        offset = node.data.lastIndexOf( ' ' + key );
     183
     184                                        if ( offset !== -1 ) {
     185                                                editor.undoManager.add();
     186
     187                                                editor.undoManager.transact( function() {
     188                                                        node.replaceData( offset + 1, key.length, smilies[ key ] );
     189
     190                                                        editor.selection.setCursorLocation( node, offset + 3 );
     191                                                } );
     192
     193                                                // We need to wait for native events to be triggered.
     194                                                setTimeout( function() {
     195                                                        canUndo = 'space';
     196                                                } );
     197                                        }
     198                                }
     199                        };
     200
     201                        findStart( node );
    157202                }
    158203
    159204                function firstTextNode( node ) {