docs: function ( event ) {
      var code = event.keyCode,
          key = keys[ code ],
          modifiers = '',
          range = this.getSelection();
  
      if ( event.defaultPrevented ) {
          return;
      }
  
      if ( !key ) {
          key = String.fromCharCode( code ).toLowerCase();
          // Only reliable for letters and numbers
          if ( !/^[A-Za-z0-9]$/.test( key ) ) {
              key = '';
          }
      }
  
      // On keypress, delete and '.' both have event.keyCode 46
      // Must check event.which to differentiate.
      if ( isPresto && event.which === 46 ) {
          key = '.';
      }
  
      // Function keys
      if ( 111 < code && code < 124 ) {
          key = 'f' + ( code - 111 );
      }
  
      // We need to apply the backspace/delete handlers regardless of
      // control key modifiers.
      if ( key !== 'backspace' && key !== 'delete' ) {
          if ( event.altKey  ) { modifiers += 'alt-'; }
          if ( event.ctrlKey ) { modifiers += 'ctrl-'; }
          if ( event.metaKey ) { modifiers += 'meta-'; }
      }
      // However, on Windows, shift-delete is apparently "cut" (WTF right?), so
      // we want to let the browser handle shift-delete.
      if ( event.shiftKey ) { modifiers += 'shift-'; }
  
      key = modifiers + key;
  
      if ( this._keyHandlers[ key ] ) {
          this._keyHandlers[ key ]( this, event, range );
      } else if ( key.length === 1 && !range.collapsed ) {
          // Record undo checkpoint.
          this.saveUndoState( range );
          // Delete the selection
          deleteContentsOfRange( range );
          this._ensureBottomLine();
          this.setSelection( range );
          this._updatePath( range, true );
      }
  }